Benutzer mit den meisten Antworten
Datatable im VB.Net Programm durch eine bestehende SQL Server Tabelle dynamisch erstellen

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?
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
Alle Antworten
-
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 -
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. -
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
-
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