加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

.net – 为什么这个DataAdapter不会将行插入数据库?

发布时间:2021-01-19 07:01:05 所属栏目:编程 来源:网络整理
导读:以是我有一种环境,我行使SqlDataAdapter将行插入SQL Server 2014数据库中的表. 数据来历是Excel电子表格. 行使一些For轮回和.Columns.Add和.Rows.Add添补DataTable工具以从Excel事变表复制数据时,插入事变正常.这个事变代码我没有包括在这里. 可是,我正在重构

以是我有一种环境,我行使SqlDataAdapter将行插入SQL Server 2014数据库中的表.

数据来历是Excel电子表格.

行使一些For轮回和.Columns.Add和.Rows.Add添补DataTable工具以从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

当我调试时,从函数返回的DataTable包括荟萃中的数据,不然看起来与先前版本的代码中的DataTable沟通.以下是.Update数据库的代码.这两种环境的代码都没有变革.

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","S_ORDER")
            .InsertCommand.Parameters.Add("C_ORDER","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的某些根基成果或属性,可能是在Load时代担任或建设的属性?这是我还没有想到的其他工作吗?当源是手动建设的DataTable而不是OleDbReader添补的DataTable时,为什么我的SqlDataAdapter将数据插入数据库?

办理要领

每个DataTable都跟踪其行的RowState,因此在轮回中手动添加数据是有用的,由于它们都已添加(它与手动建设DataTable无关 – 它与行有关).从Excel等其他来历加载时,不会添加/新添加它们.

假如行使DataAdapter添补表,则可以汇报它不要将RowState配置为Unchanged.这对付将数据从一个数据存储迁徙到另一个数据存储很是有效:

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

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读