簡體   English   中英

如何使用 vb.net 添加缺失列並忽略 ms access dbase 中的現有列?

[英]How to add missing columns and ignoring existing columns in ms access dbase with vb.net?

場景是這樣的。 我有一個現有的 ms 訪問數據庫。 數據庫里面有Table1。 假設我不知道已經存在哪些列或現有列。 我的程序使用 vb.net 形式,只需單擊一個按鈕,我就可以添加所有列,如姓名、薪水、地址、日期和更新。 添加所有這些列沒有問題,因為它們在 Table1 中不存在。 我的問題是在某些數據庫 Table1 中,一些列/字段已經存在,例如薪水和地址,我想添加列名稱、daterec 和更新,但它給了我一個錯誤"Field 'name' already exists in Table 'Table1' 。什么我應該怎么做?我只想添加那些尚未在 Table1 中存在的列。我想忽略那些現有的列並繼續添加那些缺少的列。非常感謝任何建議。

下面是可以添加列和進行修改的代碼。 謝謝你。

Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|addcolumn.accdb"


    Dim SqlString As String = "ALTER TABLE Table1 ADD COLUMN " + "name Text(250)," + "salary Number," + "address Memo," + "daterec DateTime," + "updated YesNo" 'Datatypes: Text is ShortText, Number is Number(Double), Memo is LongText, DateTime is Date or/and Time, YesNo is either checkbox/True or False/On or Off depends in saving format .
    Using conn As New OleDbConnection(ConnString)
        Using cmd As New OleDbCommand(SqlString, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using

我不打算提供答案,因為我認為這個問題沒有表現出足夠的努力,但是,由於接受的答案不是我認為可取的,我覺得我需要這樣做。 這段代碼執行了我在這里和其他地方的相同問題的建議,並且應該按原樣工作,盡管我只測試了不同的文件、表和列名。

Dim tableName = "Table1"

Using connection As New OleDbConnection($"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\addcolumn.accdb")
    connection.Open()

    'Get a DataTable containing information about all columns in the specified table.
    Dim schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
                                                     {Nothing, Nothing, tableName})

    'Create a list of all new column names and data types to add.
    Dim dataTypesByColumnName As New Dictionary(Of String, String) From {{"name", "Text(250)"},
                                                                         {"salary", "Number"},
                                                                         {"address", "Memo"},
                                                                         {"daterec", "DateTime"},
                                                                         {"updated", "YesNo"}}

    'Get a list of the column names already in the table.
    Dim existingColumnNames = schemaTable.AsEnumerable().
                                          Select(Function(row) row.Field(Of String)("COLUMN_NAME")).
                                          ToArray()

    'Create a list of column definition snippets to insert into SQL code, e.g. "columnName DataType".
    Dim columnSnippets = dataTypesByColumnName.Keys.Except(existingColumnNames).
                                                    Select(Function(key) String.Format("{0} {1}", key, dataTypesByColumnName(key))).
                                                    ToArray()

    If columnSnippets.Any() Then
        'Construct the full SQL statement.
        Dim sql = String.Format("ALTER TABLE {0} ADD COLUMN {1}", tableName, String.Join(", ", columnSnippets))

        Dim command As New OleDbCommand(sql, connection)

        'Execute the single SQL statement against the database.
        command.ExecuteNonQuery()
    End If
End Using

它從數據庫中獲取現有列的列表,從列表中排除要添加的列,然后使用單個 SQL 語句添加 rest。

這里的挑戰是你注意到的? 有些字段可能存在,有些可能不存在。 因此,您必須逐個字段地測試+添加

像這樣的東西應該工作:

Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

    Dim strCon As String
    strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\test44.accdb"

    Using dbCon As New OleDbConnection(strCon)
        dbCon.Open()
        AddFieldExist("table1", "name", "Text(250)", dbCon)
        AddFieldExist("table1", "Salary", "number", dbCon)
        AddFieldExist("table1", "Address", "memo", dbCon)
        AddFieldExist("table1", "Address", "memo", dbCon)
        AddFieldExist("table1", "DateRec", "datetime", dbCon)
        AddFieldExist("table1", "Upated", "YesNo", dbCon)

    End Using

End Sub

Sub AddFieldExist(strTable As String,
                    strField As String,
                    strType As String,
                    dbCon As OleDb.OleDbConnection)

    ' return true/false if field exist.

    Dim tblDef As New DataTable
    Dim oReader As New OleDbDataAdapter("SELECT TOP 1 * FROM " & strTable, dbCon)
    oReader.Fill(tblDef)

    If tblDef.Columns.IndexOf(strField) = -1 Then
        ' add field
        Dim strSQL As String = "ALTER TABLE " & strTable & " ADD COLUMN " & strField & " " & strType
        Dim cmd As New OleDbCommand(strSQL, dbCon)
        cmd.ExecuteNonQuery()
    End If

End Sub

該代碼確實假設有問題的表確實有數據。 如果沒有,那么您可能必須在此處介紹 getSchema,但就目前而言,以上就是我的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM