2015-11-06 508 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语句中的错误