2010-02-24 44 views

回答

10

,我認爲是值得一提的一個說法是SET FMTONLY

SET FMTONLY ON; 
SELECT * FROM SomeTable 
SET FMTONLY OFF; 

沒有行被處理或當SET FMTONLY爲ON發送到客戶端,因爲請求。

這可以得心應手的原因是因爲你可以提供任何查詢/存儲過程並返回結果集的不僅僅是元數據。

4

假設你可以連接到其中包含你想在你想要做這點它的時間來複製表中的SQL數據庫,你可以使用一個傳統的ResultSet數據錶轉換,使用

select * from <tablename> where 1=2 

作爲源查詢。

這將返回一個空結果與源表的結構設置。

+0

喜歡這個,可以跨所有數據庫;) – AsG

9

嘗試: SELECT TOP 0 * FROM [TableName]

和使用的SqlDataAdapter填充DataSet,然後從該數據集獲得的表。

-1

你總是可以創建自己:

 DataTable table = new DataTable("TableName"); 

     table.Columns.Add(new DataColumn("Col1", typeof(int))); 
     table.Columns.Add(new DataColumn("Col2", typeof(int))); 
     table.Columns.Add(new DataColumn("Col3", typeof(string))); 
     table.Columns.Add(new DataColumn("Col4", typeof(int))); 
     table.Columns.Add(new DataColumn("Col5", typeof(string))); 

明顯的拉回是,你將不得不更新你的代碼,只要數據庫模式的變化。

2

這裏就是我所做的:

var conn = new SqlConnection("someConnString"); 
var cmd = new SqlCommand("SET FMTONLY ON; SELECT * FROM MyTable; SET FMTONLY OFF;",conn); 
var dt = new DataTable(); 
conn.Open(); 
dt.Load(cmd.ExecuteReader()); 
conn.Dispose(); 

效果很好。感謝AdaTheDev。

0

這個工程:

Class BlankTableWithSourceTableSchema 
    Inherits DataTable 
    Public Sub New(ByVal connstr As String, ByVal sourcetable As String) 
     Try 
      Using connection As SqlServerCe.SqlCeConnection = New SqlServerCe.SqlCeConnection(connstr) 
       Dim adapter As SqlServerCe.SqlCeDataAdapter = New SqlServerCe.SqlCeDataAdapter("SELECT * FROM " & sourcetable, connection) 
       adapter.TableMappings.Add("Table", "ABlankTable") 
       adapter.FillSchema(Me, SchemaType.Mapped) 
      End Using 
     Catch ex As Exception 
     End Try 
    End Sub 
End Class 
1
Class BlankTableWithSourceTableSchema 
    Inherits DataTable 
    Public Sub New(ByVal connstr As String, ByVal sourcetable As String) 
     Try 
      Using connection As SqlServerCe.SqlCeConnection = New SqlServerCe.SqlCeConnection(connstr) 
       Dim adapter As SqlServerCe.SqlCeDataAdapter = New SqlServerCe.SqlCeDataAdapter("SELECT * FROM " & sourcetable, connection) 
       adapter.TableMappings.Add("Table", "ABlankTable") 
       adapter.FillSchema(Me, SchemaType.Mapped) 
      End Using 
     Catch ex As Exception 
     End Try 
    End Sub 
End Class 
11

所有這些解決方案是正確的,但如果你想被簡化爲這種情況一個純代碼的解決方案。

沒有數據在該溶液返回由於在的ExecuteReader函數指定CommandBehavior.SchemaOnly(Command Behavior Documentation

的CommandBehavior.SchemaOnly溶液將添加SET FMTONLY ON;查詢之前,SQL是你執行的話,它讓你的代碼乾淨。

public static DataTable GetDataTableSchemaFromTable(string tableName, SqlConnection sqlConn, SqlTransaction transaction) 
{ 
    DataTable dtResult = new DataTable(); 

    using (SqlCommand command = sqlConn.CreateCommand()) 
    { 
     command.CommandText = String.Format("SELECT TOP 1 * FROM {0}", tableName); 
     command.CommandType = CommandType.Text; 
     if (transaction != null) 
     { 
      command.Transaction = transaction; 
     } 

     SqlDataReader reader = command.ExecuteReader(CommandBehavior.SchemaOnly); 

     dtResult.Load(reader); 

    } 

    return dtResult; 
}