我正在尝试从Datatable实现批量插入数据。在我的MS-SQL表(目标表)中,我有一个主键不是标识列的列,所以我必须手动增加。但它在Code中是不可能的,因为在同一个表上会有多个Thread。如果有的话请给我建议。
public void BulkInsert(DataTable dtTable)
{
DataTable dtProductSold = dtTable;
//creating object of SqlBulkCopy
SqlBulkCopy objbulk = new SqlBulkCopy(ConStr.ToString());
//assigning Destination table name
objbulk.DestinationTableName = "BatchData_InvReportMapping";
//Mapping Table column
objbulk.ColumnMappings.Add("InvPK", "InvPK");
objbulk.ColumnMappings.Add("DateValue", "DateDalue");
objbulk.ColumnMappings.Add("TextValue", "TextValue");
objbulk.ColumnMappings.Add("NumericValue", "NumericValue");
objbulk.ColumnMappings.Add("ErrorValue", "ErrorValue");
//inserting bulk Records into DataBase
objbulk.WriteToServer(dtProductSold);
}
提前致谢,
答案 0 :(得分:0)
评论太长了。
如果您有一个主键列,则在插入行时需要对其唯一和非NULL负责。 SQL Server提供了一个非常方便的机制来帮助解决这个问题,即identity
列。
如果你没有身份,那么我基本上有两种选择:
bulk insert
的默认选项不是触发触发器,因此第二种选择确实不是一个好的选择。
而是将表修改为具有标识主键列。然后在没有主键的情况下在表上定义视图,并将批量插入到视图中。然后将自动分配主键。
编辑:
还有第三种选择,这可能是可行的。将数据加载到临时表中。然后从登台表插入到最终表中,计算主键值。像这样:
insert into finaltable (pk, . . .)
select m.maxpk + seqnum, . . . .
from (select row_number() over (order by (select null)) as seqnum,
. . .
from stagingtable
) s cross join
(select max(pk) as maxpk
from finaltable
) m;
答案 1 :(得分:0)
我有一个想法
通常我们使用表来存储记录,即使你使用前端插入数据,最后它也会存储在表中。所以我建议在表上使用带有insert触发器的序列。这意味着当您首先将数据插入表中时,将调用触发器,序列将递增,增加的值将与表中的其他值一起存储。试试吧。因为在oracle 11g中我们没有身份()因此我们将使用序列并为标识列插入触发器
答案 2 :(得分:0)
创建一个名为id的表。 VARCHAR(50)TableName,INT Id。 当您想要生成id时,请读取相关行并将其增加您想要在同一事务中插入的行数。 您现在可以随时批量插入这些行,而不必担心插入其他线程。 类似于Nhibernates HiLow发电机的工作原理。 http://weblogs.asp.net/ricardoperes/making-better-use-of-the-nhibernate-hilo-generator