2017-10-09 79 views
0

存在列为了检查,如果在我的Microsoft Access数据库中的表中存在一列,我写了使用VB.net此代码:检查DataTable中

 Dim conCreate As New OleDb.OleDbConnection(strCnn) 
     conCreate.Open() 
     Dim dbSchemaData As DataTable = conCreate.GetOleDbSchemaTable(OleDb.OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, "Data", "TABLE"}) 
     conCreate.Close() 

     Dim row As DataRow 
     row = dbSchemaData.NewRow() 

       For arrItem As Integer = 0 To arrLine.Length - 1 

        If arrLine(arrItem) = "Image Filename with Full Path" And row.Table.Columns.Contains("Tif") = False Then 

         Dim cmdCol As New OleDb.OleDbCommand("ALTER TABLE [Data] ADD COLUMN [Tif] VARCHAR(255)", conCreate) 
         conCreate.Open() 
         cmdCol.ExecuteNonQuery() 
         conCreate.Close() 

        ElseIf arrLine(arrItem) = "Image side" And row.Table.Columns.Contains("Voorkant") = False Then 

         Dim cmdCol As New OleDb.OleDbCommand("ALTER TABLE [Data] ADD COLUMN [Voorkant] BIT", conCreate) 
         conCreate.Open() 
         cmdCol.ExecuteNonQuery() 
         conCreate.Close() 

        ElseIf arrLine(arrItem) = "Image size (bytes)" And row.Table.Columns.Contains("Bestandsgrootte") = False Then 

         Dim cmdCol As New OleDb.OleDbCommand("ALTER TABLE [Data] ADD COLUMN [Bestandsgrootte] NUMERIC", conCreate) 
         conCreate.Open() 
         cmdCol.ExecuteNonQuery() 
         conCreate.Close() 

        ElseIf row.Table.Columns.Contains(arrLine(arrItem)) = False Then 

         Dim cmdCol As New OleDb.OleDbCommand("ALTER TABLE [Data] ADD COLUMN [" & arrLine(arrItem) & "] VARCHAR(255)", conCreate) 
         conCreate.Open() 
         cmdCol.ExecuteNonQuery() 
         conCreate.Close() 

        End If 

       Next  

但运行此同时,例如第一列(名为Tif)已经存在,它仍会尝试添加它并继续在System.Data.dll中提供异常'System.Data.OleDb.OleDbException'(“表'数据'中已存在'字段'Tif'')。 ),停止循环。

任何帮助,将不胜感激!

+0

有什么异常? – Jaxi

+0

System.Data.dll中的'System.Data.OleDb.OleDbException'(“表'数据'中已存在'Tif'字段。”) –

+0

您是否使用过调试器并查看了Columns属性以查看它包含的数据?可能是因为Columns属性没有正确填充。 – Jaxi

回答

0

我最终自己解决了这个问题。我所需要的只是使用DataRow来填充数组,并查看当前项目是否包含在其中。

这里是谁的兴趣的人的代码:

conCreate.Open() 
Dim schemaColumn As DataTable = conCreate.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, New Object() {Nothing, Nothing, "Data"}) 
conCreate.Close()    

For arrItem As Integer = 0 To arrLine.Length - 1 

    Dim colCheck As Boolean 
    Dim rowArr As New ArrayList() 

    For Each row As DataRow In schemaColumn.Rows 

     rowArr.Add(row("COLUMN_NAME")) 

    Next 

    If rowArr.Contains(arrLine(arrItem)) Then 

     colCheck = False 

    Else 

     colCheck = True 

    End If 

    If colCheck = True Then 

     Dim cmdCol As New OleDb.OleDbCommand("ALTER TABLE [Data] ADD COLUMN [" & arrLine(arrItem) & "] VARCHAR(255)", conCreate) 
     conCreate.Open() 
     cmdCol.ExecuteNonQuery() 
     conCreate.Close() 

    End If 

Next