web-dev-qa-db-ja.com

System.Data.dllで「System.Data.SqlClient.SqlException」タイプの例外が発生しました

私はc#の初心者です。コードを実行すると、このエラーメッセージが表示されます>>

「タイプ '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(); 
6
F 505

コードにいくつかの問題があります。最初に、パラメーター化されたクエリを使用して、SQLインジェクション攻撃を回避し、パラメータータイプがフレームワークによって検出されるようにすることをお勧めします。

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

次に、クエリから返される1つの値のみに関心があるため、ExecuteScalar[〜#〜] msdn [〜#〜] を使用することをお勧めします。

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.");
    }
  }
}
12
gzaxx

EmpID列はstringであり、' 'あなたの値。

なぜならEmpID=" + id.Text、コマンドはEmpID = 12345 の代わりに EmpID = '12345'

SqlCommandを変更します

SqlCommand cmd = new SqlCommand("SELECT EmpName FROM Employee WHERE EmpID='" + id.Text +"'", con);

または、より良い方法として、常に parameterized queries 。この種類の文字列連結は、 SQL Injection 攻撃。

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

EmpID列は従業員IDを保持しているため、文字ではなく数値型である必要があります。

6
Soner Gönül

これを試して

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

try-catchを使用して、実際に発生したエラーを確認します

 try
{
  //Your insert code here
}
catch (System.Data.SqlClient.SqlException sqlException)
{
  System.Windows.Forms.MessageBox.Show(sqlException.Message);
}
0

System.Data.dllで「System.Data.SqlClient.SqlException」タイプの未処理の例外が発生しました

    private const string strconneciton = "Data Source=.;Initial Catalog=Employees;Integrated Security=True";
    SqlConnection con = new SqlConnection(strconneciton);

    private void button1_Click(object sender, EventArgs e)
    {

        con.Open();
        SqlCommand cmd = new SqlCommand("insert into EmployeeData (Name,S/O,Address,Phone,CellNo,CNICNO,LicenseNo,LicenseDistrict,LicenseValidPhoto,ReferenceName,ReferenceContactNo) values ( '" + textName.Text + "','" + textSO.Text + "','" + textAddress.Text + "','" + textPhone.Text + "','" + textCell.Text + "','" + textCNIC.Text + "','" + textLicenseNo.Text + "','" + textLicenseDistrict.Text + "','" + textLicensePhoto.Text + "','" + textReferenceName.Text + "','" + textContact.Text + "' )", con);
        cmd.ExecuteNonQuery();
        con.Close();
    }
0
saba