sql-server - 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
但是系统在涉及到代码行时返回错误
解决方案
我怀疑问题出在这里:
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
希望这对按位逻辑有所帮助。
推荐阅读
- wordpress - Woocommerce:管理订单列表 - 预览 - 重命名底部按钮
- python - 将字典中的数据转换为行
- php - 通过AJAX在PHP中插入数组数据
- javascript - 如果文件在一行中有多个使用管道(|)fs模块分隔的数据,如何读取文本文件?
- python - 将过滤器应用于 plt.imshow 时出现轴缩放问题
- sql - 检索 belongsTo 模型时 hasMany 超时
- excel - 在特定单元格中开始计数器循环并在特定单元格中结束
- html - 边框样式不适用于粘性位置元素
- wordpress - Wordpress 对帖子的评论 - function.php hack
- java - 显示带有下一个和上一个按钮的 ArrayList Javafx