Sql 创建具有相同列名和列数据类型的数据表的新版本
通过创建具有相同表且表具有相同列数据类型的相同列名的新.accdb,将表从.mdbs转换为.accdbs。使用OleDB和sql执行OnQuery。当我尝试将旧数据表列中的相同数据类型用于新列时,出现了问题。我带了满满一张桌子Sql 创建具有相同列名和列数据类型的数据表的新版本,sql,vb.net,Sql,Vb.net,通过创建具有相同表且表具有相同列数据类型的相同列名的新.accdb,将表从.mdbs转换为.accdbs。使用OleDB和sql执行OnQuery。当我尝试将旧数据表列中的相同数据类型用于新列时,出现了问题。我带了满满一张桌子 adp.Fill(dTable) 下面的代码给了我关于除varchar之外的不同数据类型的列的问题 Public Sub ConvertTable(dTable As DataTable, tableName As String) Dim i As Int16
adp.Fill(dTable)
下面的代码给了我关于除varchar之外的不同数据类型的列的问题
Public Sub ConvertTable(dTable As DataTable, tableName As String)
Dim i As Int16 = 0
Dim j As Int16 = 0
strConnOutput = SharedRoutines.GetAccessACEConnectionString(aceDatabase)
Using con2 As New OleDbConnection(strConnOutput)
con2.Open()
Dim sqlText As String = ""
'Set up query to create a table with the same name as the'
'spreadsheet.'
sqlText = "CREATE TABLE [" & tableName & "] ("
'Create all the columns that exist in the spreadsheet.'
For Each col As DataColumn In dTable.Columns
sqlText &= "[" & col.ColumnName & "] varchar, "
Next
'Clean up the end of the CREATE query.'
sqlText = sqlText.Substring(0, sqlText.Length - 2) & ")"
Using cmValid As New OleDbCommand(sqlText, con2)
cmValid.ExecuteNonQuery()
End Using
'Set the INSERT SQL query for the data in the spreadsheet.'
sqlText = "INSERT INTO [" & tableName & "] ("
'Add all the columns to the INSERT query.'
For Each col As DataColumn In dTable.Columns
sqlText &= "[" & col.ColumnName & "], "
Next
'Clean up the end of the query string and prepare for the parameters.'
sqlText = sqlText.Substring(0, sqlText.Length - 2) & ") VALUES ("
'Add all the parameter placeholders to the INSERT query.'
For Each col As DataColumn In dTable.Columns
sqlText &= "?, "
Next
'Clean up the end of the INSERT query.'
sqlText = sqlText.Substring(0, sqlText.Length - 2) & ")"
Try
'Loop through all the rows of data in the spreadsheet.'
For Each rw As DataRow In dTable.Rows
Using cmValid As New OleDbCommand(sqlText, con2)
'Add a parameter for each column.'
For Each col As DataColumn In dTable.Columns
cmValid.Parameters.Add(New OleDbParameter(col.ColumnName, rw(col.ColumnName)))
Next
'Send data to the new table.'
cmValid.ExecuteNonQuery()
End Using
Next
Catch ex As Exception
j += 1
convertResponse &= tableName & " from " & aceDatabase & " was not completed."
MessageBox.Show(tableName & " from " & aceDatabase & " was not completed. Message:" & ex.ToString)
End Try
dTable.Dispose()
i += 1
convertResponse &= "Table " & tableName & " was added to " & aceDatabase & ControlChars.CrLf
End Using
End Sub
我更改了每个循环的
For Each col As DataColumn In dTable.Columns
sqlText &= "[" & col.ColumnName & "] " & col.DataType.ToString & ", "
Next
但是现在executeNonQuery()抛出了一个语法错误。它不是col.dataType.Tostring吗?
带varchar的SqlText
创建表[BASIC_DESCRIPTION]([ColumnName]varchar,[Order]varchar)
和…比起来
创建表[BASIC_DESCRIPTION]([ColumnName]System.String,[Order]System.Int32)
我的问题是,我需要在sqlText中输入什么来确保创建的新列与旧表的类型相同?我找到的最接近的答案是这个。
我不是一个VB.NET的家伙,但我会尝试放弃.ToString并希望它是隐式的,或者让它成为.ToString(),因为它是一个方法调用。从中创建了一个GetDBType函数并执行了ToString
'Create all the columns that exist in the spreadsheet.'
For Each col As DataColumn In dTable.Columns
Dim colSQLType As SqlDbType = GetDBType(col.DataType)
Dim colType As String = colSQLType.ToString
sqlText &= "[" & col.ColumnName & "] " & colType & ", "
Next
列名与数据类型完全不同。您可以/应该从与第二个表相关的任何数据库中读取模式;让NET来构建DTS,所以问题不在于varchar?我不知道,您实际上没有展示如何构建第二个表。我的水晶球说您只是在循环中添加了DataColumns,而没有指定创建text/string/varchar列的类型;因此,当列数据是其他数据时,会出现错误。它会很好地创建表。我只想确保列的数据类型相同。该错误与ExecuteOnQuery()中的sqlText一起引发。如果在表中放置了错误类型的列,则该表将不正常。