需要找到DB列的类型

Bha*_*nth 3 c# sql database

这是我的代码.我得到了数据库中存在的所有表名和列名.现在我需要知道列的类型.比如它的int或varchar或其他什么.可以帮助我吗?顺便说一下这是C#.

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

        }
     }
   }
Run Code Online (Sandbox Code Playgroud)

bub*_*ubi 5

您也可以从OleDb检索列类型

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

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)));
        }
    }
Run Code Online (Sandbox Code Playgroud)