С# SQL-запрос — ExecuteNonQuery: свойство Connection не было инициализировано

У меня есть несколько блоков кода в моем приложении 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++;

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


person Logun Baker    schedule 13.09.2013    source источник
comment
Я нигде не вижу, где вы на самом деле создаете соединение.   -  person PiousVenom    schedule 13.09.2013
comment
Как это вообще могло сработать? Вы никогда не создавали соединение (строка)   -  person Daniel Abou Chleih    schedule 13.09.2013
comment
Обычно это означает, что вы не установили объект соединения. Можем ли мы увидеть декларации, пожалуйста   -  person Steven Wood    schedule 13.09.2013


Ответы (2)


Вам необходимо назначить ему объект SqlConnection.

 cmd.Connection = connection;

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

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

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

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

person Darren    schedule 13.09.2013

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

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

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

person Rishu Ranjan    schedule 14.05.2020