2016-10-26 2 views
3

Ich habe ein kleines Programm, um Datenbanktabellen nach Excel "herunterzuladen".DataReader Typspezifikation erhalten SQL Server

Ich möchte den Spaltentyp der zweiten Zeile hinzufügen und ich habe es mit der folgenden Funktion versucht. Es funktioniert gut, aber die GetDataTypeName(i) kehrt nur int, nvarchar aber ich brauche die komplette Typangabe wie diese

nvarchar(255), decimal(19, 8) 

Gibt es eine andere Funktion diese aus der Datenbank zu bekommen?

SqlDataReader dataReader = command.ExecuteReader(); 

// adds the names and the types if the table has no values 
if (!dataReader.HasRows || !withValues) 
{ 
    for (int i = 0; i < dataReader.FieldCount; i++) 
    { 
     names.Add(dataReader.GetName(i)); 
     types.Add(dataReader.GetDataTypeName(i)); 
    } 
} 
+4

Keines Diese Fragen scheinen die Größe/Genauigkeit des Feldes zu ermitteln. 'dataReader.GetSchemaTable()' gibt Ihnen vollständige Metadaten für alle Spalten. –

+2

Für die Größe gehen Sie über ['.GetSchemaTable()'] (https: // msdn. microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable(v=vs.110).aspx) (Nicht sicher, ob es jedoch Präzision/Skalierung freigibt) –

+1

Sie benötigen diese Informationen nicht, um eine Tabelle nach Excel zu exportieren. Verwenden Sie entweder das SQL Server-eigene SSIS oder verwenden Sie eine Bibliothek wie EPPlus, um eine echte Excel-Datei (dh 'xlsx') mit einem Aufruf so einfach wie' sheet.LoadFromDataTable' zu ​​erzeugen, wie hier [hier] (https://epplus.codeplex.com/wikipage? title = WebapplicationExample). Sie können die resultierenden Spalten nach Bedarf formatieren –

Antwort

2

Diese Art von Informationen ist über den Anruf GetSchemaTable verfügbar. Sie gibt eine DataTable zurück, in der Sie für jede von der Abfrage zurückgegebene Spalte eine Zeile haben. Jede Spalte dieser Tabelle eine bestimmten Informationen durch die Metadaten in Bezug auf das Abfragefeld

Zum Beispiel extrahierten beschreiben

SqlDataReader dataReader = command.ExecuteReader(); 

    if (!dataReader.HasRows || !withValues) 
    { 
     DataTable dt = dataReader.GetSchemaTable(); 
     foreach(DataRow row in dt.Rows) 
     { 
      Console.WriteLine("ColumnName: " + row.Field<string>("ColumnName")); 
      Console.WriteLine("NET Type: " + row.Field<string>("DataTypeName")); 
      Console.WriteLine("Size: " + row.Field<int>("ColumnSize")); 
     } 
    } 

Die GetSchemaTable viele Informationen liefern über Ihre Tabelle/Abfrage, aber viele dieser Felder sind auf null gesetzt. Ich bin mir nicht sicher, ob das eine Einschränkung des Anbieters ist oder ob sie null sind, weil sie im Kontext des Anrufs keine Bedeutung haben. In jedem Fall verwenden defensive Programmierung in diese Werte zugreifen (if! (Value == DBNull.Value)

+0

danke dafür! kurze frage, wenn ich eine dezimal wie diese dezimal (19,8) habe kann ich das auf die gleiche weise bekommen? im Moment sagt er für die Dezimalstelle (19,8) folgende -> Dezimal (17) –

+1

Uhm, die Werte sollten in NumericPrecision und NumericScale sein, aber ich muss – Steve

+0

überprüfen Ich werde es versuchen, danke dafür –

1

Bitte verwenden Table Methode für das Erhalten alle Details der Spalte.

SqlDataReader reader= command.ExecuteReader(); 

using (var schemaTable = reader.GetSchemaTable()) 
    { 
     foreach (DataRow row in schemaTable.Rows) 
     { 
      string ColumnName= row.Field<string>("ColumnName"); 
      string DataTypeName= row.Field<string>("DataTypeName"); 
      short NumericPrecision= row.Field<short>("NumericPrecision"); 
      short NumericScale= row.Field<short>("NumericScale"); 
      int ColumnSize= row.Field<int>("ColumnSize"); 
      Console.WriteLine("Column: {0} Type: {1} Precision: {2} Scale: {3} ColumnSize {4}",  
      ColumnName, DataTypeName, NumericPrecision, scale,ColumnSize); 
     } 
    } 

Dank.

Verwandte Themen