2015-11-06 507 views
0
SqlConnection CON = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\VS_project\\WindowsFormsApplication1\\WindowsFormsApplication1\\myInfo.mdf;Integrated Security=True"); 
private void button4_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     CON.Open(); 
     SqlDataAdapter SDA = new SqlDataAdapter("INSERT INTO myInfo(Name,Address,Gender,LangKnownHindi)VALUES('" + textBox1.Text + "','" + textBox2.Text + "','" + Gender + "','" + LANG_Hin + "')", CON); 
     SDA.SelectCommand.ExecuteNonQuery(); 
     CON.Close(); 
     MessageBox.Show("Saved SuccessFully!!!!!"); 
    } 
    catch (SqlException ex) 
    { 
     MessageBox.Show(ex.Message); 

    } 
} 

當我運行這個程序,我得到:無法連接到數據庫,讓System.InvalidOperationException

類型的未處理的異常「System.InvalidOperationException」 出現在system.data.dll。附加信息:連接 未關閉。連接的當前狀態已打開。

+1

你將你的Sql連接實例保存在類範圍中,如果你有任何e在ExecuteNonQuery期間出現錯誤,顯示一個消息框但連接保持打開狀態。如果在每個ExecuteNonQuery之後關閉連接,爲什麼不在聲明內部聲明CON(變量名!)? –

+0

雖然這樣做,請嘗試封裝它在使用語句,以確保連接關閉。此外,您只是執行非查詢,在這種情況下,不需要SqlDataAdapter。只需創建一個SqlCommand並通過該實例執行非查詢。 –

+0

當我運行我的程序並單擊提交按鈕時,它顯示:無效的對象名稱'myInfo'。 – Prince

回答

0

您應該在方法內連接並處理斷開連接權。最簡單的方法是使用using,這也會在後臺創建連接句柄。

另外,在這種情況下,SqlCommand更適合於更好的目的。由於您將用戶輸入連接到SQL語句,因此也要注意SQL注入。改用參數!

private void button4_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using (SqlConnection conn = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\VS_project\\WindowsFormsApplication1\\WindowsFormsApplication1\\myInfo.mdf;Integrated Security=True")) 
     { 
      conn.Open(); 

      using (SqlCommand command = new SqlCommand("INSERT INTO myInfo(Name,Address,Gender,LangKnownHindi)VALUES(@name, @address,@gender,@lang)", conn)) 
      { 
       command.Parameters.AddWithValue("@name", textBox1.Text); 
       command.Parameters.AddWithValue("@address", textBox2.Text); 
       command.Parameters.AddWithValue("@gender", Gender); 
       command.Parameters.AddWithValue("@lang", LANG_Hin); 

       command.ExecuteNonQuery(); 
      } 

      conn.Close(); 
      MessageBox.Show("Saved SuccessFully!!!!!"); 
     } 
    } 
    catch (SqlException ex) 
    { 
     MessageBox.Show(ex.Message); 

    } 
} 
+0

我曾嘗試過上面相同的代碼.....但仍顯示相同的錯誤...當我點擊提交按鈕時,它顯示:無效的對象名稱'myInfo'。但我已經創建了數據庫 – Prince

1

在一間共享範圍SQL連接對象存在,是一個著名的壞主意。連接應該在使用它的操作範圍內創建,使用和處理。否則,其他代碼可能會嘗試使用相同的連接對象(甚至多次使用相同的代碼),從而使其處於未知狀態。這很可能發生在這裏。

創建方法本身的連接:

private void button4_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using (SqlConnection CON = new SqlConnection("Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=D:\\VS_project\\WindowsFormsApplication1\\WindowsFormsApplication1\\myInfo.mdf;Integrated Security=True")) 
     { 
      CON.Open(); 
      SqlDataAdapter SDA = new SqlDataAdapter("INSERT INTO myInfo(Name,Address,Gender,LangKnownHindi)VALUES(@Name,@Address,@Gender,@LangKnownHindi)", CON); 
      SDA.SelectCommand.Parameters.AddWithValue("@Name", textBox1.Text); 
      SDA.SelectCommand.Parameters.AddWithValue("@Address", textBox2.Text); 
      SDA.SelectCommand.Parameters.AddWithValue("@Gender", Gender); 
      SDA.SelectCommand.Parameters.AddWithValue("@LangKnownHindi", LANG_Hin); 
      SDA.SelectCommand.ExecuteNonQuery(); 
      CON.Close(); 
     } 
     MessageBox.Show("Saved SuccessFully!!!!!"); 
    } 
    catch (SqlException ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

重要:另外請注意,我已經做了幾件事情在這裏:

  1. 包裹SqlConnection對象一個using塊。這基本上創建了一個try/finally塊,以確保連接在使用後被丟棄(通過在finally塊中調用Dispose(),因此它只能在IDisposable對象上使用)。確保處理I/O資源非常重要。
  2. 用查詢參數替換您的SQL注入漏洞。您應該始終將用戶輸入視爲參數值,而不是可執行SQL代碼
+0

不確定我喜歡'using'和'try/finally'之間的比較,但其餘的都是。 – DavidG

+2

@DavidG:編譯器將''use'塊轉換爲'try/finally'塊,其中'finally'中調用Dispose()。你不必喜歡它,但它就是這樣工作的。 – David

+0

嗯,我確實說我不確定,但現在我確定我喜歡它:) – DavidG

0

確定DAT u必須用於「MyInfo的」正確denoations意味着帽第二小的字母按正確的順序?? ..它實際上是有找到d數據庫VID相同name..use檢查點錯誤在Visual Studio中檢查你的程序執行從開始..如果你不知道如何使用Visual Studio中的檢查點登錄谷歌D相同..它顯示你一步一步的進步你的代碼和巢穴當你找到錯誤行的代碼只是在SQL Server中複製粘貼d行..如果數據庫中的查詢格式和你給出的參數是正確的,它會在數據庫中執行,否則它將無法執行,並且會顯示你在sql語句中的錯誤