C# 使用winforms在sql数据库中插入数据,经常打开连接的缺点

C# 使用winforms在sql数据库中插入数据,经常打开连接的缺点,c#,.net,sql,winforms,sql-server-2005,C#,.net,Sql,Winforms,Sql Server 2005,我正在开发一个前端销售应用程序 这是从单个按钮将数据多次插入sql表的有效方法吗: private void button1_Click(object sender, EventArgs e) { c.Open(); string w = "insert into checkmultiuser(username) values (@username)"; SqlCommand cmd = new SqlCommand(w, c); cmd.Parameters

我正在开发一个前端销售应用程序

这是从单个按钮将数据多次插入sql表的有效方法吗:

private void button1_Click(object sender, EventArgs e)
{
    c.Open();
    string w = "insert into checkmultiuser(username) values (@username)";

    SqlCommand cmd = new SqlCommand(w, c);

    cmd.Parameters.Add("@username", SqlDbType.VarChar);
    cmd.Parameters["@username"].Value = textBox1.Text;
    //cmd.ExecuteNonQuery();
    cmd.ExecuteReader();
    c.Close();    
}

它的缺点是什么?一种情况是,当点击按钮时,连接会一次又一次地打开和关闭,这将极大地影响速度。

您选择了正确的方式:也查看此问题。

您选择了正确的方式:也查看此问题。

我会在表单打开时打开连接一次,然后重新使用该连接,直到表格已关闭


至于插入记录,您的代码是正确的。

当表单打开时,我会打开一次连接,并重复使用该连接,直到表单关闭


至于插入记录,您的代码是正确的。

从资源管理的角度来看,如果您能够计算出需要插入数据的次数,然后在单击一个按钮的过程中执行该操作,可能会在循环中迭代,直到完成正确数量的插入操作,这会更好。这意味着您不会每次按下按钮都不断地打开和关闭连接,而是打开连接,执行插入查询并关闭连接

我还建议您使用“using”语句实现代码,这样它将自动处理资源的处置和释放

