Sak*_*o73 7 .net c# sql-server sql-server-2008 sql-server-2008-r2
我正在编写一个将数据写入SQL Server 2008r2的.NET应用程序.我有两个插入数据的选项,要么我可以创建一个大的字符串插入语句,并将其作为文本命令发送,或者我可以在.NET DataTable中收集数据,并将其作为表值参数传递.每种方法的好处和成本是什么?
(我省略了很多代码,因为我只是询问相对的好处,而不是具体的语法)
例如:
选项1:
string insert = @"insert into MyTable (id, val) values
( 1, 'a'),(2,'b'),(3,'c'),(4,'d');"
Run Code Online (Sandbox Code Playgroud)
选项2:
DataTable dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("val", typeof(string));
....
create procedure uspMyProc
@tt ttMyTableType readonly
as
begin
insert into TestTable1 (id, strValue)
select myId, myVal from @tt;
end"
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
选项3:在第一个实例中,我将使用一个insert语句的参数填充insert存储过程,并在C#代码的循环中多次调用它:
选项4:如果您确实需要插入大量行,可能需要查看SqlBulkCopy类.它消耗要么DataTable,DataRow或IDataReader.你可以IDataReader使用一些自定义代码从一个对象列表中创建一个问题,这里有一个问题:
我会说这取决于.
如果你真的想以表格形式传递许多行参数,无论出于何种原因,使用表值参数 - 这就是它的用途.
我见过选项1 - 一些通用的DAL代码会编写一个SQL"批处理"命令来运行.它起作用,但没有对注射攻击提供任何防御.参数化的SQL确实如此.
总而言之,我倾向于从代码中插入每行一次调用插入sproc - 调用将完全参数化并且性能良好.如果性能成为问题,我会赞成选项4.
有多大?如果它是巨大的,没有什么比SqlBulkCopy更好.我实际上发现TVP表现令人失望.对于查询计划的重用,我是参数化和大量重用语句的粉丝.Dapper可以帮助您,允许您将对象列表传递给查询 - 然后它将按成员名称添加每个对象的命名参数,每秒数千次操作.例如:
conn.Execute(
"insert foo (Id,Name) values (@Id,@Name)",
listOfObjects);
Run Code Online (Sandbox Code Playgroud)
这将迭代列表并依次使用.Id和.Name从每个对象执行查询.
| 归档时间: |
|
| 查看次数: |
3496 次 |
| 最近记录: |