2014-11-06 2 views
0

테이블에서 SQL 데이터베이스 스키마를 가져올 수 있습니까? 다음DataReader를 사용하여 SQL 스키마를 가져 오는 방법

내 코드지만 결코 ...하지 않다 나는

Create Table Employee(code int, name blah blah...)

Dim sqlQuery As String 
Dim textInsertQueryLine As String 
Dim tableSchema As DataTable 
Dim tableField As DataRow 
Dim tableProperty As DataColumn 

Dim SourceConn As New SqlConnection(sourceDBPath) 
Dim DestinationConn As New SqlConnection(destinationDBPath) 

SourceConn.Open() 
DestinationConn.Open() 

sqlQuery = "SELECT name FROM sys.tables" 

Dim cmdX As New SqlCommand(sqlQuery, SourceConn) 
Dim readerX As SqlDataReader = cmdX.ExecuteReader 

Do While readerX.Read 

    Dim cmdY As New SqlCommand(sqlQuery, DestinationConn) 
    Dim readerY As SqlDataReader = cmdY.ExecuteReader 

    Do While readerY.Read 

     If readerX.GetString(0) = readerY.GetString(0) Then 
      txtConsoleView.AppendText(readerX.GetString(0) + "Matched. " + vbCrLf) 
     Else 

      tableSchema = readerX.GetSchemaTable() 

      txtConsoleView.AppendText(tableSchema.ToString + vbCrLf) 
     End If 

    Loop 
    readerY.Close() 
Loop 
readerX.Close() 

SourceConn.Close() 
DestinationConn.Close() 
+0

= vs.90) .aspx). –

+0

readerX.GetSchemaTable()이 줄을 사용했지만'SELECT name FROM sys.tables'를 사용했기 때문에 – Kirk

+0

이라는 테이블 이름 만 반환하고 있지만 sys에서 반환 된 실제 테이블에서는 SELECT *를 사용해야합니다. 테이블 '대신. –

답변

0

스키마 발견의 과정을 수행하는 데이터베이스 스키마 정보를 얻기 같이 전체 스키마를 당길 수있다.

스키마 검색을 사용하면 응용 프로그램에서 관리 공급자가 특정 데이터베이스의 메타 데이터라고도하는 데이터베이스 스키마에 대한 정보를 찾아 반환하도록 요청할 수 있습니다.

테이블, 열 및 저장 프로 시저와 같은 다른 데이터베이스 스키마 요소는 스키마 컬렉션을 통해 노출됩니다.

각 스키마 컬렉션에는 사용중인 공급자와 관련된 다양한 스키마 정보가 들어 있습니다.

각 .NET Framework 관리 공급자는 Connection 클래스에서 GetSchema 메서드를 구현하며 GetSchema 메서드에서 반환 된 스키마 정보는 DataTable 형식으로 제공됩니다.

GetSchema 메서드는 반환 할 스키마 컬렉션을 지정하고 반환되는 정보의 양을 제한하는 선택적 매개 변수를 제공하는 오버로드 된 메서드입니다.

상세 정보 : MSDN LINK

예 : 정말 시험하지 그래서 여기

Imports System.Data.SqlClient 

Module Module1 
    Sub Main() 
     Dim connectionString As String = GetConnectionString() 
     Using connection As New SqlConnection(connectionString) 
     'Connect to the database then retrieve the schema information. 
     connection.Open() 
     Dim table As DataTable = connection.GetSchema("Tables") 

     ' Display the contents of the table. 
     DisplayData(table) 
     Console.WriteLine("Press any key to continue.") 
     Console.ReadKey() 
     End Using 
    End Sub 

    Private Function GetConnectionString() As String 
     ' To avoid storing the connection string in your code, 
     ' you can retrieve it from a configuration file. 
     Return "Data Source=(local);Database=AdventureWorks;" _ 
     & "Integrated Security=true;" 
    End Function 

    Private Sub DisplayData(ByVal table As DataTable) 
     For Each row As DataRow In table.Rows 
     For Each col As DataColumn In table.Columns 
      Console.WriteLine("{0} = {1}", col.ColumnName, row(col)) 
     Next 
     Console.WriteLine("============================") 
     Next 
    End Sub 
