2015-10-21 25 views
0

(我應該說,即時通訊相當新的vb.net)SqlDataAdapter.Update不更新

我有覆蓋我的數據庫中條目的問題。我認爲問題在於SqlDataAdapter.Update沒有用我創建的新數據表信息正確覆蓋數據庫。

據我瞭解,它應該完全用數據表替換數據庫中的信息,當我告訴它更新...不是?

這裏的果殼中的問題:與表

基本上,我有一個數據庫(.mdf文件),它被稱爲「測試」。我用SqlDataAdapter來創建一個使用'test'的數據集。我從csv中解析出另一個數據表 - 它被稱爲「ToLoad」。我現在要清除「測試」數據表,從csv數據表複製所有條目,然後將其保存到數據庫。

我調試了所有這一切,似乎一切工作正常,除了當我使用SqlDataAdapter.Update我得到一個錯誤告訴我,我不能重複的主鍵。這是因爲在從數據表中輸入新條目之前,舊條目並未完全從數據庫中清除。

我已經檢查過,測試數據表在代碼中實際上已經被清除了......並且它是。 我檢查過,新的csv條目正在被複制到'測試'數據表...他們是。

任何幫助,您可以在此給將真的讚賞

感謝 克雷格

'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")) 

回答

0

我設法使用Google的公平位和一些試驗和錯誤後把這個自己。發佈我的代碼的情況下,這對任何人

克雷格

'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!") 
有用