使用OLE方式获取数据库架构信息

一般连接SQL数据库的连接字串:

data source = [SERVERNAME];user id = [USERNAME];password = [PASSWORD];database = [DATABASENAME]

OLE的连接字串只要在其头部增加“Provider=sqloledb;”,即:

Provider = sqloledb;data source = [SERVERNAME];user id = [USERNAME];password = [PASSWORD];database = [DATABASENAME]

需要在代码文件中加一句引用:

using  System.Data.OleDb;

建立连接对象

string  sql;
DataTable SchemaTable;
sql
= " Provider=sqloledb;data source=[SERVERNAME];user id=[USERNAME];password=[PASSWORD];database=[DATABASENAME] " ;
oleDbConnection conn 
=   new  OleDbConnection(sql);
conn.open();

打开连接后一般需要做个判断,防止连接失败

读取架构表信息的方法是GetOleDbSchemaTabl( Guid,Object[] ),其中Guid为OleDbSchemaGuid的成员,决定了获取指定的架构信息,Object[]为限制列数组,随OleDbSchemaGuid不同而不同。常用的OleDbSchemaGuid为Tables、Columns、Indexes 、Primary_Keys。
 
一、获取数据表字段(列)结构信息

SchemaTable = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,  new   object []  nullnull, [TABLENAME], null } );

其中,限制列分别为 TABLE_CATALOG、TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME,如果不限制则传递null。
此时,SchemaTable中包含一个字段结构表,此表的每个记录(每行)为[TABLENAME]的每个字段的结构信息,而SchemaTable本身的结构可以通过列信息中获取,SchemaTable的列信息是固定的,以下读取列信息的代码:

string  fieldname;
string  datatype;
string  Outstr;
 
foreach  (DataColumn col  in  SchemaTable.Columns)
{
    fieldname
=col.Name;
    datatype
= col.DataType.Name;
    Outstr
+=fieldname+"="+datatype+"\r\n";//生成字段信息的输出字串
}

SchemaTable中的每个列名和类型如下:
TABLE_CATALOG               String
TABLE_SCHEMA                String
TABLE_NAME                   String
COLUMN_NAME                 String
COLUMN_GUID                 Guid  
COLUMN_PROPID               Int64 
ORDINAL_POSITION            Int64 
COLUMN_HASDEFAULT           Boolean
COLUMN_DEFAULT              String
COLUMN_FLAGS                Int64 
IS_NULLABLE                 Boolean
DATA_TYPE                   Int32 
TYPE_GUID                   Guid  
CHARACTER_MAXIMUM_LENGTH    Int64 
CHARACTER_OCTET_LENGTH      Int64 
NUMERIC_PRECISION           Int32 
NUMERIC_SCALE               Int16 
DATETIME_PRECISION          Int64 
CHARACTER_SET_CATALOG       String
CHARACTER_SET_SCHEMA        String
CHARACTER_SET_NAME          String
COLLATION_CATALOG           String
COLLATION_SCHEMA            String
COLLATION_NAME              String
DOMAIN_CATALOG              String
DOMAIN_SCHEMA               String
DOMAIN_NAME                 String
DESCRIPTION                 String
COLUMN_LCID                 Int32 
COLUMN_COMPFLAGS            Int32 
COLUMN_SORTID               Int32 
COLUMN_TDSCOLLATION         Byte[]
IS_COMPUTED                 Boolean

有了SchemaTable的每个列的结构后,就可以选择性地从中取得[TABLENAME]的字段信息了

string  fieldname;
string  ;
 
foreach  (DataRow   dr  in  SchemaTable.Rows)
{
    fieldname
=dr[COLUMN_NAME].ToString();此处的fieldname是[TABLENAME]的每个字段名,下同
    ..
=dr[DATA_TYPE].ToString();
    ..;    
}


二、获取主键信息

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
COLUMN_GUID
COLUMN_PROPID
ORDINAL
PK_NAME

你可能感兴趣的:(数据库)