C# SQL Query - ExecuteNonQuery: свойство подключения не было инициализировано

У меня есть несколько блоков кода в моем приложении Windows, которые используют ту же структуру для выполнения запросов. После добавления нескольких новых вещей в мой код они больше не работают из-за ошибки:

"ExecuteNonQuery: свойство подключения не было инициализировано"

Все блоки кода выглядят так:

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++;

Соединения для них определены в верхней части класса.

1 ответ

Решение

Вы должны назначить его SqlConnection объект.

 cmd.Connection = connection;

куда connection это SqlConnection объект с вашей строкой подключения и т. д.

Также для хорошей практики вы должны завернуть его в using:

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

И параметризованные запросы для предотвращения атак SQL-инъекций.

Нам нужно передать объект sqlconnection объекту sqlcommand перед его выполнением.

Sqlcommand имеет следующий конструктор конструкторов:

  1. SqlCommand ()
  2. SqlCommand (строка)
  3. SqlCommand (строка, SqlConnection)
  4. SqlCommand (String, SqlConnection, SqlTransaction)
  5. SqlCommand (строка, 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, чтобы гарантировать, что соединение автоматически закрывается, когда код выходит из блока.

Другие вопросы по тегам