C# 使用winforms在sql数据库中插入数据,经常打开连接的缺点
我正在开发一个前端销售应用程序 这是从单个按钮将数据多次插入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
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):
我认为您不必担心由于打开和关闭连接而导致的时间延迟,特别是当它发生在手动触发的按钮单击事件上时。人类可感知机器人