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

Error during SqlBulkCopy WriteToServer - Message (Incorrect syntax near 'ALLOW_ENCRYPTED_VALUE_MODIFICATIONS'.))

我正在尝试使用 SqlBulkCopy 从我的数据 table 上传数据。但是在行转到 WriteToServer(dt) 之后系统 returns 出现异常

Incorrect syntax near '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()

我希望整个数据 table 将上传到数据库。但是系统returns在WriteToServer行代码

时出错
  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

干杯

我怀疑问题出在这里:

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。这意味着对这两个值进行按位或运算的结果将具有1 任何一个操作数在其他地方都有 1 和 0:

0010 0100

如果你按位执行 AND 那么结果将只有一个 1,其中两个操作数在其他地方都是 1 和 0。这两个操作数在任何地方都不都是 1,所以结果都是 0:

0000 0000

当涉及Enums时,您使用按位或组合,按位与屏蔽,按位与非测试,按位异或切换。 "mask" 我的意思是删除除某些值之外的所有值。例如,假设您有一个与以前相同的 Enum 的未知组合,您想要屏蔽除 4 和 32 值以外的所有值。您首先将 4 和 32 与按位 OR 组合,然后将其与您的当前值组合。按位与的结果将有一个 1,其中两个操作数都有一个 1,因此它只能在 4 或 32 位置有一个 1,但如果原始值有,它只会在这些位置有一个 1,例如如果原始值为:

1010 1010

我们将其与:

0010 0100

然后我们得到:

0010 0000

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