1. ホーム
  2. c#

[解決済み] System.Data.dll で 'System.Data.SqlClient.SqlException' 型の例外が発生しました。

2022-02-28 21:15:50

質問

以下のコードを実行すると、このようなエラーメッセージが表示されます。

<ブロッククオート

"タイプ 'System.Data.SqlClient.SqlException' の例外が次の場所で発生しました。 System.Data.dllは、ユーザーコードで処理されませんでした。

追加情報です。'='付近の構文が正しくありません "。

そして、これがそのコードです。

string position;

SqlConnection con = new SqlConnection("server=free-pc\\FATMAH; Integrated Security=True; database=Workflow; ");
con.Open();
SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID=" + id.Text, con);

SqlDataReader Read = cmd.ExecuteReader();

if (Read.Read()==true)
{
    position = Read[0].ToString();
    Response.Write("User Registration successful");
}
else
{
    Console.WriteLine("No Employee found.");
}

Read.Close(); 

何が原因で、どうすれば解決するのでしょうか?

解決方法は?

あなたのコードには、いくつかの問題があります。まず、パラメトリッククエリを使用することをお勧めします。そうすれば、SQLインジェクション攻撃を避けることができますし、パラメータのタイプもフレームワークによって検出されます。

var cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID = @id", con);
cmd.Parameters.AddWithValue("@id", id.Text);

次に、クエリから返される1つの値だけに興味があるのであれば、次のようにします。 ExecuteScalar :

var name = cmd.ExecuteScalar();

if (name != null)
{
   position = name.ToString();
   Response.Write("User Registration successful");
}
else
{
    Console.WriteLine("No Employee found.");
}

最後に SqlConnectionSqlCommandusing そのため、それらによって使用されたリソースはすべて廃棄されます。

string position;

using (SqlConnection con = new SqlConnection("server=free-pc\\FATMAH; Integrated Security=True; database=Workflow; "))
{
  con.Open();

  using (var cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID = @id", con))
  {
    cmd.Parameters.AddWithValue("@id", id.Text);
  
    var name = cmd.ExecuteScalar();
  
    if (name != null)
    {
       position = name.ToString();
       Response.Write("User Registration successful");
    }
    else
    {
        Console.WriteLine("No Employee found.");
    }
  }
}