首页 > 解决方案 > SqlBulkCopy WriteToServer 期间出错 - 消息(“ALLOW_ENCRYPTED_VALUE_MODIFICATIONS”附近的语法不正确。))

问题描述

我试图使用从我的数据表上传数据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但是系统在涉及到代码行时返回错误

标签: sql-servervb.netsqlbulkcopyvisual-studio-2019

解决方案


我怀疑问题出在这里:

Dim bulkcopy As SqlBulkCopy = New SqlBulkCopy(ConnectionString, SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints & SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.UseInternalTransaction)

您正在对值执行字符串连接SqlBulkCopyOptions而不是组合。您将Enum值与按位组合Or。我怀疑您要进行 bitwise 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。这意味着对这两个值进行按位或运算的结果将具有1 任何一个操作数在其他任何地方都有一个 1 和一个 0:

0010 0100

如果您执行按位 AND,那么结果将只有 1,而两个操作数在其他任何地方都有 1 和 0。这两个操作数在任何地方都没有 1,因此结果将全为 0:

0000 0000

说到Enums,您使用按位 OR 进行组合,按位 AND 进行掩码,按位 AND NOT 进行测试,并使用按位 XOR 进行切换。通过“掩码”,我的意思是删除除某些值之外的所有值。例如,假设您有一个与Enum以前相同的未知组合,并且您想屏蔽除 4 和 32 之外的所有值。您首先将 4 和 32 与按位 OR 组合,然后将其与您的当前值相结合。按位与的结果将有一个 1,其中两个操作数都有一个 1,因此它只能在 4 或 32 位置有一个 1,但如果原始值有,它只会在这些位置有 1,例如,如果原始值为:

1010 1010

我们将其与:

0010 0100

然后我们得到:

0010 0000

希望这对按位逻辑有所帮助。


推荐阅读