簡體   English   中英

無法連接到數據庫,獲取System.InvalidOperationException

[英]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);
    }
}

重要提示:另外,請注意,我在這里做了幾件事:

  1. SqlConnection對象包裝在using塊中。 基本上,這將創建一個try/finally塊,以確保使用完連接后將其Dispose()通過在finally塊中調用Dispose() ,因此它僅適用於IDisposable對象)。 確保I / O資源的處置很重要。
  2. 用查詢參數替換了SQL注入漏洞。 您應該始終將用戶輸入視為參數值,而不應視為可執行SQL代碼

您應該在方法內部進行連接並正確處理斷開連接。 最簡單的方法是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM