是否有更好的方法将数组中的值插入SQL Server 2008

本文关键字:插入 SQL Server 2008 数组 更好 方法 是否 | 更新日期: 2023-09-27 18:23:50

我正试图将行存储在SQL Server 2008表中,用于一个关于所有车辆中文档的垃圾场;我将每月运行一次该程序,以便收到一份包含所有车辆信息的列表。我知道我可以写一个文本文件,并从文件中进行"大容量插入"。

然而,我只是想知道是否有一种方法可以将存储在字符串数组中的信息直接插入SQL Server。

现在我正在做一个for循环,并运行500个查询命令来插入它们,对于500条记录,整个过程只需要大约4秒。

我想知道是否有更好的方法直接插入数组中的信息,而不使用for循环500次?

下面的代码对我来说非常好,但如果有更好的方法,我不想使用那种意大利面条代码。提前谢谢!

for (int i = 0; i < 500; i++)
{
    con.Open();
    SqlCommand myCommand = new SqlCommand("INSERT INTO [TESTCATALOG].[dbo].[TITLES] VALUES ('" + TitleNum[i] + "','" + VIN[i] + "','" + DateIssued[i] + "')", con);
    myCommand.ExecuteReader();
    con.Close();
}

是否有更好的方法将数组中的值插入SQL Server 2008

您可以使用表值参数(TVP)直接通过存储过程插入列表。

表值参数是SQL Server 2008中的一种新参数类型。表值参数是通过使用用户定义的表类型来声明的。可以使用表值参数向Transact-SQL语句或例程(如存储过程或函数)发送多行数据,而无需创建临时表或多个参数。

这也将避免您的代码中当前存在的SQL注入漏洞。

请参阅MSDN上SQL Server 2008(ADO.NET)中的表值参数,了解如何使用C#调用带有TVP的存储过程:

SqlCommand insertCommand = new SqlCommand(sqlInsert, connection);
SqlParameter tvpParam = insertCommand.Parameters.AddWithValue(
                                                           "@tvpNewCategories", 
                                                           addedCategories);
tvpParam.SqlDbType = SqlDbType.Structured;
tvpParam.TypeName = "dbo.CategoryTableType";

是的,您可以使用linq-to-sql或linq-to-entities在单个事务中实现这一点。

您可以使用SqlBulkCopy类。SqlBulkCopy类要求您的数据可用作DataRow[]DataTable或`IDataReader。

从SQL Server 2008起,您可以使用表值变量。

请参阅MSDN中的"将表值参数传递给参数化SQL语句"。

您可以使用dataadapter进行插入或更新。首先在yor for循环中的数据表中添加行,然后使用数据表调用dataadapter.update