private void button1_Click(object sender, EventArgs e, string[] value)
{
      try
      {
           using(SQLConnection c = new SQLConnection(connectionString))  
           using(SQLCommand cmd = new SQLCommand(c))
           {
               c.Open();

               string w = "insert into checkmultiuser(username) values (@username)";

               cmd.CommandText = w;
               cmd.Parameters.Add("@username", SqlDbType.VarChar);    

               for(int i = 0; i < value.Length; i++)
               {
                   cmd.Parameters["@username"].Value = value[i];    
                   cmd.ExecuteReader();
               }
           }
        }
        catch(Exception e)
        {
             Console.WriteLine(e.Message);
        }
}
private void按钮1\u单击(对象发送者,事件参数e,字符串[]值)
{
尝试
{
使用(SQLConnection c=newsqlconnection(connectionString))
使用(SQLCommand cmd=newsqlcommand(c))
{
c、 Open();
string w=“插入checkmultiuser(username)值(@username)”;
cmd.CommandText=w;
cmd.Parameters.Add(“@username”,SqlDbType.VarChar);
for(int i=0;i
如果您可以在方法中创建SQLConnection,那么它还将允许您在using语句中创建它,再次负责管理和释放资源

private void button1_Click(object sender, EventArgs e, string[] value)
{
      try
      {
           using(SQLConnection c = new SQLConnection(connectionString))  
           using(SQLCommand cmd = new SQLCommand(c))
           {
               c.Open();

               string w = "insert into checkmultiuser(username) values (@username)";

               cmd.CommandText = w;
               cmd.Parameters.Add("@username", SqlDbType.VarChar);    

               for(int i = 0; i < value.Length; i++)
               {
                   cmd.Parameters["@username"].Value = value[i];    
                   cmd.ExecuteReader();
               }
           }
        }
        catch(Exception e)
        {
             Console.WriteLine(e.Message);
        }
}
就您使用的语句而言,我看不出有任何问题,您使用的是参数化查询,这是与SQL数据库交互时需要采取的一个很好的步骤

参考文献:


从资源管理的角度来看,如果您能够计算出需要插入数据的次数,然后在单击一个按钮的过程中执行该操作,可能会在循环中迭代,直到完成正确数量的插入操作,则会更好。这意味着您不会每次按下按钮都不断地打开和关闭连接,而是打开连接,执行插入查询并关闭连接

我还建议您使用“using”语句实现代码,这样它将自动处理资源的处置和释放

private void button1_Click(object sender, EventArgs e, string[] value)
{
      try
      {
           using(SQLConnection c = new SQLConnection(connectionString))  
           using(SQLCommand cmd = new SQLCommand(c))
           {
               c.Open();

               string w = "insert into checkmultiuser(username) values (@username)";

               cmd.CommandText = w;
               cmd.Parameters.Add("@username", SqlDbType.VarChar);    

               for(int i = 0; i < value.Length; i++)
               {
                   cmd.Parameters["@username"].Value = value[i];    
                   cmd.ExecuteReader();
               }
           }
        }
        catch(Exception e)
        {
             Console.WriteLine(e.Message);
        }
}
private void按钮1\u单击(对象发送者,事件参数e,字符串[]值)
{
尝试
{
使用(SQLConnection c=newsqlconnection(connectionString))
使用(SQLCommand cmd=newsqlcommand(c))
{
c、 Open();
string w=“插入checkmultiuser(username)值(@username)”;
cmd.CommandText=w;
cmd.Parameters.Add(“@username”,SqlDbType.VarChar);
for(int i=0;i
如果您可以在方法中创建SQLConnection,那么它还将允许您在using语句中创建它,再次负责管理和释放资源

private void button1_Click(object sender, EventArgs e, string[] value)
{
      try
      {
           using(SQLConnection c = new SQLConnection(connectionString))  
           using(SQLCommand cmd = new SQLCommand(c))
           {
               c.Open();

               string w = "insert into checkmultiuser(username) values (@username)";

               cmd.CommandText = w;
               cmd.Parameters.Add("@username", SqlDbType.VarChar);    

               for(int i = 0; i < value.Length; i++)
               {
                   cmd.Parameters["@username"].Value = value[i];    
                   cmd.ExecuteReader();
               }
           }
        }
        catch(Exception e)
        {
             Console.WriteLine(e.Message);
        }
}
就您使用的语句而言,我看不出有任何问题,您使用的是参数化查询,这是与SQL数据库交互时需要采取的一个很好的步骤

参考文献:


也许不需要为每个条目插入数据库,而是将每个条目存储在一个数据集中,然后一次全部插入,一个保存按钮

对于每个条目,请执行以下操作:

String s = textBox1.Text;

If ( *\Enter validation logic*\ )
{
  //Insert data into DataSet
}
else
{
  //Throw error for user.
}

然后,一旦准备好提交给DB,插入数据集中的每个项目,类似于此处其他答案中的示例。

可能不为每个条目插入数据库,而是将每个条目存储在数据集中,然后通过“保存”按钮一次插入所有条目

对于每个条目,请执行以下操作:

String s = textBox1.Text;

If ( *\Enter validation logic*\ )
{
  //Insert data into DataSet
}
else
{
  //Throw error for user.
}

然后,一旦您准备好提交给DB,插入数据集中的每个项目,类似于此处其他答案中的示例。

我认为您不必担心由于打开和关闭连接而产生的时间延迟,特别是当它发生在手动触发的按钮单击事件上时。人类可感知的响应时间约为200毫秒。充其量,我猜有人可以每100毫秒左右点击一次按钮。有足够的时间打开和关闭连接

但是,如果您正在处理一个将连接到数据库的例程,您可以传入该连接,使用Keeling先生已经提到的
语句包含一个
,然后验证它是否准备就绪

下面是另一种方法,它返回一个DataTable(因为在执行数据读取器时显示了原始post):


我认为您不必担心由于打开和关闭连接而导致的时间延迟,特别是当它发生在手动触发的按钮单击事件上时。人类可感知机器人