2010-02-24 48 views

Trả lời

10

Một tuyên bố tôi nghĩ là đáng nói là SET FMTONLY:

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

Không có hàng được xử lý hoặc gửi cho khách hàng vì sự yêu cầu khi SET FMTONLY được bật ON.

Lý do điều này có thể hữu ích là vì bạn có thể cung cấp bất kỳ truy vấn/thủ tục lưu trữ nào và chỉ trả về siêu dữ liệu của resultset.

4

Giả sử rằng bạn có thể kết nối với cơ sở dữ liệu SQL chứa các bảng mà bạn muốn sao chép tại thời điểm đó khi bạn muốn làm điều này, bạn có thể sử dụng một resultset thông thường để chuyển đổi DataTable, sử dụng

select * from <tablename> where 1=2 

làm truy vấn nguồn của bạn.

Điều này sẽ trả lại một tập kết quả trống với cấu trúc của bảng nguồn.

+0

thích điều này, hoạt động trên tất cả các cơ sở dữ liệu;) – AsG

9

Hãy thử: SELECT TOP 0 * FROM [TableName]

và sử dụng SqlDataAdapter để điền vào một DataSet, sau đó nhận được Bảng từ DataSet đó.

-1

Bạn luôn có thể tạo riêng của bạn:

 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))); 

Rõ ràng vẽ lại được rằng bạn sẽ phải cập nhật mã của bạn bất cứ khi nào thay đổi giản đồ cơ sở dữ liệu.

2

Dưới đây là những gì tôi đã làm:

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(); 

trình tốt. Cảm ơn AdaTheDev.

0

công trình này:

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

Tất cả các giải pháp này là chính xác, nhưng nếu bạn muốn có một giải pháp mã tinh khiết được sắp xếp hợp lý cho kịch bản này.

Không có dữ liệu được trả về trong dung dịch này từ CommandBehavior.SchemaOnly được quy định về chức năng ExecuteReader (Command Behavior Documentation)

Giải pháp CommandBehavior.SchemaOnly sẽ thêm SET FMTONLY ON; sql trước khi truy vấn được thực hiện cho bạn như vậy, nó giữ mã của bạn sạch sẽ.

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; 
} 
Các vấn đề liên quan