C#中的简单数据库连接错误

时间:2014-02-22 13:19:54

标签: c#

我收到以下错误消息:

invalidOperationException was unhandled

在以下代码中:

private void btnInsert_Click(object sender, EventArgs e)
{
    SqlConnection conn = new SqlConnection("Data Source=DASTGIRKHAN\\SQLEXPRESS;Initial Catalog=DBProject;Integrated    Security=True;Pooling=False");
    conn.Open();
    SqlCommand cmd = new SqlCommand("Insert INTO EmployeeRecord Values(" + tfCode.Text   + ",'" + tfName.Text + "','" + tfCell.Text + "','" + tfAdrs + "',)");
    cmd.BeginExecuteNonQuery();
    cmd.ExecuteNonQuery();
    conn.Close();
    MessageBox.Show("Inserted Successfully");
}

5 个答案:

答案 0 :(得分:1)

调用InvalidOperationException方法(msdn)并且未在连接字符串中指定“异步处理=真”时抛出

BeginExecuteNonQuery异常。

您还应该设置与命令的连接:

SqlCommand cmd = new SqlCommand("Insert INTO EmployeeRecord Values(" + tfCode.Text   + ",'" + tfName.Text + "','" + tfCell.Text + "','" + tfAdrs + "')", conn);

InvalidOperationException

  

未包含名称/值对“Asynchronous Processing = true”   在定义连接的连接字符串中   SqlCommand的。流式传输期间SqlConnection关闭或丢弃   操作。

答案 1 :(得分:1)

抱歉,您的代码有很多错误。让我展示一种不同的方法

private void btnInsert_Click(object sender, EventArgs e)
{
    string cnString = @"Data Source=DASTGIRKHAN\\SQLEXPRESS;
                        Initial Catalog=DBProject;
                        Integrated Security=True;";
    string cmdText = @"Insert INTO EmployeeRecord 
                       Values(@code,@fname,@cell,@adr)";
    using(SqlConnection conn = new SqlConnection(cnString))
    using(SqlCommand cmd = new SqlCommand(cmdText, conn))
    {
         conn.Open();
         cmd.Parameters.AddWithValue("@code", Convert.ToInt32(tfCode.Text));
         cmd.Parameters.AddWithValue("@fname", tfName.Text );
         cmd.Parameters.AddWithValue("@cell", tfCell.Text  );
         cmd.Parameters.AddWithValue("@adr", tfAdrs.Text);
         int rowsInserted = cmd.ExecuteNonQuery();
         if(rowInserted > 0) 
              MessageBox.Show("Inserted Successfully");
         else
              MessageBox.Show("Insert failes");
    }
}

kmatyaszek的回答说明了错误的主要原因,但这只是冰山一角。

您应该始终在一次性物体周围使用using statement,例如连接。这将确保在异常情况下关闭和处理连接。

您应该使用参数化查询来创建命令以避免Sql Injection和解析问题。例如,tfName文本框中的单引号可能会导致语法错误。

BeginExecuteNonQuery的来电,不包括对ExecuteNonQuery的来电,需要致电EndExecuteNonQuery

最后,ExecuteNonQuery的结果会告诉您插入是否成功。

最后一点,我已从连接字符串中删除Pooling=False 你没有说什么为什么要避免他非常有用的优化。

答案 2 :(得分:0)

我打印那个SQL文本。看起来对我来说是一个不平衡的撇号。

更好的是,使用为您绑定参数的.NET类。更容易和更好的SQL注入投影。

答案 3 :(得分:0)

什么是 tfCode,tfName,tfCell,tfAdrs ?我假设他们是文本框控件? 如果是这样,您使用 tfAdrs 而不是 tfAdrs.Text

还为命令分配连接字符串并删除
中的其他空格 “综合安全”

答案 4 :(得分:0)

为什么让自己变得复杂,使用Parameterized Insert而不是连接,它容易出现SQL注入。

SqlCommand command1 = new SqlCommand("INSERT INTO EmployeeRecord VALUES(@tfCode, @tfName, @tfCell, @tfAdrs)", conn);

command1.Parameters.AddWithValue("@tfCode", trCode);
command1.Parameters.AddWithValue("@tfName", tfName);
command1.Parameters.AddWithValue("@tfCell", tfCell);
command1.Parameters.AddWithValue("@tfAdrs", tfAdrs);