所以我有一种情况,我正在使用SqlDataAdapter将行插入到SQL Server 2014数据库中的表中。为什么DataAdapter不能将行插入数据库?
数据的来源是Excel电子表格。
当DataTable对象使用几个For循环和.Columns.Add和.Rows.Add来复制Excel表格中的数据时,插入工作正常。这个工作代码我没有包括在这里。
但是,我重构代码以使用OleDbDataReader。这里是我的功能:
Private Function FillDataTable(path As String, name As String) As DataTable
Dim fullpath As String = path
Dim wsname As String = name
Dim dt = New DataTable()
Try
Dim connectionstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" & fullpath & "';Extended Properties= 'Excel 8.0;HDR=Yes;IMEX=1'"
Dim commandstring As String = "Select * From " & wsname
Using con As New OleDbConnection(connectionstring)
Using cmd As New OleDbCommand(commandstring, con)
con.Open()
Using dr As OleDbDataReader = cmd.ExecuteReader()
With dt
For Each c In aryFieldList
.Columns.Add(c.FieldName, ConvertType(c.DataType))
Next
.Columns.Add("SubmID")
.Columns("SubmID").DefaultValue = 0
.Columns.Add("S_ORDER")
.Columns("S_ORDER").DefaultValue = 0
.Columns.Add("C_ORDER")
.Columns("C_ORDER").DefaultValue = 0
End With
dt.Load(dr)
End Using
End Using
End Using
Catch ex As Exception
MsgBox(ex.Message)
End Try
Return dt
End Function
当我调试,数据表是从函数返回有数据的集合,否则似乎等同于以前版本的代码的数据表。以下是更新数据库的代码。对于这两种情况,该代码是不变的。
Dim dt = New DataTable()
dt = FillDataTable(fullpath, wsname)
Using cn = New SqlConnection(ConfigurationManager.ConnectionStrings("Connection").ConnectionString)
cn.Open()
Using adp = New SqlDataAdapter()
Dim sb As New StringBuilder
[...StringBuilder code to build the Insert command here...]
Dim cmd As New SqlCommand(sb.ToString, cn)
With adp
.InsertCommand = cmd
.InsertCommand.Parameters.Add("SubmID", SqlDbType.Int, 1, "SubmID")
.InsertCommand.Parameters.Add("S_ORDER", SqlDbType.Int, 1, "S_ORDER")
.InsertCommand.Parameters.Add("C_ORDER", SqlDbType.Int, 1, "C_ORDER")
For Each p In aryFieldList
If p.Excluded = False Then
.InsertCommand.Parameters.Add(p.FieldName, p.DataType, p.Length, p.FieldName)
End If
Next
adp.Update(dt)
End With 'adp
End Using 'adp
End Using 'cn
没有发生任何异常。调试adp.Update(dt)行没有延迟,就好像查询根本没有执行一样。这是我注意到在添加DT和OleDB填充DT的行/列之间唯一的区别 - 数据成功插入后,存在一个小的延迟时间。
我是否缺少DataTable
的某种基本功能或属性,或者可能是在加载期间继承或创建的属性?这是我还没有想到的其他东西吗?为什么我的SqlDataAdapter
将数据插入数据库时,手动创建的是DataTable
,而DataTable
由OleDbReader
填充?
一个'DataTable'跟踪每一行的'RowState',所以手动添加循环工作,因为他们都是'Added'。如果您从其他来源加载,则不会添加/新增。 (仍涉及通过该代码) – Plutonix
您是否尝试过使用cmd.ExecuteNonQuery而不是adp.update? – Benno
如果使用dataadapter填充表格,则可以使用'myDA.AcceptChangesDuringFill = False',这样行状态标志不会被清除 – Plutonix