无法连接到数据库,得到System.InvalidOperationException

时间:2015-11-06 13:35:36

标签: c#

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.Data.dll中。附加信息:连接   没有关闭。连接的当前状态是打开的。

3 个答案:

答案 0 :(得分: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块,以确保在使用连接后(通过调用Dispose()块中的finally来处理连接,因此它仅适用于{{1}对象)。确保处理I / O资源非常重要。
  2. 使用查询参数替换了 SQL注入漏洞。您应始终将用户输入视为参数值,而不是可执行SQL代码

答案 1 :(得分:0)

您应该在方法内部连接并处理右侧断开连接。最简单的方法是使用 $sourcefiles = ((Get-ChildItem $source -Filter $filter).BaseName).TrimEnd(16) foreach ($file in $sourcefiles) { if(!(Test-Path "$dest\$file")){ New-item -ItemType directory -path "$dest\$file" } Move-Item "$source\$file" "$dest\file" } ,它还会在后台创建连接句柄。

此外,在这种情况下,using更符合目的。因为您将用户输入连接到SQL语句,所以也要注意SQL注入。改为使用参数!

SqlCommand

答案 2 :(得分:0)

你确定你已经使用了正确的“myInfo”#39;意味着大写和小写字母是正确的顺序??它实际上有一个错误,找到d数据库视频相同的名称..在视觉工作室使用检查点来检查你的程序从开始执行..如果你不知道如何在视觉工作室中使用检查点den jst google d same..it vil show u step ur步骤进展你的代码错误行代码只需复制粘贴d行在sql server..if格式的查询数据库和参数由你给出是正确的否则它在数据库中执行val或者vil无法执行,并且vil在sql语句中显示错误