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 имеет следующий конструктор конструкторов:
- SqlCommand ()
- SqlCommand (строка)
- SqlCommand (строка, SqlConnection)
- SqlCommand (String, SqlConnection, SqlTransaction)
- 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, чтобы гарантировать, что соединение автоматически закрывается, когда код выходит из блока.