SqlDataAdapter.Update 没有更新

SqlDataAdapter.Update not updating

(我应该说我是 vb.net 的新手)

我在覆盖数据库中的条目时遇到问题。我认为问题是 SqlDataAdapter.Update 没有用我创建的新数据 table 信息正确覆盖数据库。

据我了解,当我告诉它更新时,它应该完全用数据替换数据库中的信息table...不是吗?

问题简述如下:

基本上,我有一个数据库(.mdf 文件),里面有一个 table,叫做 'test'。我使用 SqlDataAdapter 使用 'test' 创建了一个数据集。我有另一个数据table,是我通过在 csv 中解析得到的——它叫做 'ToLoad'。我现在想清除 'test' 数据 table,复制 csv 数据 table 中的所有条目,然后将其保存到数据库中。

我已经调试了所有这些,一切似乎都正常,除了当我使用 SqlDataAdapter.Update 时,我收到一条错误消息,告诉我无法复制主键。这是因为在从数据table.

输入新条目之前,旧条目并未从数据库中完全清除。

我检查过测试数据table 实际上在代码的早期就被清除了……确实如此。 我检查过新的 csv 条目是否被复制到 'test' 数据 table... 而且它们是。

如果您能提供任何帮助,我们将非常感谢

谢谢 克雷格

'MAKE A NEW SQL CONNECTION
Dim DBConnection As New SqlConnection

'SET THE CONNECTION STRING.
DBConnection.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Project\Members.mdf;Integrated Security=True"

'OPEN THE CONNECTION TO THE DATABASE
DBConnection.Open()

'OPEN AN ADAPTER AND SELECT EVERYTHING FROM THE 'TEST' TABLE
Dim mySqlDataAdapter As New SqlDataAdapter("SELECT * FROM Test", DBConnection)
Dim mySqlCommandBuilder As New SqlCommandBuilder(mySqlDataAdapter)





Dim DBDataset As DataSet = New DataSet

'FILL THE DATASET WITH THE TEST TABLE  
 mySqlDataAdapter.Fill(DBDataset, "Test")

'CLEAR ALL ENTRIES IN THE DATATABLE (SO I CAN FILL IT FROM SCRATCH)
 DBDataset.Tables("test").Clear()





 ''SET UP A LOOP TO ADD EACH RECORD FROM THE CSV DATATABLE TO THE DATABASE DATATABLE

  Dim CSV_row_number As Int16
  CSV_row_number = ds.Tables("toload").Rows.Count


  Dim i As Int16   
  i = 0
       Do Until i = CSV_row_number - 1


            'MAKES TWO NEW DATAROW OBJECTS
            Dim DB_row As DataRow
            Dim CSV_row As DataRow

            'SET THE CSV_ROW OBJECT EQUAL TO ROW(i) OF THE CSV DATATABLE
            CSV_row = ds.Tables("toload").Rows(i)

            DB_row = DBDataset.Tables("test").NewRow()

            'THIS SETS ALL OF THE COLUMNS IN THIS NEW ROW AS EQUAL TO ROW1 IN THE CSV DATATABLE
            DB_row("Name") = CSV_row("Name")
            DB_row("Quality") = CSV_row("Address")
            DBDataset.Tables("test").Rows.Add(DB_row)

            i = i + 1

        Loop



 mySqlDataAdapter.Update(DBDataset.Tables("Test"))

经过大量谷歌搜索和反复试验后,我设法自己解决了这个问题。发布我的代码以防它对其他人有用

