none
Datatable im VB.Net Programm durch eine bestehende SQL Server Tabelle dynamisch erstellen RRS feed

  • Frage

  •  

    Hi zusammen, normalerweise erstelle ich dynamisch eine Tabelle im meinem Programm durch

    Dim MyTable_Adressdaten As new DataTable

         Dim MyColumn As DataColumn
            MyColumn = New DataColumn("ID")
            MyColumn.DataType = System.Type.GetType("System.Int32")
            MyColumn.ColumnName = "ID"
            MyColumn.Unique = True
            MyColumn.AutoIncrement = True
            MyTable_Adressdaten.Columns.Add(MyColumn)
            MyColumn = Nothing

    usw.usw.usw.

    Kann ich diese Tabelle nun dynamisch durch Code von einer bestehenden SQL Server Tabelle mir erstellen?

    Mittwoch, 11. Juli 2012 18:28

Antworten

  • Hallo Mike,

    welcher Fehler kommt denn? Das folgende funktioniert bei mir.

      
      Private mobjSqlConnection As System.Data.SqlClient.SqlConnection
      Private mstrSqlConnectionString As String = "Ein ConnectionString"
      Private mobjDataSet As New DataSet
      Private mobjSqlDataAdapter As SqlClient.SqlDataAdapter


      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        mobjSqlConnection = New System.Data.SqlClient.SqlConnection(Me. _
                                                                                                       mstrSqlConnectionString)

        mobjSqlConnection.Open()

        mobjDataSet.Clear()

        If mobjSqlDataAdapter IsNot Nothing Then
          mobjSqlDataAdapter.Dispose()
        End If
        mobjSqlDataAdapter = New SqlClient.SqlDataAdapter _
                                 ("Select * From Test1 Order By Spalte1", _
                                  mobjSqlConnection)

        mobjSqlDataAdapter.FillSchema(mobjDataSet, System.Data.SchemaType.Source, "Test1")
      End Sub


    • Bearbeitet Markus222 Mittwoch, 11. Juli 2012 20:06
    • Als Antwort markiert Mike Sauerland Donnerstag, 12. Juli 2012 17:32
    Mittwoch, 11. Juli 2012 19:54

Alle Antworten

  • Hi Mike,
    wenn Du mit einen SQLDataAdapter ein leeres DataSet füllst, hast Du alles ohne umfangreichen Programmcode.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 11. Juli 2012 18:37
  • Hallo Mike,

    wie genau meinst Du das, dass der DataTable andere Spalten/Typen abweichend von der eigentlich SQL Server Tabellen Definition hat? Den normalerweise ergibt sich das DataTable Design aus dem SQL Tabellen Design; anders ist es leicht sinnfrei.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Mittwoch, 11. Juli 2012 18:40
  • Hi Olaf , ne die Datatable soll genau so sein wie die Tabelle im SQL Server. Habe mal grad gegoogelt. Kann ich das so machen?
     Dim ds1 As New DataSet
                        Dim oSQLCommand As New SqlCommand(sSQLStatment, oSQLConnection)
                        Dim oSQLAdapter As New SqlDataAdapter(sSQLStatment, oSQLConnection)
                        oSQLAdapter.FillSchema(ds1, SchemaType.Source, "Adressdaten")

    normalerweise kann man bei Fillschema auch eine Datatable angeben. Kommt aber ein Fehler.
    Mittwoch, 11. Juli 2012 19:31
  • Hallo Mike,

    welcher Fehler kommt denn? Das folgende funktioniert bei mir.

      
      Private mobjSqlConnection As System.Data.SqlClient.SqlConnection
      Private mstrSqlConnectionString As String = "Ein ConnectionString"
      Private mobjDataSet As New DataSet
      Private mobjSqlDataAdapter As SqlClient.SqlDataAdapter


      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        mobjSqlConnection = New System.Data.SqlClient.SqlConnection(Me. _
                                                                                                       mstrSqlConnectionString)

        mobjSqlConnection.Open()

        mobjDataSet.Clear()

        If mobjSqlDataAdapter IsNot Nothing Then
          mobjSqlDataAdapter.Dispose()
        End If
        mobjSqlDataAdapter = New SqlClient.SqlDataAdapter _
                                 ("Select * From Test1 Order By Spalte1", _
                                  mobjSqlConnection)

        mobjSqlDataAdapter.FillSchema(mobjDataSet, System.Data.SchemaType.Source, "Test1")
      End Sub


    • Bearbeitet Markus222 Mittwoch, 11. Juli 2012 20:06
    • Als Antwort markiert Mike Sauerland Donnerstag, 12. Juli 2012 17:32
    Mittwoch, 11. Juli 2012 19:54
  • Hallo Markus, laut Doku kann man
       mobjSqlDataAdapter.FillSchema(mobjDataSet, System.Data.SchemaType.Source, "Test1")
      End Sub

    FillSchema(

    auch eine Datatable benutzen. Das klappt aber nicht. obiges klappt aber.

    Donnerstag, 12. Juli 2012 17:33
  • Hallo Mike,

    das klappt auch mit einer DataTable. Ein etwas verallgemeinertes Beispiel:

        Private Const SqlConnectionString As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=true;"
    
        Public Shared Function GetTableSchema(tableName As String, Optional schemaName As String = "dbo") As DataTable
            Dim builder As New SqlCommandBuilder()
    
            Dim sql = "SELECT * FROM " & builder.QuoteIdentifier(schemaName) & "." & builder.QuoteIdentifier(tableName)
            Using adapter As New SqlDataAdapter(sql, SqlConnectionString)
                adapter.MissingMappingAction = MissingMappingAction.Passthrough
                adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey    ' Für Primärschlüssel notwendig
    
                Dim table As New DataTable(tableName)
                adapter.FillSchema(table, SchemaType.Source)
                Return table
            End Using
        End Function
    
        Friend Shared Sub Test()
            Dim table = SqlServerInstances.GetTableSchema("Customers") ' Order Details
            For Each column As DataColumn In table.Columns
                Console.WriteLine("{0} ({1}, {2})", column.ColumnName, column.DataType, column.MaxLength)
            Next
            If table.PrimaryKey.Length > 0 Then
                Console.WriteLine("Primary Key: {0}", table.PrimaryKey(0).ColumnName)
            End If
        End Sub
    

    Wichtig wäre vor allem MissingSchemaAction.AddWithKey, damit Du den Primärschlüssel erhältst.

    Gruß Elmar

    Donnerstag, 12. Juli 2012 22:42
    Beantworter