SqlBulkCopy WriteToServer期间出错-消息(“ ALLOW_ENCRYPTED_VALUE_MODIFICATIONS”附近的语法不正确。)

时间:2019-07-25 23:28:26

标签: sql-server vb.net sqlbulkcopy visual-studio-2019

我试图使用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行代码时,系统返回错误

2 个答案:

答案 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)

  1. 您尝试过SqlBulkCopyOptions.Default吗?
  2. 或者ALLOW_ENCRYPTED_VALUE_MODIFICATIONS用户属性如何? https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-user-transact-sql?view=sql-server-2017

欢呼