C#获取与操作数据库结构.docx
- 文档编号:30057753
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:54
- 大小:77.45KB
C#获取与操作数据库结构.docx
《C#获取与操作数据库结构.docx》由会员分享,可在线阅读,更多相关《C#获取与操作数据库结构.docx(54页珍藏版)》请在冰豆网上搜索。
C#获取与操作数据库结构
C#获取数据库表信息与列信息的方法总结收藏
窗体顶端
C#中如何获取数据库中表的信息和列的信息
获取表的信息:
conn.Open();
string[]restrictions=newstring[4];
restrictions[1]="dbo";
DataTabletable=conn.GetSchema("Tables",restrictions);
conn.Close();
返回的table是表的所有信息,而不仅仅是名字,可以通过如下语句查看这些信息:
foreach(System.Data.DataRowrowintable.Rows)
{
foreach(System.Data.DataColumncolintable.Columns)
{
Console.WriteLine("{0}={1}",col.ColumnName,row[col]);
}
}
要获取指定表的信息,关键是要设置数组restrictions的值。
对于表而言,这个数组有如下的含义:
Restriction[0]表示表所在的Catalog
Restriction[1]表示表的所有者
Restriction[2]表示表的名字
Restriction[3]表示表的类型:
上面的例子就获取了所有dbo拥有的表的信息。
如果要获取所有的用户表,而非系统表,可用如下语句:
conn.Open();
string[]restrictions=newstring[4];
restrictions[3]=“BASETABLE";
DataTabletable=conn.GetSchema("Tables",restrictions);
conn.Close();
获取列的信息:
conn.Open();
string[]restrictions=newstring[4];
restrictions[1]="dbo";
DataTabletable=conn.GetSchema("Columns",restrictions);
conn.Close();
与获取表的代码很类似,只是GetSchema的第一个参数不同。
同样,返回结果取决于restriction的值。
此时,
Restriction[0]表示列所在的Catalog
Restriction[1]表示列的所有者
Restriction[2]表示列所在的表的名字
Restriction[3]表示列名
例如:
//restrictionstringarray
string[]res=newstring[4];
//dbo拥有的所有表的所有列的信息
res[1]="dbo";
DataTablet1=conn.GetSchema("Columns",res);
//任意owner/schema所拥有的一个叫authors的表的列信息
res[2]="authors";
DataTablet2=conn.GetSchema("Columns",res);
//任意owner/schema所拥有的一个叫authors的表的列name的信息
res[2]="authors"; res[3]="name";
DataTablet3=conn.GetSchema("Columns",res);
//任意owner/schema任意表中的一个列名是name的列的信息。
res[3]="name";
DataTablet4=conn.GetSchema("Columns",res);
获取数据库的其它信息都可以使用GetSchema,只是第一个参数不同。
这个参数在不同的数据库有差异:
1、在SQLServer中,可以获取的架构集合如下:
. Databases
. ForeignKeys
. Indexes
. IndexColumns
. Procedures
. ProcedureParameters
. Tables
. Columns
. Users
. Views
. ViewColumns
. UserDefinedTypes
2、在Oracle中,可以获取的架构集合如下:
. Columns
. Indexes
. IndexColumns
. Procedures
. Sequences
. Synonyms
. Tables
. Users
. Views
. Functions
. Packages
. PackageBodies
. Arguments
. UniqueKeys
. PrimaryKeys
. ForeignKeys
. ForeignKeyColumns
. ProcedureParameters
前两天在写一个数据库的操作工具,我们写工具的前提是尽量减少用户的操作,可是在写那个工具的时候总是让我感觉很诡异,
例如,在数据库连接完成以后,我们要对该数据中的那个表操作,还要手动输入这个表的名称,同样你要是对数据库中某个表的
某个字段进行操作,同样必须进行手动输入,用起来感觉可费劲,由于时间问题,那个工具也就那样草草交工了。
现在静下来想想,自己太不负责任了,为什么不那么尝试一下呢?
刚刚就动手做了一下:
在里面我们主要用到的函数就是OpenSchema了。
具体介绍如下:
OpenSchema方法返回一个记录集(recordset)对象,这个记录集对象记录的是一些数据源或提供都的信息。
例如:
架构信息中包含数据表的名
字,表中列的名字,列的数据类型等。
不过,此记录是只读的,你不能够往里面写东西。
TheOpenSchemamethodreturnsaRecordsetobjectwithschemainformationfromtheprovideraboutthedatasource.For
example,schemainformationcanincludethenamesofthetables,namesofthecolumnsinthetables,andthedatatypeof
eachcolumn.TheRecordsetwillbeopenedasaread-onlyrecordset.
语法:
Setrs=objconn.OpenSchema(querytype,criteria,schemaid)
参数说明:
querytype必须的,参数值的类型为SchemaEnum,当使用oledb时,SchemaEnum值中只有三个值可用adSchemaTables,adSchemaColumns,和
adSchemaProviderTypes.
提示:
针对每个querytype返回的记录集的所有字段,ms官方网站上的MSDNLibrary中介绍比较详细,可以参阅。
源码如下:
#import"F:
\ProgramFiles\CommonFiles\System\ado\msado15.dll"no_namespace \
rename("EOF","adoEOF") rename("BOF","adoBOF")
#include
#include
#include
#include
#include
usingnamespacestd;
#pragmacomment(lib,"ole32.lib")
typedefstructtagColumnInfor
{
stringszColumnName;//列名
stringszColumnType;//列类型
}ColumnInfor;
typedefstructtagTableInfor
{
stringszTableName; //表名
vector
}TableInfor;
voidPrintInfor(vector
:
const_iteratorbeg,vector
:
const_iteratorend)
{
while(beg!
=end)
{
cout<<"Table"<<'\t'< vector : const_iteratorchildBeg=beg->vecFieldInfor.begin(); vector : const_iteratorchildEnd=beg->vecFieldInfor.end(); while(childBeg! =childEnd) { cout< childBeg++; } cout<<"pressanykeytocontinue"< getchar(); beg++; system("cls"); } return; } intmain() { char*con="Provider=Microsoft.Jet.OLEDB.4.0; \ PersistSecurityInfo=true;DataSource=Cobweb.mdb;\ JetOLEDB: DatabasePassword="; CoInitialize(NULL); _ConnectionPtrptrCon; _RecordsetPtrptrSet; ptrCon.CreateInstance(__uuidof(Connection)); ptrSet.CreateInstance(__uuidof(Recordset)); ptrCon->Open(con,"","",NULL); if(ptrCon->State! =adStateOpen) { cout<<"openerror"< if(ptrSet->State==adStateOpen) ptrSet->Close(); if(ptrCon->State==adStateOpen) ptrCon->Close(); ptrSet->Release(); ptrCon->Release(); return1; } ptrSet=ptrCon->OpenSchema(adSchemaTables); vector _bstr_tbt; while(! ptrSet->adoEOF) { bt=ptrSet->Fields->GetItem("TABLE_TYPE")->Value; if(! strcmp((char*)bt,"TABLE"))//排除系统表 { bt=ptrSet->Fields->GetItem("TABLE_NAME")->Value; v.push_back((char*)bt); } ptrSet->MoveNext(); } ptrSet=ptrCon->OpenSchema(adSchemaColumns); vector while(! ptrSet->adoEOF) { bt=ptrSet->Fields->GetItem("TABLE_NAME")->Value; vector : iteratorbeg=vec.begin(); vector : iteratorend=vec.end(); boolbFlag=FALSE;//用于标记当前字段所属的表是否就是我们需要的表 vector : const_iteratorszBeg=v.begin(); vector : const_iteratorszEnd=v.end(); while(szBeg! =szEnd) { if(! strcmp(szBeg->c_str(),(char*)bt)) { bFlag=true; break; } szBeg++; } if(bFlag)//说明该列所属的表是我们需要的 { boolbIsFind=FALSE; for(beg;beg! =end;beg++) { if(! strcmp(beg->szTableName.c_str(),(char*)bt)) { bIsFind=TRUE; break; } } if(bIsFind)//说明该列所属的表已经在vec中 { ColumnInforcolumn; bt=ptrSet->Fields->GetItem("COLUMN_NAME")->Value; column.szColumnName.append((char*)bt); bt=ptrSet->Fields->GetItem("DATA_TYPE")->Value; column.szColumnType.append((char*)bt); beg->vecFieldInfor.push_back(column);//增加一列新信息 } else { TableInfortable; ColumnInforcolumn; table.szTableName.append((char*)bt); bt=ptrSet->Fields->GetItem("COLUMN_NAME")->Value; column.szColumnName.append((char*)bt); bt=ptrSet->Fields->GetItem("DATA_TYPE")->Value; column.szColumnType.append((char*)bt); table.vecFieldInfor.push_back(column);//增加一个表信息 vec.push_back(table); } } ptrSet->MoveNext(); } PrintInfor(vec.begin(),vec.end()); if(ptrSet->State==adStateOpen) ptrSet->Close(); if(ptrCon->State==adStateOpen) ptrCon->Close(); CoUninitialize(); return0; } TransactSQL常用语句以及函数收藏 TransactSQL常用语句以及函数 TransactSQL语句功能 ======================================================================== --数据操作 SELECT--从数据库表中检索数据行和列 INSERT--向数据库表添加新数据行 DELETE--从数据库表中删除数据行 UPDATE--更新数据库表中的数据 --数据定义 CREATETABLE--创建一个数据库表 DROPTABLE--从数据库中删除表 ALTERTABLE--修改数据库表结构 CREATEVIEW--创建一个视图 DROPVIEW--从数据库中删除视图 CREATEINDEX--为数据库表创建一个索引 DROPINDEX--从数据库中删除索引 CREATEPROCEDURE--创建一个存储过程 DROPPROCEDURE--从数据库中删除存储过程 CREATETRIGGER--创建一个触发器 DROPTRIGGER--从数据库中删除触发器 CREATESCHEMA--向数据库添加一个新模式 DROPSCHEMA--从数据库中删除一个模式 CREATEDOMAIN--创建一个数据值域 ALTERDOMAIN--改变域定义 DROPDOMAIN--从数据库中删除一个域 --数据控制 GRANT--授予用户访问权限 DENY--拒绝用户访问 REVOKE--解除用户访问权限 --事务控制 COMMIT--结束当前事务 ROLLBACK--中止当前事务 SETTRANSACTION--定义当前事务数据访问特征 --程序化SQL DECLARE--为查询设定游标 EXPLAN--为查询描述数据访问计划 OPEN--检索查询结果打开一个游标 FETCH--检索一行查询结果 CLOSE--关闭游标 PREPARE--为动态执行准备SQL语句 EXECUTE--动态地执行SQL语句 DESCRIBE--描述准备好的查询 ---局部变量 declare@idchar(10) --set@id='10010001' select@id='10010001' ---全局变量 ---必须以@@开头 --IFELSE declare@xint@yint@zint select@x=1@y=2@z=3 if@x>@y print'x>y'--打印字符串'x>y' elseif@y>@z print'y>z' elseprint'z>y' --CASE usepangu updateemployee sete_wage= case whenjob_level=’1’thene_wage*1.08 whenjob_level=’2’thene_wage*1.07 whenjob_level=’3’thene_wage*1.06 elsee_wage*1.05 end --WHILECONTINUEBREAK declare@xint@yint@cint select@x=1@y=1 while@x<3 begin print@x--打印变量x的值 while@y<3 begin select@c=100*@x+@y print@c--打印变量c的值 select@y=@y+1 end select@x=@x+1 select@y=1 end --WAITFOR --例等待1小时2分零3秒后才执行SELECT语句 waitfordelay’01: 02: 03’ select*fromemployee --例等到晚上11点零8分后才执行SELECT语句 waitfortime’23: 08: 00’ SELECT select*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex宿主) select*fromstock_informationwherestockid=str(nid) stockname='str_name' stocknamelike'%findthis%' stocknamelike'[a-zA-Z]%'---------([]指定值的范围) stocknamelike'[^F-M]%'---------(^排除指定范围) ---------只能在使用like关键字的where子句中使用通配符) orstockpath='stock_path' orstocknumber<1000 andstockindex=24 notstoc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 获取 操作 数据库 结构