[英]getting error - System.InvalidOperationException was unhandled
[英]Cannot connect to database, getting System.InvalidOperationException
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.Data.dll中發生了類型為'System.InvalidOperationException'的未處理異常。 附加信息:連接未關閉。 連接的當前狀態為打開。
在共享作用域中存在一個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);
}
}
重要提示:另外,請注意,我在這里做了幾件事:
SqlConnection
對象包裝在using
塊中。 基本上,這將創建一個try/finally
塊,以確保使用完連接后將其Dispose()
通過在finally
塊中調用Dispose()
,因此它僅適用於IDisposable
對象)。 確保I / O資源的處置很重要。 您應該在方法內部進行連接並正確處理斷開連接。 最簡單的方法是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);
}
}
您確定使用'myInfo'的正確符號表示大寫字母和小寫字母的順序正確嗎?..在查找具有相同名稱的d數據庫時實際上出錯。.在Visual Studio中使用檢查點檢查d從頭開始執行程序。.如果您不知道如何在Visual Studio中使用檢查點,請執行相同的操作。它會逐步顯示您的代碼進度,並在發現錯誤代碼行時提示您復制粘貼d sql server中的一行..if數據庫中的查詢格式和您給定的參數是正確的,否則將在數據庫中執行,否則將無法執行,並且在SQL語句中將顯示錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.