openschema方法如何得到数据库的约束信息(在线等!!)
各位高手,小弟最近在工作中需要完成这样的操作:
提取数据库中某个表的模式信息,如主键、外键、以及字段的约束(唯一性、是否可为空等),恳请各位高手指教!!希望有程序可以参考!!
问题点数:100、回复次数:8Top
1 楼zhaohanboy()回复于 2003-12-02 15:56:08 得分 0
高手都去哪里了呀!?Top
2 楼zhaohanboy()回复于 2003-12-02 17:19:16 得分 0
有没有人在呀????????Top
3 楼spwnihao(╭∩╮(︶⌒︶)╭∩╮鄙视一切)回复于 2003-12-02 17:33:44 得分 0
http://expert.csdn.net/Expert/topic/2322/2322190.xml?temp=.9734461
参考一下吧Top
4 楼zhaohanboy()回复于 2003-12-13 15:37:22 得分 0
好像不一样的!!!!!!!!Top
5 楼zhaohanboy()回复于 2003-12-13 15:37:45 得分 0
分不够可以加!!有人吗???Top
6 楼AkiraChing(水银)回复于 2003-12-13 21:41:10 得分 100
主键约束
_bstr_t bstrConn="Provider=sqloledb;Data Source=(local);"
"Initial Catalog=pubs;"
"User Id=sa;Password=akira;";
_ConnectionPtr pConnection=NULL;
_RecordsetPtr pRstSchema=NULL;
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 3;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
//PK_TABLE_CATALOG
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
//PK_TABLE_SCHEMA
ix=1;
SafeArrayPutElement(psa, &ix, &var);
//PK_TABLE_NAME
ix=2;
var.vt=VT_BSTR;
var.bstrVal=_bstr_t("authors");//表名
SafeArrayPutElement(psa, &ix, &var);
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
try
{
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(bstrConn,"","",adConnectUnspecified);
pRstSchema = pConnection->OpenSchema(adSchemaPrimaryKeys,&Array);
_bstr_t column_name=pRstSchema->GetFields()->GetItem("COLUMN_NAME")->Value;
_bstr_t primarykey_name=pRstSchema->GetFields()->GetItem("PK_NAME")->Value;
CString strMsg;
strMsg.Format("column_name:%s\nprimary key name:%s",(LPCTSTR)column_name,(LPCTSTR)primarykey_name);
AfxMessageBox(strMsg);
}
catch (_com_error e)
{
PrintComError(e);
}
if(pRstSchema->State==adStateOpen)
pRstSchema->Close();
if(pConnection->State==adStateOpen)
pConnection->Close();Top
7 楼AkiraChing(水银)回复于 2003-12-13 21:53:00 得分 0
获得主键约束和外键约束的信息,
...
SAFEARRAY FAR* psa = NULL;
SAFEARRAYBOUND rgsabound;
_variant_t var;
_variant_t Array;
rgsabound.lLbound = 0;
rgsabound.cElements = 6;
psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
var.vt = VT_EMPTY;
long ix;
//PK_TABLE_CATALOG
ix = 0;
SafeArrayPutElement(psa, &ix, &var);
//PK_TABLE_SCHEMA
ix=1;
SafeArrayPutElement(psa, &ix, &var);
//PK_TABLE_NAME
ix=2;
var.vt=VT_BSTR;
var.bstrVal=_bstr_t("authors");//表名
SafeArrayPutElement(psa, &ix, &var);
//FK_TABLE_CATALOG
var.vt=VT_EMPTY;
ix=3;
SafeArrayPutElement(psa, &ix, &var);
//FK_TABLE_SCHEMA
ix=4;
SafeArrayPutElement(psa, &ix, &var);
//FK_TABLE_NAME
ix=5;
SafeArrayPutElement(psa, &ix, &var);
Array.vt = VT_ARRAY|VT_VARIANT;
Array.parray = psa;
try
{
pConnection.CreateInstance(__uuidof(Connection));
pConnection->Open(bstrConn,"","",adConnectUnspecified);
pRstSchema = pConnection->OpenSchema(adSchemaForeignKeys,&Array);
_bstr_t pk_column_name=pRstSchema->GetFields()->GetItem("PK_COLUMN_NAME")->Value;
_bstr_t pk_name=pRstSchema->GetFields()->GetItem("PK_NAME")->Value;
_bstr_t fk_table_name=pRstSchema->GetFields()->GetItem("FK_TABLE_NAME")->Value;
_bstr_t fk_column_name=pRstSchema->GetFields()->GetItem("FK_COLUMN_NAME")->Value;
_bstr_t fk_name=pRstSchema->GetFields()->GetItem("FK_NAME")->Value;
CString strMsg;
strMsg.Format("pk_column_name:%s\npk_name:%s\nfk_table_name:%s\nfk_column_name:%s\nfk_name:%s",
(LPCTSTR)pk_column_name,
(LPCTSTR)pk_name,
(LPCTSTR)fk_table_name,
(LPCTSTR)fk_column_name,
(LPCTSTR)fk_name);
AfxMessageBox(strMsg);
}
catch (_com_error e)
{
PrintComError(e);
}
....Top
8 楼AkiraChing(水银)回复于 2003-12-13 22:03:17 得分 0
其它的类似,可以用adSchemaColumns获取是否允许空以及是否是默认值
adSchemaTableConstraints可以得到表的每个约束信息,
Top