End Module 
+0

도와 주셔서 감사합니다. – Kirk

1

, 나는 처음부터 작성한 작업 방법입니다. 더 this list에 따라

당신은 스키마 정보를지도하는이 클래스를 사용할 수

, 당신은 추가 할 수 있습니다 : 각 테이블의 모든 열을 나열하는 DataReader.GetSchemaTable()을 사용하고

Public Class Table 
    Public Property DatabaseName As String 
    Public Property TableName As String 
    Public Property Schema As String 
    Public Property FullName As String 
    Public Property AllColumns As New List(Of TableColumn) 

    Public Overrides Function ToString() As String 
     Return FullName 
    End Function 
End Class 

Public Class TableColumn 
    Public Property ColumnName As String 
    Public Property DataType As Type 
    Public Property Size As Int32 
    Public Property ColumnOrdinal As Int32 
    Public Property AllowDBNull As Boolean 
    Public Property IsAutoIncrement As Boolean 

    Public Overrides Function ToString() As String 
     Return String.Format("{0}({1})", ColumnName, DataType.ToString()) 
    End Function 
End Class 

이 코드는 모든 테이블을 읽고의 모든 목록에 열 :

Dim allTables As New List(Of Table) 

Using con As New SqlConnection(My.Settings.RM2ConnectionString) ' use your connection-string ' 
    Using sysTblCommand As New SqlCommand("SELECT [Database]=DB_NAME(DB_ID()),FullName='['+SCHEMA_NAME(schema_id)+'].['+name+']',[Schema]=SCHEMA_NAME(schema_id),Name FROM sys.tables ORDER BY schema_id,name", con) 
     con.Open() 
     Using readerSys = sysTblCommand.ExecuteReader() 
      While readerSys.Read() 
       Dim table As New Table() 
       table.DatabaseName = readerSys.GetString(0) 
       table.FullName = readerSys.GetString(1) 
       table.Schema = readerSys.GetString(2) 
       table.TableName = readerSys.GetString(3) 
       allTables.Add(table) 
      End While 
     End Using 
     For Each table In allTables 
      Using tblCommand As New SqlCommand("SELECT * FROM " & table.ToString(), con) 
       tblCommand.CommandTimeout = 0 
       Using rd = tblCommand.ExecuteReader() 
        Dim schemaTable As DataTable = rd.GetSchemaTable() 
        For Each row As DataRow In schemaTable.Rows 
         Dim col As New TableColumn() 
         col.ColumnName = row.Field(Of String)("ColumnName") 
         col.DataType = row.Field(Of Type)("DataType") 
         col.Size = row.Field(Of Int32)("ColumnSize") 
         col.ColumnOrdinal = row.Field(Of Int32)("ColumnOrdinal") 
         col.AllowDBNull = row.Field(Of Boolean)("AllowDBNull") 
         col.IsAutoIncrement = row.Field(Of Boolean)("IsAutoIncrement") 
         table.AllColumns.Add(col) 
        Next 
       End Using 
      End Using 
     Next 
    End Using 
End Using 
당신은 [`SqlDataReader.GetSchemaTable`] (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable (V를 사용할 수 있습니다
+0

도와 주셔서 감사합니다. – Kirk

+0

이 코드를 사용하려고하지만 allTables.Add (테이블)는 무엇입니까? 데이터 세트 또는 무엇? 내가 찾을 수 없습니다 – Kirk

+0

@ kirk : 미안 해요, 내가 복사 붙여 넣기, 그것은 목록 (테이블 중)입니다. 나는 지금 그것을 cide에 추가했다. –

관련 문제