C# SQL查询 - ExecuteNonQuery: 连接属性未初始化

4

我有许多代码块在我的Windows应用程序中,它们使用相同的结构来执行查询。在我的代码中添加了一些新内容后,由于出现错误:

"ExecuteNonQuery: Connection property has not been initialized"

所有的代码块都是这个样子的:

sc.Open();
cmd = new SqlCommand("UPDATE bin SET serialNumber=" + tb_computername.Text + " WHERE binNumber=" + binNumber);
cmd.ExecuteNonQuery();
sc.Close();
break;

新代码实现了以下功能:
//Find Open BIN
int binNumber = 0;
int binIndex = 0;
string queryString = "SELECT * FROM bin";
SqlDataAdapter adapter = new SqlDataAdapter(queryString, scb);
DataSet binNumbers = new DataSet();
adapter.Fill(binNumbers, "bin");
for (int i = 0; i < 150; i++)
{
    binNumber++;                    
    if(binNumbers.Tables["bin"].Rows[binIndex]["serialNumber"].ToString() == "")
{
sc.Open();
cmd = new SqlCommand("UPDATE bin SET serialNumber=" + tb_computername.Text + " WHERE binNumber=" + binNumber);
cmd.ExecuteNonQuery();
sc.Close();
break;
}
binIndex++;

这些连接的定义位于类顶部。

我没有看到你实际创建连接的任何地方。 - PiousVenom
这怎么可能会起作用?你从未创建过连接(字符串)。 - Daniel Abou Chleih
1
这通常意味着您尚未实例化连接对象。请问能看到声明吗? - Steven Wood
2个回答

3
你需要为它分配一个 SqlConnection 对象。
 cmd.Connection = connection;

在这里,connection 是一个带有连接字符串等信息的 SqlConnection 对象。

此外,为了良好的编程习惯,您应该将其放入 using 语句块中:

 using (SqlConnection connection = new SqlConnection("ConnectionString")) { 
     cmd.Connection = connection;
 } 

使用参数化查询来防止SQL注入攻击。


0

在执行之前,我们需要将sqlconnection对象传递给sqlcommand对象。

Sqlcommand有以下构造函数:

  1. SqlCommand()
  2. SqlCommand(String)
  3. SqlCommand(String, SqlConnection)
  4. SqlCommand(String, SqlConnection, SqlTransaction)
  5. SqlCommand(String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting)

如果我们使用1.默认构造函数或2.带有一个参数(查询)的参数化构造函数,则需要设置连接。

   SqlCommand.Connection = SqlConnection;

以下是可工作的代码片段:
   //create a connection object
  using (SqlConnection connection = new SqlConnection(connectionString))
    {
     //create command object, and pass your string query & connection object.
     //we can call the default constructor also and later assign these values
       SqlCommand command = new SqlCommand(queryString, connection);   
    //open the connection here,
      command.Connection.Open();
    //execute the command.
      command.ExecuteNonQuery();
    }

为了确保连接始终关闭,我们应该在 using 块内打开连接,以确保当代码退出块时,连接会自动关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接