2010-08-05 51 views
2

這是我的一段代碼。我得到所有的表名和列名在數據庫中。現在我需要知道列的類型。像它的int或varchar或別的什麼東西。可以幫我嗎?順便說一句,這是C#。需要找到DB的列的類型

OleDbConnection con = new OleDbConnection(connectionString); 
DataTable schemaCols; 
     DataTable schemaTbl; 
     List<string> tablesnames = new List<string>(); 
     string returnString=""; 
     try 
     { 
      con.Open(); 
      object[] objArrRestrict; 
      objArrRestrict = new object[] { null, null, null, "TABLE" }; 
      schemaTbl = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, objArrRestrict); 
      foreach (DataRow row in schemaTbl.Rows) 
      { 
       tablesnames.Add(row["TABLE_NAME"].ToString()); 
      } 
      List<string> columnnames = new List<string>(); 
      foreach (string str in tablesnames) 
      { 
       string selTbl = str; 

       //con.Open(); 
       object[] objArrRestrictNew; 
       objArrRestrictNew = new object[] { null, null, selTbl, null }; 
       // 
       schemaCols = con.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, objArrRestrictNew); 

       foreach (DataRow row in schemaCols.Rows) 
       { 
        columnnames.Add(row["COLUMN_NAME"].ToString()); 

       } 
      } 
      } 

回答

2

一種方法是使用OleDbCommand.ExecuteReader閱讀你找到的每個表的模式。

OleDbConnection con = new OleDbConnection(connectionString); 
    DataSet tablesFromDB = new DataSet(); 
    DataTable schemaTbl; 
    try 
    { 
     // Open the connection 
     con.Open(); 
     object[] objArrRestrict = new object[] { null, null, null, "TABLE" }; 

     // Get the table names from the database we're connected to 
     schemaTbl = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, objArrRestrict); 

     // Not sure if this is correct syntax...fix it if it isn't :) 
     String commandText = @"SELECT * FROM {0}"; 

     // Get each table name that we just found and get the schema for that table. 
     foreach (DataRow row in schemaTbl) 
     { 
      DataTable dt = new DataTable(); 
      OleDbCommand command = new OleDbCommand(String.Format(commandText, row["TABLE_NAME"] as String), con); 
      dt.Load(command.ExecuteReader(CommandBehavior.SchemaOnly)); 
      tablesFromDB.Tables.Add(dt); 
     } 
    } 

這樣,您可以遍歷DataSet的DataTable集合並獲取列名稱和列字段類型。

foreach (DataTable dt in tablesFromDB) 
{ 
    foreach (DataColumn dc in dt.Columns) 
    { 
     // Do something with the column names and types here 
     // dc.ColumnName is the column name for the current table 
     // dc.DataType.ToString() is the name of the type of data in the column 
    } 
} 

這樣做可能有更好的方法,但這是一個開始,我認爲。

0

試試這個:(無需使用SQL的select語句)

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + dataSource; 
OleDbConnection connection = new OleDbConnection(connectionString); 

DataTable schemaTable = null; 
string tblName = "xxx"; 
try 
{ 
    connection.Open(); 
    //obtain column information in table "xxx" 
    schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, tblName, null }); 

} 
catch (Exception ex) 
{ 
    String str = ex.Message; 
} 
finally 
{ 
    connection.Close(); 
} 


foreach (DataRow row in schemaTable.Rows) 
{ 
    columnNames.Add(row["COLUMN_NAME"].ToString()); 
    DataColumn colnum_type = row.Table.Columns["DATA_TYPE"] as DataColumn; //note this line 
    ColumnDataTypes.Add(colnum_type.DataType); 
} 
3

你可從OleDb的列類型也

 DataTable schemaTable = connection.GetOleDbSchemaTable(
      System.Data.OleDb.OleDbSchemaGuid.Columns, 
      new object[] { null, null, null, null }); 

schemaTable的列DATA_TYPE包含一個整數,你可以強制轉換爲OleDbType

如果您需要數據類型,則可以使用類似於此的轉換函數(我將此用於mdb和accdb文件,但我知道它應該被增強)

private static string ConvertToJetDataType(int oleDbDataType) 
    { 
     switch (((OleDbType)oleDbDataType)) 
     { 
      case OleDbType.LongVarChar: 
       return "varchar"; 
      case OleDbType.BigInt: 
       return "int";  // In Jet this is 32 bit while bigint is 64 bits 
      case OleDbType.Binary: 
      case OleDbType.LongVarBinary: 
       return "binary"; 
      case OleDbType.Boolean: 
       return "bit"; 
      case OleDbType.Char: 
       return "char"; 
      case OleDbType.Currency: 
       return "decimal"; 
      case OleDbType.DBDate: 
      case OleDbType.Date: 
      case OleDbType.DBTimeStamp: 
       return "datetime"; 
      case OleDbType.Decimal: 
      case OleDbType.Numeric: 
       return "decimal"; 
      case OleDbType.Double: 
       return "double"; 
      case OleDbType.Integer: 
       return "int"; 
      case OleDbType.Single: 
       return "single"; 
      case OleDbType.SmallInt: 
       return "smallint"; 
      case OleDbType.TinyInt: 
       return "smallint"; // Signed byte not handled by jet so we need 16 bits 
      case OleDbType.UnsignedTinyInt: 
       return "byte"; 
      case OleDbType.VarBinary: 
       return "varbinary"; 
      case OleDbType.VarChar: 
       return "varchar"; 
      case OleDbType.BSTR: 
      case OleDbType.Variant: 
      case OleDbType.VarWChar: 
      case OleDbType.VarNumeric: 
      case OleDbType.Error: 
      case OleDbType.WChar: 
      case OleDbType.DBTime: 
      case OleDbType.Empty: 
      case OleDbType.Filetime: 
      case OleDbType.Guid: 
      case OleDbType.IDispatch: 
      case OleDbType.IUnknown: 
      case OleDbType.UnsignedBigInt: 
      case OleDbType.UnsignedInt: 
      case OleDbType.UnsignedSmallInt: 
      case OleDbType.PropVariant: 
      default: 
       throw new ArgumentException(string.Format("The data type {0} is not handled by Jet. Did you retrieve this from Jet?", ((OleDbType)oleDbDataType))); 
     } 
    } 
相關問題