2010-02-24 18 views
15

के साथ .NET में खाली डेटाटेबल प्राप्त करने की आवश्यकता है SQL सर्वर तालिका की स्कीमा के साथ खाली डेटाटेबल ऑब्जेक्ट बनाने का सबसे अच्छा तरीका क्या है?डेटाबेस तालिका स्कीमा

उत्तर

10

एक बयान मुझे लगता है कि उल्लेख के लायक है SET FMTONLY है:

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

कोई पंक्ति संसाधित या जब सेट FMTONLY चालू है, क्योंकि अनुरोध के ग्राहक के लिए भेजा जाता है।

कारण यह आसान हो सकता है क्योंकि आप किसी भी क्वेरी/संग्रहीत प्रक्रिया की आपूर्ति कर सकते हैं और परिणामसेट के मेटाडेटा को वापस कर सकते हैं।

4

यह मानते हुए कि आप SQL डेटाबेस जो तालिका आप बिंदु यह समय आप ऐसा करना चाहते हैं पर कॉपी करना चाहते हैं से कनेक्ट कर सकते हैं, तो आप datatable रूपांतरण के लिए एक पारंपरिक resultset इस्तेमाल कर सकते हैं, का उपयोग कर

select * from <tablename> where 1=2 

आपकी स्रोत क्वेरी के रूप में।

यह स्रोत तालिका की संरचना के साथ एक खाली परिणाम सेट वापस कर देगा।

+0

यह प्यार करता है, सभी डेटाबेस में काम करता है;) – AsG

9

प्रयास करें: SELECT TOP 0 * FROM [TableName]

और SqlDataAdapter का प्रयोग कर एक डेटासेट को भरने, तो वह डेटासेट से तालिका प्राप्त करने के लिए।

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

स्पष्ट किया जा रहा है आप अपने कोड को अद्यतन करने के लिए जब भी डेटाबेस स्कीमा परिवर्तन होगा कि वापस आकर्षित। अच्छी तरह से

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

काम करता है:

2

यहाँ मैं क्या किया है। धन्यवाद 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

इन समाधानों में से सभी सही हैं, लेकिन आप एक शुद्ध कोड समाधान है कि इस स्थिति के लिए सुव्यवस्थित है चाहते हैं।

कोई डेटा इस समाधान में दिया जाता है के बाद से CommandBehavior.SchemaOnly ExecuteReader समारोह पर निर्दिष्ट किया जाता है (Command Behavior Documentation)

CommandBehavior.SchemaOnly समाधान सेट FMTONLY पर जोड़ देगा; एसक्यूएल आपके लिए क्वेरी निष्पादित होने से पहले, यह आपके कोड को साफ रखता है।

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; 
} 
संबंधित मुद्दे