2010-07-19 77 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並保持連接打開,直到執行插入語句。