我收到以下错误消息:
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");
}
答案 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);