kyrons Ответов: 3

Как добавить столбец и игнорировать существующий столбец в ms access dbase?


The scenario is this. I have an existing ms access database. Inside the database has Table1. Assuming that I do not know what columns or existing columns are there already. My program using vb.net form, in just one click of a button I can add all columns like name, salary, address, daterec, and updated. No problem in there adding all those columns since they are not existing in Table1. My problem is in some databases Table1, some columns/fields are already exist like salary and address, I want to add columns name, daterec and updated but it gave me an error "Field 'name' already exists in Table 'Table1'. What should I do? I just want to add those columns who are not yet existing in Table1. I want to ignore those existing columns and proceed adding those missing columns. Any suggestions are very much appreciated.

Ниже приведен код, который может добавлять столбцы и для модификации. Спасибо.

Что я уже пробовал:

[code] 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[/code]

3 Ответов

Рейтинг:
7

codejet

'Procedure to execute sql to add columns 
Private Sub AddTblColumn (ColName As String, ColDataType As String, Conn As OleDbConnection )
 Dim SQLAdd As String = "ALTER TABLE Table1 ADD COLUMN " & ColName & " " & ColDataType
 Dim Cmd As OleDbCommand = New OleDbCommand (SQLAdd, Conn) 
Cmd.ExecuteNonQuery() 
End Sub  

Dim ConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data 
 Source=|DataDirectory|addcolumn.accdb"
Dim Conn As OleDbConnection = New OleDbConnection (ConnString) 
Conn.Open

' Get empty datatable to retrieve all columns 
Dim daEmpty As OleDbDataAdapter = New OleDbDataAdapter("SELECT * FROM addcolumn WHERE 1= 0",ConnString)
Dim dtEmpty As DataTable = New DataTable () 
daEmpty.Fill(dtEmpty) 

' Get list of all columns that exist 
Dim LstCurrentCols As List(Of String) = New List (Of String) 
 For Each Col As DataColumn In dtEmpty.Columns
     Dim ColName As String = Col.ColumnName
     LstCurrentCols.Add(ColName) 
 Next

If LstColCurrent.Contains("Name") = False Then
AddTblColumn("name", "Text (250)", Conn) 
End If 

If LstColCurrent.Contains("salary") = False Then
    AddTblColumn("salary", "Number", Conn) 
End If 

If LstColCurrent.Contains("address") = False Then
    AddTblColumn("address", "memo", Conn) 
End If 

If LstColCurrent.Contains("daterec") = False Then
    AddTblColumn("daterec", "DateTime", Conn) 
End If

If LstColCurrent.Contains("updated") = False Then
    AddTblColumn("updated", "YesNo", Conn) 
End If


Надеюсь, это поможет


Рейтинг:
27

Maciej Los

[РЕДАКТИРОВАТЬ]
Решение мэдмайча навело меня на одну мысль...

Мне лень объяснять... Вот такая реализация:

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

Dim FieldsToAdd As List(Of String)  = New List(Of String) From {"name Text(250)", "salary number", "address Memo", "datarec DateTime", "updated YesNo"}
Dim dt As DataTable = New DataTable()
Dim existingCols As List(Of String) 

Try
		Dim sCommand As String = "SELECT * FROM Table1;"
        Using conn As New OleDbConnection(connString)
            conn.Open()
            Using cmd As New OleDbCommand(sCommand, conn)
                Using reader AS OleDbDataReader = cmd.ExecuteReader()
					dt.Load(reader)
				End Using
				existingCols = dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName).ToList()
			End Using
		    For Each f As String In FieldsToAdd
				Dim s As String = f.Split(" ")(0)
				If existingCols.Contains(s) Then
					Console.WriteLine(String.Format("Field '{0}' already exists!", s))
				Else
					sCommand = String.Format("AlTER TABLE Table1 ADD COLUMN {0};", f)	
		            Using cmd As New OleDbCommand(sCommand, conn)
						cmd.ExecuteNonQuery()
						Console.WriteLine(String.Format("column '{0}' has been added!", colsToAdd.Count))
					End Using
				End If
		    Next 
			conn.Close()
        End Using
Catch Ex As Exception
    Console.WriteLine(Ex.Message)
End Try


Кстати: Пожалуйста, прочтите это: Список зарезервированных слов в Access - Office | Microsoft Docs[^]


kyrons

Спасибо за вашу помощь, мой друг, но это не работает. Если я сотру некоторые столбцы и добавлю их снова, это не сработает. Я думаю, что ваш код каким-то образом похож на выполнение "On error Resume Next", что он не отображает и не запрашивает сообщение об ошибке. Любое предложение, пожалуйста.

kyrons

Появилась та же ошибка. Поле 'name' уже существует в таблице 'Table1'. Любые изменения, пожалуйста.

kyrons

Почему, если я удаляю "имя", он продолжает добавлять некоторые столбцы, но если он все еще там, то столбцы не добавляются? Я думаю, что "имя" - это то, которое распознается, что если оно существует, вы не можете добавлять столбцы.

Maciej Los

Пожалуйста, смотрите обновленное решение.

MadMyche

+5

Maciej Los

Спасибо.

Рейтинг:
1

MadMyche

Что бы я сделал, так это разбил бы вашу рутину на отдельные части. ALTER TABLE команды, а также обернуть выполнение запроса в Try...Catch блокируйте так, чтобы код продолжался, если одно или несколько полей уже существуют.

Open conn
try 
   command = "ALTER Table Add Column NewColumn1 DataType"
   execute
catch
  // NewColumn1 already exists
try 
   command = "ALTER Table Add Column NewColumn2 DataType"
   execute
catch
  // NewColumn2 already exists
Вариация вышеприведенного метода снова сможет использовать try-catch; но на этот раз попробуйте выполнить инструкцию select, ищущую этот столбец по имени, и в блоке catch вы запустите инструкцию ALTER
Open conn
try 
   command = "SELECT NewColumn1 FROM Table"
   execute
catch
  command = "ALTER Table Add Column NewColumn1 DataType"
   execute
// repeat for other columns


Maciej Los

Ты подал мне идею. Пожалуйста, смотрите обновленное решение.

MadMyche

Выглядеть хорошо

Maciej Los

;)