2013-09-18 4 views
0

У меня есть процедура в VB.net, которая при запуске определяет, существует ли таблица или нет. Если этого не существует, я хочу создать таблицу на SQL Server с той же схемой, что и локальная таблица FoxPro. Это что-то, что можно сделать?Создать новую таблицу на SQL Server с другой схемой таблицы

Вот что у меня есть. Прямо сейчас он просто захватывает схему из таблицы Visual Foxpro и отображает ее. Не уверен, куда идти отсюда. Есть идеи?

Private Sub dwprm01() 
    Try 
     Dim tableName As String = "dwprm01" 
     Dim tableExists As Boolean = False 
     Dim foxConn As New OleDbConnection("Provider=vfpoledb.1;Data Source=Z:\update_dwprm01\" & tableName & ".DBF;Collating Sequence=general;") 

     sConn.Open() 
     Dim restrictions(3) As String 
     restrictions(2) = tableName 
     Dim dbTbl As DataTable = sConn.GetSchema("Tables", restrictions) 

     Console.WriteLine("Checking if " & tableName & " exists") 

     If dbTbl.Rows.Count = 0 Then 
      'Table does not exist 
      tableExists = False 

      Console.WriteLine(tableName & " does not exist") 
      Console.WriteLine() 
      Console.WriteLine("Creating " & tableName) 

      Dim fSQL = "SELECT * FROM " & tableName 
      Dim cmd As New OleDbCommand(fSQL, foxConn) 

      foxConn.Open() 

      Dim myReader As OleDbDataReader = cmd.ExecuteReader() 
      Dim schema As DataTable = myReader.GetSchemaTable() 

      For Each row As DataRow In schema.Rows 
       For Each col As DataColumn In schema.Columns 
        Console.WriteLine(col.ColumnName & " = " & row(col).ToString()) 
       Next 
      Next 
      myReader.Close() 
      foxConn.Close() 
     Else 
      'Table exists 
      tableExists = True 
      Console.WriteLine(tableName & " exists") 
     End If 

     dbTbl.Dispose() 
     sConn.Close() 
     sConn.Dispose() 

    Catch ex As Exception 
     Console.WriteLine(ex.ToString()) 
    End Try 
End Sub 

ответ

0

Я смог наконец понять это. Вот что я должен был сделать. Прокомментированный блок покажет вам разные строки в схеме таблиц. Оператор Case еще не закончен, но вы можете добавить его, поскольку вы сталкиваетесь с большим количеством типов данных, которые необходимо преобразовать.

Imports System.Data.OleDb 

Module prm01_up 
    Dim sConn As New OleDbConnection("Provider=SQLNCLI10;Server=;Database=;Uid=;Pwd=;") 

Sub Main() 
    Dim foxTables() As String = {"dwprm01", "lkpbrnch", "add_me", "empmastr"} 

    For Each tableName As String In foxTables 
     seekAndCreate(tableName) 
    Next 

    Console.WriteLine() 
    Console.WriteLine("Press any key to continue...") 
    Console.ReadKey() 
End Sub 

Private Sub seekAndCreate(ByRef tableName As String) 
    Try 
     Dim tableExists As Boolean = False 
     Dim foxConn As New OleDbConnection("Provider=vfpoledb.1;Data Source=Z:\update_dwprm01\" & tableName & ".DBF;Collating Sequence=general;") 

     sConn.Open() 
     Dim restrictions(3) As String 
     restrictions(2) = tableName 
     Dim dbTbl As DataTable = sConn.GetSchema("Tables", restrictions) 

     Console.WriteLine("Checking if " & tableName & " exists") 

     If dbTbl.Rows.Count = 0 Then 
      'Table does not exist 
      tableExists = False 

      Console.WriteLine(tableName & " does not exist") 
      Console.WriteLine() 
      Console.WriteLine("Creating " & tableName) 

      Dim foxDs As New DataSet 
      Dim fSQL As String = "USE " & tableName 
      Dim fCmd As New OleDbCommand(fSQL, foxConn) 

      foxConn.Open() 

      Dim objDR As OleDbDataReader 
      objDR = fCmd.ExecuteReader(CommandBehavior.CloseConnection) 

      Dim schemaTable = objDR.GetSchemaTable() 
      Dim colName As String = String.Empty 
      Dim colSize As String = String.Empty 
      Dim colDataType As String = String.Empty 
      Dim newDataType As String = String.Empty 
      Dim allColumns As String = String.Empty 
      Dim colPrecision As String = String.Empty 
      Dim colScale As String = String.Empty 
      Dim createTable As New OleDbCommand 

      'For Each x As DataRow In schemaTable.Rows 
      ' For Each y As DataColumn In schemaTable.Columns 
      '  Console.WriteLine(y.ColumnName) 
      ' Next 
      ' Console.WriteLine() 
      'Next 

      For Each myField As DataRow In schemaTable.Rows 
       colName = myField(0).ToString 
       colSize = myField(2).ToString 
       colDataType = myField(5).ToString 
       colPrecision = myField(3).ToString 
       colScale = myField(4).ToString 

       Select Case colDataType 
        Case "System.String" 
         newDataType = "varchar" & "(" & colSize & "), " 
        Case "System.Decimal" 
         newDataType = "numeric(" & colPrecision & ", " & colScale & "), " 
        Case "System.DateTime" 
         newDataType = "datetime, " 
        Case "System.Int32" 
         newDataType = "int," 
        Case Else 
         newDataType = colDataType.ToString() 
       End Select 
       allColumns += "[" & colName & "]" & " " & newDataType 
      Next 
      Console.WriteLine(allColumns.Substring(0, allColumns.Length - 2)) 

      createTable.Connection = sConn 
      createTable.CommandType = CommandType.Text 
      createTable.CommandText = "CREATE TABLE " & tableName & " (" & allColumns & ")" 
      createTable.ExecuteNonQuery() 
      foxConn.Close() 
     Else 
      'Table exists 
      tableExists = True 
      Console.WriteLine(tableName & " exists") 
      Console.WriteLine() 
     End If 

     foxConn.Dispose() 
     dbTbl.Dispose() 
     sConn.Close() 

    Catch ex As Exception 
     Console.WriteLine(ex.ToString()) 
    End Try 
End Sub 
End Module 
4

Поскольку вы уже подтвердили новую таблицу делает примечание существует, вы просто хотите, чтобы выполнить запрос, как это:

SELECT TOP 0 * INTO NewTable FROM OriginalTable 

Это создаст новую таблицу, без строк, структура которых соответствует вашим оригинал.

+0

Итак, вы говорите, что мне нужно использовать ваш запрос и назначить его для datatable? Затем используйте этот datatable для создания таблицы на сервере sql? – HKImpact

+0

@HKImpact Нет, я говорю: вам не нужен набор данных или данные вообще. Просто установите его как CommandText для объекта OleDbCommand и вызовите метод .ExecuteNonQuery() этого объекта. –

+0

Теперь он начинает иметь немного больше смысла. Есть ли способ создать быстрый макет? Если я не понимаю, я просто хочу визуально увидеть пример. Спасибо за твою помощь. – HKImpact

Смежные вопросы