C # SQL-запрос исключение - PullRequest
1 голос
/ 19 июля 2010

Я использую C # в .NET 2.0 и пытаюсь получить доступ к базе данных и манипулировать ею. Я могу читать с БД столько раз, сколько захочу, и все работает, но как только я пытаюсь вставить элемент, я получаю следующее сообщение об ошибке:

ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.

Я пытался найти это, но исправления, которые мне удалось найти, либо не работали, либо не применялись.

У меня есть следующий код:

using (SqlConnection conn = new SqlConnection(SQLConnectionString))
{
    SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT [Col1] FROM [Table1] WHERE [Col2]='" + val2 + "'", conn);
    DataSet dataSet = new DataSet();
    dataAdapter.Fill(dataSet);

    if (dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count != 1)
    {
        SqlCommand cmd = new SqlCommand("INSERT INTO [Table1] ([Col1], [Col2]) VALUES ('" + val1 + "', '" + val2 + "')", conn);
        cmd.ExecuteNonQuery();
    }
}


Примечание: я уверен, что у меня правильно настроены разрешения, так как Visual Studio может вставлять с тем же SQLConnectionString. Кроме того, я все еще плохо знаком с базами данных, поэтому, если я делаю что-то явно неправильно, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 9 ]

6 голосов
/ 19 июля 2010

.Fill() открывает соединение, если оно не было открыто, а затем закрывает его после завершения (только если оно само открывало его).Вот почему этот Филл сработал.См. MSDN .

Но .ExecuteNonQuery() этого не делает, поэтому вам нужно вручную открыть соединение с

conn.Open();

как раз передExecNonQuery или перед заполнением.

Поскольку вы используете «использующий блок», вам не нужно явно закрывать () соединение, но это не будет ошибкой.

4 голосов
/ 19 июля 2010

Похоже, вы не открываете соединение для выполнения обновления (об этом говорит исключение) .

Попробуйте это

SqlCommand cmd = new SqlCommand("INSERT INTO [Table1] ([Col1], [Col2]) VALUES ('" + val1 + "', '" + val2 + "')", conn);
            conn.Open();    
            cmd.ExecuteNonQuery();
            conn.Close();

Более подробную информацию и пример работы с MSDN можно получить по адресу http://msdn.microsoft.com/en-us/library/sd2728ad.aspx

.
1 голос
/ 19 июля 2010

Когда вы звоните dataAdapter.Fill(dataSet);, он автоматически открывает и закрывает соединение.Поэтому вам необходимо заново открыть соединение перед использованием оператора вставки или заменить DataAdapter на SqlCommand и держать соединение открытым, пока вы не выполните вставка оператор.

0 голосов
/ 19 июля 2010

Никто выше не проверяет, чтобы убедиться, что соединение открыто.Я использую это в моем производственном коде:

using (var conn = new SqlConnection(SQLConnectionString))
{
    conn.Open();
    if (conn.State == ConnectionState.Open)
    {
        SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT [Col1] FROM [Table1] WHERE [Col2]='" + val2 + "'", conn);
        DataSet dataSet = new DataSet();
        dataAdapter.Fill(dataSet);

        if (dataSet.Tables.Count == 0 || dataSet.Tables[0].Rows.Count != 1)
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO [Table1] ([Col1], [Col2]) VALUES ('" + val1 + "', '" + val2 + "')", conn);
            cmd.ExecuteNonQuery();
        }
    }
}
0 голосов
/ 19 июля 2010

Проверьте свойство conn.IsOpen перед использованием cmd.Кроме того, SqlCommand также является одноразовым объектом, поэтому рекомендуется заключать его в блок «using».

0 голосов
/ 19 июля 2010

Вам нужно вызвать con.open перед вызовом con.ExecuteNonQuery и con.Close после него.Dataadapter.fill делает это для вас за кулисами в предыдущем коде.

0 голосов
/ 19 июля 2010

Вы должны открыть соединение перед выполнением команды

 conn.Open()  
    SqlCommand cmd = new SqlCommand("INSERT INTO [Table1] ([Col1], [Col2]) VALUES ('" + val1 + "', '" + val2 + "')", conn);  
    cmd.ExecuteNonQuery();  
    conn.Close()
0 голосов
/ 19 июля 2010

Вызовите conn.Open () перед вызовом cmd.ExecuteNonQuery ().

0 голосов
/ 19 июля 2010

Вы не открывали соединение.

На этой странице показано, как открыть SqlConnection с помощью оператора using.

Ваш друг C #, используя заявление

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...