2010-07-19 135 views
1

我在.NET 2.0中使用C#,并试图访问和操作数据库。我可以从数据库,因为我想读多次和一切正常,但只要我尝试插入一个项目,我得到了以下错误消息:C#SQL查询异常

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插入。另外,我对数据库还是一个相当新的东西,所以如果我做了任何错误的事情,请告诉我。

谢谢。

回答

4

你似乎没有打开连接来执行更新(例外情况告诉你这个)

试试这个

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

您可以在http://msdn.microsoft.com/en-us/library/sd2728ad.aspx

+0

出于某种原因,我认为“使用”命令处理打开和关闭,而不是只是关闭。这工作,谢谢。 – user108088 2010-07-19 08:25:20

0

你没有打开连接获得在MSDN上更多的细节和工作示例。

此页面显示如何使用using语句打开SqlConnection。

Your Friend the C# Using Statement

+0

具体而言,您需要在using语句后面使用conn.Open()。 – 2010-07-19 08:18:13

+0

是的,确实如此。有一段时间我以为使用using关键字会自动打开连接,但事实并非如此。你仍然需要调用conn.Open()。 – 2010-07-19 08:20:40

0

呼叫conn.Open()调用cmd.ExecuteNonQuery前()。

0

你必须打开连接,执行命令

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

您需要在以后调用它con.ExecuteNonQuery和con.Close之前调用con.open之前。 Dataadapter.fill正在为您在后面的代码中幕后做。

0

使用cmd前请检查conn.IsOpen属性。而且SqlCommand也是一次性对象,它更好的做法是把它放在“使用”块中。

6

.Fill()打开连接,如果它没有打开,然后在完成后关闭它(仅当它自己打开它时)。这就是为什么填充工作。见MSDN

.ExecuteNonQuery()没有做到这一点,所以你需要手动打开连接,用

conn.Open(); 

要么只是在ExecNonQuery之前或填充之前。

由于您正在使用“使用块”,因此您不需要明确地关闭()连接,但这不会有错。

0

上面没有人正在检查以确保连接打开。 我在生产代码中使用此:

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(); 
     } 
    } 
} 
1

当你调用dataAdapter.Fill(dataSet);它会自动打开和关闭连接。
因此,您需要在使用插入语句之前重新打开连接,或者用SqlCommand替换DataAdapter并保持连接打开,直到执行插入语句。