C#SQL插入命令

C#SQL插入命令,c#,sql,loops,insert,sqlcommand,C#,Sql,Loops,Insert,Sqlcommand,有人能告诉我以下两种插入记录的方法可以创造更好的性能吗 案例1 SqlCommand cmd = new SqlCommand(); for (int i = 0; i < 10000; i++) { cmd = new SqlCommand("insert into test(id, name) value('" + i + "', '" + i + "')"); cmd.ExecuteNonQuery(); } SqlCommand cmd=new SqlCommand()

有人能告诉我以下两种插入记录的方法可以创造更好的性能吗

案例1

SqlCommand cmd = new SqlCommand();

for (int i = 0; i < 10000; i++)
{
  cmd = new SqlCommand("insert into test(id, name) value('" + i + "', '" + i + "')");
  cmd.ExecuteNonQuery();
}
SqlCommand cmd=new SqlCommand();
对于(int i=0;i<10000;i++)
{
cmd=newsqlcommand(“插入测试(id,名称)值(““+i+”,“+i+”)”);
cmd.ExecuteNonQuery();
}
案例2

string sql = null;

for (int i = 0; i < 10000; i++)
{
  sql += "insert into test(id, name) value('" + i + "', '" + i + "')";
}

SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
stringsql=null;
对于(int i=0;i<10000;i++)
{
sql+=“插入测试(id、名称)值(“+i+”,“+i+”)”;
}
SqlCommand cmd=新的SqlCommand(sql,conn);
cmd.ExecuteNonQuery();

第二种方法看起来比#1快,因为您可以立即发送INSERT命令。在第一个示例中,每个ExecuteOnQuery都有一个到SQL server的往返过程

但是您应该尝试使用bulkinsert命令:,我想您将获得比您提供的任何一个选项更好的性能


[]的

我认为第二种方法行不通

但是,SQL Server 2008中有一个语法,我认为它比您建议的两个选项都要快:

INSERT INTO test (id, name)
VALUES
('1', 'foo'),
('2', 'bar'),
('3', 'baz')
 -- etc...

但是,如果你真的想要高性能,考虑使用类。

首先:<强>停止< /强>连接你的SQL代码!!这是对各地黑客的邀请,让他们用SQL注入攻击您!请改用参数化查询

我将使用此解决方案:创建一个带有参数化查询的单个
SqlCommand
,然后执行:

string stmt = "INSERT INTO dbo.Test(id, name) VALUES(@ID, @Name)";

SqlCommand cmd = new SqlCommand(smt, _connection);
cmd.Parameters.Add("@ID", SqlDbType.Int);
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 100);

for (int i = 0; i < 10000; i++)
{
    cmd.Parameters["@ID"].Value = i;
    cmd.Parameters["@Name"].Value = i.ToString();

    cmd.ExecuteNonQuery();
}
string stmt=“插入dbo.Test(id,name)值(@id,@name)”;
SqlCommand cmd=新的SqlCommand(smt,_连接);
cmd.Parameters.Add(“@ID”,SqlDbType.Int);
cmd.Parameters.Add(“@Name”,SqlDbType.VarChar,100);
对于(int i=0;i<10000;i++)
{
cmd.Parameters[“@ID”].Value=i;
cmd.Parameters[“@Name”].Value=i.ToString();
cmd.ExecuteNonQuery();
}

或者使用
SqlBulkCopy
,尤其是当插入的行数超过10000行时。

第二个可能更快,因为您只需要一次往返。这两种情况都同样糟糕,因为您不使用。

应该注意的是,这两种情况都不起作用

情况#1要求指定一个连接

案例2要求您以分号结束语句,以便运行多个命令,如下所示:

string sql = null;

for (int i = 0; i < 10000; i++)
{
  sql += "insert into test(id, name) value('" + i + "', '" + i + "');";
}

SqlCommand cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
stringsql=null;
对于(int i=0;i<10000;i++)
{
sql+=“插入测试(id,名称)值(“+i+”,“+i+”);”;
}
SqlCommand cmd=新的SqlCommand(sql,conn);
cmd.ExecuteNonQuery();

最终,最好的方法是您自己在几千行上测试它。我的猜测情况#2的性能会更好,因为它不仅需要只设置一个
SqlCommand
对象,而且只会访问数据库一次。

您运行过简单的计时测试吗?每一个都执行10000次,看看哪一个运行得更快。相同,但最好是案例一。同样,因为您将使用连接池。首先:停止将SQL代码连接在一起!!这是邀请黑客用SQL注入攻击你!改用参数化查询@丹安德鲁斯:真的吗?!?!??您认为创建10000个
SqlCommand
实例并逐个执行它们与创建单个实例并只执行一次一样快吗?您是对的,它会更快。虽然这可能是个好主意,但它如何回答“选项1或选项2哪个更快”的问题。你说的是“改做选项3”。@KenWhite我认为答案非常恰当。它没有直接回答这个问题,因为OP使用的是一个低效的流程。我有一种预感,OP并不是在寻找哪种方式使用更少的CPU周期(因为他们可以很容易地测试自己,如果这正是他们想要知道的)。相反,我相信OP正在努力了解哪种方法更有效,而Fabio提供了一个比OP更好的解决方案,但事实并非如此。正如你所说,这是第三种选择。有时我们得不到我们想要的确切答案,但我们得到了一些东西,使我们从不同的角度看待事物。[]我真的不喜欢看到答案在没有回答被问到的非常具体的问题时被否决。如果这是第三种选择,可以在答案中添加一个脚注,作为对所问问题的实际回答,或者作为对原始问题的评论。这不是对所问问题的回答,也不应该这样贴出来。我本来可以投反对票,或者把它标为“不是答案”;我没有。我给了这张海报一个机会,要么扩展提供的答案,要么先删除它。答案实际上应该做到这一点——回答问题。然后可以提供关于替代方案的其他建议或信息。@Kiley:我看不出你在这里发表这篇文章除了煽动一个论点之外还有什么意义。虽然我通常同意将未初始化的参数直接传递到串联SQL是不好的,但在这段代码的上下文中,它实际上是无害的。没有需要关注的用户输入值-这看起来像是一个快速的一次性操作。新的推荐方法是使用
AddWithValue
@Si8:绝对不是!!!-见丹·古兹曼:请阅读文章并停止使用!嗯,我记得在什么地方见过它,但现在找不到了。你是对的。。。谢谢。我可以想象VS和C#作为微软,他们不会推荐不准确的东西,但再次使用了SharePoint,这绝对不是事实!即使VS给我警告,我也会坚持使用
Add()