克雷格

 'MAKE A NEW SQL CONNECTION
    Dim DBConnection As New SqlConnection

    'SET THE CONNECTION STRING. YOU GET THIS BY GOING TO SERVER EXPLORER, THEN CLICKING ON THE DATABASE
    'THE CONNECTION STRING IS IN PROPERTIES 
    DBConnection.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\ME\Project\Members.mdf;Integrated Security=True"

    'OPEN THE CONNECTION TO THE DATABASE
    DBConnection.Open()



    'THIS OPENS AN ADAPTER TO THE DATABASE, AND SELECTS EVERYTHING FROM THE 'TEST' TABLE IN THAT DATABASE
    Dim mySqlDataAdapter As New SqlDataAdapter("SELECT * FROM MemberList", DBConnection)
    'THIS LETS US USE SQL ON THE DATATABLE (IT GETS PASSED THE ABOVE SQL STATEMENT)
    Dim mySqlCommandBuilder As New SqlCommandBuilder(mySqlDataAdapter)


    'THIS MAKES ANOTHER NEW DATASET 
    Dim DBDataset As DataSet = New DataSet


    ''THIS FILLS THAT DATASET WITH THE TEST TABLE (WHICH THE DATA ADAPTOR GRABBED ABOVE) 
    mySqlDataAdapter.FillSchema(DBDataset, SchemaType.Source, "MemberList")
    mySqlDataAdapter.Fill(DBDataset, "MemberList")


    'THIS MAKES A NEW DATATABLE 
    'I THEN MAKE ALL CHANGES NEEDED 

    Dim EDITmembers As DataTable
    EDITmembers = DBDataset.Tables("MemberList")


    ''FIRST, IM GOING TO CLEAR ALL ENTRIES IN THE DATATABLE (SO I CAN FILL IT FROM SCRATCH)

    'COUNT THE NUMBER OF ENTRIES TO CLEAR
    Dim RowsInDB As Integer
    RowsInDB = EDITmembers.Rows.Count()

    'SET UP A LOOP TO CLEAR THEM
    Dim Data_row As DataRow
    Dim k As Integer = 0

    Do Until k = RowsInDB

        Data_row = EDITmembers.Rows(k)

        Data_row.Delete()

        k = k + 1

    Loop

    'ONCE ALL THE ROWS ARE CLEARED, SAVE THE CHANGES BY UPDATING THE ACTUAL DATABASE
    mySqlDataAdapter.Update(DBDataset, "MemberList")





    ''THEN I SET UP A LOOP TO ADD EACH RECORD FROM THE CSV DATATABLE TO THE DATABASE DATATABLE
    ''I FIRST NEED TO KNOW HOW MANY ITERATIONS OF THE LOOP TO DO

    Dim CSV_row_number As Int16
    'COUNT THE NUMBER OF ROWS AND SET THE ABOVE INT EQUAL TO THIS
    CSV_row_number = ToLoad.Rows.Count


    Dim j As Int16   
    j = 0
    Do Until j = CSV_row_number - 1


        'THIS MAKES TWO NEW DATAROW OBJECTS
        Dim DB_row As DataRow
        Dim CSV_row As DataRow

        'THIS SETS THE CSV_ROW OBJECT EQUAL TO THE FIRST ROW OF THE CSV DATATABLE
        CSV_row = ToLoad.Rows(j)


        'THIS SETS DB_ROW EQUAL TO A NEW ROW IN THE DATATABLE MADE FROM THE DATABASE
        DB_row = EDITmembers.NewRow()

        'THIS SETS ALL OF THE COLUMNS IN THIS NEW ROW AS EQUAL TO THE CORRESPONDING ROW IN THE CSV DATATABLE
        DB_row("Contact Name") = CSV_row("Contact Name")
        DB_row("Do not mail") = CSV_row("Do not mail")
        DB_row("Membership Type") = CSV_row("Membership Type")
        DB_row("Street Address") = CSV_row("Street Address")
        DB_row("Supplemental Address 1") = CSV_row("Supplemental Address 1")
        DB_row("Supplemental Address 2") = CSV_row("Supplemental Address 2")
        DB_row("City") = CSV_row("City")
        DB_row("Postal Code") = CSV_row("Postal Code")
        DB_row("Email") = CSV_row("Email")
        DB_row("Phone (primary)") = CSV_row("Phone (primary)")


        EDITmembers.Rows.Add(DB_row)

        j = j + 1

    Loop




   'UPDATE THE DATABASE WITH ALL THE CHANGES
    mySqlDataAdapter.Update(DBDataset, "MemberList")
    MessageBox.Show("done!")