C#SQL插入命令

谁能告诉我以下2种插入记录的方式可以创造更好的性能?

情况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(); } 

案例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(); 

首先: 停止连接你的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(); } 

或者使用SqlBulkCopy ,特别是如果你插入甚至超过10'000行。

第二种方法看起来比#1快,因为您一次发送INSERT命令。 在第一个是每个ExecuteNonQuery的SQL服务器往返。

但是你应该尝试批量插入命令: BULK INSERT(Transact-SQL) ,我猜你会得到比你提供的任何一个选项更好的性能。

[]的

应该明确指出原样,两种情况都不会起作用。

情况#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(); 

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

我不认为第二个会起作用。

但是,SQL Server 2008中有一种语法用于在单个INSERT语句中插入多行 ,我认为这将比您提出的两个选项更快:

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

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

第二个可能更快,因为你最终只能进行一次往返。 两者都同样糟糕,因为您不使用参数化查询 。