2017-12-11 2 views
0

Ich habe folgende Hilfsfunktion für das Laden DataTable basierend auf SQL SELECT für eine SQL Server-Datenbank (etwas vereinfacht):Wie erhalten Sie das ursprüngliche Schema auf SQL Server von SELECT, das DataTable füllt?

static private DataTable GetData_(string connectionString, string sqlSelect, bool doFillSchema = false) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, connection)) 
    { 
     DataTable table = new DataTable(); 

     if (doFillSchema) 
      adapter.FillSchema(table, SchemaType.Mapped); 

     adapter.Fill(table); 
     return table; 
    } 
} 

Das spätere Ziel ist es, die zurück table an eine andere Funktion übergeben, die den Inhalt exportieren sollte in eine DBF-Tabelle (dh CREATE TABLE und schreibe den Inhalt mit einigen Korrekturen, die sich auf die verschiedenen Fähigkeiten der Engines beziehen).

Das Problem ist, dass die Implementierung den ursprünglichen sagen numeric(10, 2) Spaltentyp in Decimal im Schema ändert. Ich möchte das Original bewahren.

Wenn ich es gut verstehe, muss ich wahrscheinlich eine andere DataTable schemaTable mit dem ursprünglichen Schema bekommen (bevor die Spaltentypen vom Adapter geändert werden). Meine Idee war, die Funktion so zu ändern:

static private DataTable GetData_(string connectionString, string sqlSelect, 
            bool doFillSchema, ref DataTable schemaTable) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, connection)) 
    { 
     DataTable table = new DataTable(); 

     if (doFillSchema) 
      ??? fill the schema table 

     adapter.Fill(table); 
     return table; 
    } 
} 

Wie sollte die Funktionalität implementiert werden? Sollte die SqlDataAdapter für den Zweck verwendet werden? Oder sollte es anders gemacht werden?

Antwort

0

So fern habe ich diese Selbst-Antwort. Wenn Sie eine bessere Lösung haben, werde ich es gerne annehmen. ;)

static private DataTable GetData_(string connectionString, string sqlSelect, Hashtable arg, 
            bool doFillSchema, ref DataTable schemaTable) 
{ 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    using (SqlCommand command = new SqlCommand(sqlSelect, connection)) 
    { 
     connection.Open(); 

     // If we want the schema, do the extra step. 
     if (doFillSchema) 
     { 
      using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo)) 
       schemaTable = reader.GetSchemaTable(); 
     } 

     // Use the adapter to fill the result table.. 
     using (SqlDataAdapter adapter = new SqlDataAdapter(command)) 
     { 
      DataTable table = new DataTable(); 

      // Set the SELECT arguments. 
      if (arg != null) 
      { 
       foreach (DictionaryEntry item in arg) 
       { 
        adapter.SelectCommand.Parameters.AddWithValue(item.Key.ToString(), item.Value); 
       } 
      } 

      // Get the result of the SQL query. 
      adapter.Fill(table); 
      return table; 
     } 
    } 
} 
Verwandte Themen