为什么此数据适配器不会将行插入数据库?



所以我有一种情况,我正在使用sqldataadapter将行插入SQL Server 2014数据库中的表中。

数据的来源是Excel电子表格。

当使用几个用于循环和.columns.add and .Rows.Add填充数据词对象时,插入物正常工作。这个工作代码我在这里不包括。

但是,我正在重构使用OLEDBDATAREDER的代码。这是我的功能:

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的某种基本功能或属性,或者可能在加载期间继承或创建的属性?这是我没想到的吗?当源是手动创建的DataTable而不是OleDbReader填充的DataTable时,为什么我的SqlDataAdapter将数据插入数据库中?

每个DataTable跟踪其行的RowState,因此在循环中手动添加数据是因为它们都是Added(它与手动创建DataTable无关行)。当您从Excel(例如Excel)加载时,它们是添加/新的。

如果您使用DataAdapter填充表,则可以告诉它不是RowState设置为未更改。这对于将数据从一个数据存储迁移到另一个数据非常有用:

myDA.AcceptChangesDuringFill = False
...
rows = myDA.Fill(xlDT)

我遇到了同样的问题,解决方案很简单,一旦您看到了它...我在Visual Studio中有我的数据库及其属性"副本到输出目录"被设置为"始终复制",而不是"不要复制"。因此,每次我运行代码时,数据库都会被删除!

解决方案: - 修改连接字符串,使其直接指向数据库 - 将数据库属性更改为"不复制"

相关内容

  • 没有找到相关文章

最新更新