You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqlBulkCopy WriteToServer遇计算字段报错,未包含仍触发问题

问题原因分析

问题出在你的DataTable里依然包含那些计算列——哪怕生成的SELECT语句没拉取这些列,只要DataTable中存在对应列名的字段,SqlBulkCopy默认会按列名自动匹配目标SQL Server表,尝试往计算列中插入数据,直接触发“计算列无法修改”的报错。

具体解决办法

办法1:从DataTable中移除计算列

在调用BulkUpdate_DataMS之前,先把DataTable里属于计算列的字段删掉,复用你之前筛选非计算列的逻辑即可:

' 先获取所有非计算列的名称列表
Dim DR() As DataRow = MSSQLDT.Select("Computed = 'N'")
Dim nonComputedColumns As List(Of String) = DR.Select(Function(r) r("Name").ToString()).ToList()

' 倒序遍历DataTable列(避免索引错乱),移除不在非计算列表中的列
For i As Integer = DT.Columns.Count - 1 To 0 Step -1
    If Not nonComputedColumns.Contains(DT.Columns(i).ColumnName) Then
        DT.Columns.RemoveAt(i)
    End If
Next

' 再调用批量插入函数
BulkUpdate_DataMS(DT, HOAID, IsHASoftware, TableName)

办法2:给SqlBulkCopy显式指定列映射

修改BulkUpdate_DataMS函数,手动添加仅包含非计算列的映射规则,避免自动匹配所有列:

Public Function BulkUpdate_DataMS(DT As DataTable, HOAID As Integer, IsHASoftware As Boolean, TableName As String, nonComputedColumns As List(Of String)) As Boolean
Try
    Using Conn As New Microsoft.Data.SqlClient.SqlConnection
        Conn.ConnectionString = If(IsHASoftware, HASConString, ReturnConnStringMS(HOAID))
        Conn.Open()
        Using vTrans = Conn.BeginTransaction
            Using vBulk As New Microsoft.Data.SqlClient.SqlBulkCopy(Conn, Microsoft.Data.SqlClient.SqlBulkCopyOptions.Default, vTrans)
                vBulk.DestinationTableName = TableName
                ' 仅映射非计算列
                For Each colName In nonComputedColumns
                    vBulk.ColumnMappings.Add(colName, colName)
                Next
                vBulk.WriteToServer(DT)
            End Using
            vTrans.Commit()
        End Using
    End Using
    Return True
Catch ex As Exception
    EmailError(ex, 222, PageName)
    Return False
End Try
End Function
额外检查点
  • 确认MSSQLDT.Select("Computed = 'N'")的筛选逻辑正确:有没有计算列被误标记为'N',或者非计算列被漏选的情况。可以打印生成的SELECT语句和DataTable的列名列表,对比验证一致性。
  • 检查目标SQL Server表的计算列属性:如果计算列设置了PERSISTED且允许更新,也可以调整表结构,但这种方式不推荐,会破坏计算列的设计初衷。

内容的提问来源于stack exchange,提问作者gchq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:39:59