我试图使用SqlBulkCopy
从我的数据表上传数据。但是,行转到WriteToServer(dt)
之后,系统返回异常
“ ALLOW_ENCRYPTED_VALUE_MODIFICATIONS”附近的语法不正确
我已经尝试添加sqlBulkCopyOptions
,但错误仍然相同。
Dim mapSessionNo As New SqlBulkCopyColumnMapping, mapBatchID As New SqlBulkCopyColumnMapping, mapPolicyID As New SqlBulkCopyColumnMapping, mapUpdateDts As New SqlBulkCopyColumnMapping, mapID As New SqlBulkCopyColumnMapping
Dim bulkcopy As SqlBulkCopy = New SqlBulkCopy(ConnectionString, SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints & SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.UseInternalTransaction)
bulkcopy.DestinationTableName = "BatchUpdateLog"
mapSessionNo = New SqlBulkCopyColumnMapping("SessionNo", "SessionNo")
mapBatchID = New SqlBulkCopyColumnMapping("BatchID", "BatchID")
mapPolicyID = New SqlBulkCopyColumnMapping("PolicyID", "PolicyID")
mapUpdateDts = New SqlBulkCopyColumnMapping("UpdateDts", "UpdateDts")
mapID = New SqlBulkCopyColumnMapping("ID", "ID")
bulkcopy.NotifyAfter = 10000
bulkcopy.ColumnMappings.Add(mapID)
bulkcopy.ColumnMappings.Add(mapSessionNo)
bulkcopy.ColumnMappings.Add(mapBatchID)
bulkcopy.ColumnMappings.Add(mapPolicyID)
bulkcopy.ColumnMappings.Add(mapUpdateDts)
bulkcopy.WriteToServer(dt)
bulkcopy.Close()
我希望整个数据表都将上传到数据库。但是当涉及到WriteToServer
行代码时,系统返回错误
答案 0 :(得分:1)
我怀疑问题出在这里:
Dim bulkcopy As SqlBulkCopy = New SqlBulkCopy(ConnectionString, SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints & SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.UseInternalTransaction)
您正在对SqlBulkCopyOptions
值而不是组合值执行字符串连接。您将Enum
值与按位Or
组合在一起。我怀疑您要按位进行And
,这仍然是错误的。在C#中,&
运算符是按位的And
,但在VB中是字符串连接。应该是:
Dim bulkcopy As SqlBulkCopy = New SqlBulkCopy(ConnectionString, SqlBulkCopyOptions.FireTriggers Or SqlBulkCopyOptions.CheckConstraints Or SqlBulkCopyOptions.KeepIdentity Or SqlBulkCopyOptions.UseInternalTransaction)
编辑:在逻辑上需要一个值和另一个值时,需要使用Or
是有点违反直觉的。但是,如果您了解按位逻辑,则完全合乎逻辑。逐位逻辑基本上是数字值各个位的布尔逻辑。假设您有两个Enum
值,其中一个值为4,另一个值为32。在二进制中,这两个值如下所示:
0000 0100 0010 0000
按位运算对相应的位对起作用,并将1视为TRUE,将0视为FALSE。在布尔逻辑中,如果任一操作数为TRUE,则OR运算的结果为TRUE,否则为FALSE。这意味着,在按位运算中,如果操作数中任意一个对应的位为1,则结果中的一位为1;否则为0。这意味着这两个值的按位OR运算结果为每个操作数在任何地方都为1,其他任何地方都为1:
0010 0100
如果您按位进行AND,则结果将只有一个1,而其他两个操作数在其他所有位置都有1和0。这两个操作数在任何地方都没有1,因此结果全为0:
0000 0000
对于Enums
,您可以使用按位OR进行组合,按位AND进行屏蔽,按位AND NOT进行测试以及按位XOR进行切换。 “掩码”是指除去某些值以外的所有值。例如,假设您有一个与之前相同的Enum
的未知组合,并且想要屏蔽除4和32值以外的所有值。首先将4和32与按位OR组合,然后与当前值进行AND组合。按位AND的结果将为1,两个操作数都为1,因此它在4或32位置只能有1,但是如果原始值确实是1,则在那些位置只有1。如果原始值为:
1010 1010
然后我们将其与:
0010 0100
然后我们得到:
0010 0000
希望这对按位逻辑有帮助。
答案 1 :(得分:0)
SqlBulkCopyOptions.Default
吗?欢呼