概述
一、ADOX 概述
ADOX 是核心 ADO 对象的扩展库。它显露的其他对象可用于创建、修改和删除模式对象,如表格和过程。它还包括安全对象,可用于维护用户和组,以及授予和撤消对象的权限。
要通过开发工具使用 ADOX,需要建立对 ADOX 类型库的引用。对 ADOX 库的说明为“Microsoft ADO Ext. for DDL and Security.”。ADOX 库文件名为“Msadox.dll”,程序 ID (ProgID) 为“ADOX”。有关建立库引用的详细信息,请参阅开发工具的文档。
二、ADOX 对象
Catalog 包含描述数据源模式目录的集合。
Column 表示表、索引或关键字的列。
Group 表示在安全数据库内有访问权限的组帐号。
Index 表示数据库表中的索引。
Key 表示数据库表中的主关键字、外部关键字或唯一关键字。
Procedure 表示存储的过程。
Table 表示数据库表,包括列、索引和关键字。
User 表示在安全数据库内具有访问权限的用户帐号。
View 表示记录或虚拟表的过滤集。
三、ADOX 方法
Append(Columns) 将新的 Column 对象添加到 Columns 集合。
Append(Groups) 将新的 Group 对象添加到 Groups 集合。
Append(Indexes) 将新的 Index 对象添加到 Indexes 集合。
Append(Keys) 将新的 Key 对象添加到 Keys 集合。
Append(Procedures) 将新的 Procedure 对象添加到 Procedures 集合。
Append(Tables) 将新的 Table 对象添加到 Tables 集合。
Append(Users) 将新的 User 对象添加到 Users 集合。
Append(Views) 将新的 View 对象添加到 Views 集合。
ChangePassword 更改用户帐号的密码。
Create 创建新的目录。
Delete 删除集合中的对象。
GetObjectOwner 返回目录中对象的拥有者。
GetPermissions 获得对象上组或用户的权限。
Item 按名称或序号返回集合的指定成员。
Refresh 更新集合中的对象,以反映针对提供者可用的和指定的对象。
SetObjectOwner 指定目录中对象的拥有者。
SetPermissions 设置对象上组或用户的权限。
四、ADOX 属性
ActiveConnection 指示目录所属的 ADO Connection 对象。
Attributes 描述列特性。
Clustered 指示索引是否被分簇。
Command 指定可用于创建或执行过程的 ADO Command 对象。
Count 指示集合中的对象数量。
DateCreated 指示创建对象的日期。
DateModified 指示上一次更改对象的日期。
DefinedSize 指示列的规定最大大小。
DeleteRule 指示主关键字被删除时将执行的操作。
IndexNulls 指示在索引字段中有 Null 值的记录是否有索引项。
Name 指示对象的名称。
NumericScale 指示列中数值的范围。
ParentCatalog 指定表或列的父目录以便访问特定提供者的属性。
Precision 指示列中数据值的最高精度。
PrimaryKey 指示索引是否代表表的主关键字。
RelatedColumn 指示相关表中相关列的名称(仅关键字列)。
RelatedTable 指示相关表的名称。
SortOrder 指示列的排序顺序(仅索引列)。
Type(列) 指示列的数据类型。
Type(关键字) 指示关键字的数据类型。
Type(表) 指示表的类型。
Unique 指示索引关键字是否必须是唯一的。
UpdateRule 指示主关键字被更新时会执行的操作。
五、范例
5.1 创建数据库范例
如下代码显示如何通过 Create 方法创建新的 Jet 数据库。
Sub CreateDatabase()
Dim cat As New ADOX.Catalog
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:new.mdb"
End Sub
5.2 创建表范例
Sub CreateTable()
Dim tbl As New Table
Dim cat As New ADOX.Catalog
'打开目录。
' 打开目录。
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:Program FilesMicrosoft Office" & _
"OfficeSamplesNorthwind.mdb;"
tbl.Name = "MyTable"
tbl.Columns.Append "Column1", adInteger
tbl.Columns.Append "Column2", adInteger
tbl.Columns.Append "Column3", adVarWChar, 50
cat.Tables.Append tbl
End Sub
5.3 创建索引范例
如下代码演示如何创建新的索引。索引针对表的两个列建立。
Sub CreateIndex()
Dim tbl As New Table
Dim idx As New ADOX.Index
Dim cat As New ADOX.Catalog
' 打开目录。
' 打开目录。
cat.ActiveConnection = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:Program FilesMicrosoft Office" & _
"OfficeSamplesNorthwind.mdb;"
' 定义表并将其追加到目录
tbl.Name = "MyTable"
tbl.Columns.Append "Column1", adInteger
tbl.Columns.Append "Column2", adInteger
tbl.Columns.Append "Column3", adVarWChar, 50
cat.Tables.Append tbl
' 定义多列索引
idx.Name = "multicolidx"
idx.Columns.Append "Column1"
idx.Columns.Append "Column2"
' 将索引追加到表上
tbl.Indexes.Append idx
End Sub
5.4 创建关键字范例
如下代码演示如何创建新的外部关键字。假定已存在两个表(Customers 和 orders)。
Sub CreateKey()
Dim kyForeign As New ADOX.Key
Dim cat As New ADOX.Catalog
cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:Program FilesMicrosoft Office" & _
"OfficeSamplesNorthwind.mdb;"
kyForeign.Name = "CustOrder"
kyForeign.Type = adKeyForeign
kyForeign.RelatedTable = "Customers"
kyForeign.Columns.Append "CustomerId"
kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
kyForeign.UpdateRule = adRICascade
cat.Tables("Orders").Keys.Append kyForeign
End Sub
最近偶然要做一个小型的数据库管理系统,为了方便用户无需自己用access创建数据库,所以,我必须设法让程序能够创建数据库,数据库表以及判断数据库表的存在。下面的程序代码希望能够为遇到这方面困难的朋友提供帮助:(2008/11/5重新编辑)
//1.引入ado库
#import "c:/Program Files/Common Files/System/ADO/Msadox.dll" rename_namespace("ADOCG") rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
#import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
using namespace ADODB;
using namespace ADOCG;
#define TESTHR(x) if FAILED(x) _com_issue_error(x);
//2.创建ACCESS数据库
BOOL CDeRenDlg::CreateMdb(CString strDBName)
{
CString strMdbConn = "Provider='Microsoft.JET.OLEDB.4.0';Data source = " + strDBName;
try
{
HRESULT hr = S_OK;
_CatalogPtr pCatalog = NULL;
_bstr_t cnnstring(strMdbConn);
TESTHR(hr = pCatalog.CreateInstance(__uuidof (Catalog)));
pCatalog->Create(cnnstring);
}
catch(_com_error e)
{
_bstr_t bstrDescription(e.Description());
CString strErro=CString(_T("创建ACCEESS数据库出错: "))
+ (LPCSTR)e.Description()
+ CString(_T("Create ACCESS DB error: "))
+ (LPCSTR)e.Description();
AfxMessageBox(strErro);
return FALSE;
}
return TRUE;
}
//3.创建数据库表-材料表
BOOL CDeRenDlg::CreateTable( CString strTabName)
{
HRESULT hr = S_OK;
_CatalogPtr pCatalog = NULL;
_TablePtr pTableNew = NULL;
_IndexPtr pIndexNew = NULL;
_IndexPtr pIndex = NULL;
_ColumnPtr pColumn = NULL;
CString strConn,strDBName;
strDBName=this->GetDBName(m_nDBYear);
CFileFind ff;
if(!ff.FindFile(strDBName))
{
AfxMessageBox("数据库不存在,请先在高级设置对话框中创建数据库!");
return FALSE;
}
strConn="Provider='Microsoft.JET.OLEDB.4.0';Data source = " + strDBName;
_bstr_t strcnn(strConn);
try
{
TESTHR(hr = pCatalog.CreateInstance (__uuidof(Catalog)));
TESTHR(hr = pTableNew.CreateInstance(__uuidof(Table)));
TESTHR(hr = pIndexNew.CreateInstance(__uuidof(Index)));
TESTHR(hr = pIndex.CreateInstance (__uuidof(Index)));
TESTHR(hr = pColumn.CreateInstance (__uuidof(Column)));
// 连接
pCatalog->PutActiveConnection(strcnn);
// 表名
pTableNew->Name = _bstr_t(strTabName);
pTableNew->ParentCatalog = pCatalog;
//
//m_pTableNew->Columns->Append("ContactId", ::adInteger,0);
//m_pTableNew->Columns->GetItem("ContactId")->Properties->GetItem("AutoIncrement")->Value = true;
// 加入字段
CString str;
str = _T("公司名称");//"公司名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false; //将必填字段设置为否
str = _T("产品名称");//"产品名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
str = _T("产品规格");//"产品名称";
pTableNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pTableNew->Columns->GetItem(_variant_t(str))->Properties->GetItem("Jet OLEDB:Allow Zero Length")->Value =false;
//*
// 加入主键
pIndexNew->Name = "pryIndex";//"日期";
pIndexNew->Columns->Append(_variant_t(str), ADOCG::adVarWChar, 50);
pIndexNew->PutPrimaryKey(-1);
pIndexNew->PutUnique(-1);
pTableNew->Indexes->Append(_variant_t ((IDispatch*)pIndexNew));
//*/
// 加入表中
pCatalog->Tables->Append(_variant_t ((IDispatch*)pTableNew));
pCatalog->Tables->Refresh();
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
AfxMessageBox(e.Description());
return FALSE;
}
return TRUE;
}
//4.判断一个表在数据库中是否存在
BOOL CDeRenDlg::IsTalbeExit(CString strTable)
{
try
{
if(!m_adoConnection.IsOpen()) return FALSE;
_RecordsetPtr pRstSchema = NULL;
pRstSchema=m_adoConnection.OpenSchema(adSchemaTables);
while(!pRstSchema->adoEOF)
{
_bstr_t table_name = pRstSchema->Fields->GetItem("TABLE_NAME")->Value;
_bstr_t table_type = pRstSchema->Fields->GetItem("TABLE_TYPE")->Value;
if ( strcmp(((LPCSTR)table_type),"TABLE")==0)
{
if(strTable.Compare((LPCSTR)table_name)==0)return true;
}
pRstSchema->MoveNext();
}
if(pRstSchema) pRstSchema->Close(); /*&&(pRstSchema->State==ADODB::adStateOpen)*/
}
catch(_com_error e)//
{
::MessageBox(NULL,e.Description(),"Error",MB_OK);
return FALSE;
}
return false;
}
最后
以上就是高贵哈密瓜为你收集整理的ADO学习(七)ADOX相关知识 一、ADOX 概述 的全部内容,希望文章能够帮你解决ADO学习(七)ADOX相关知识 一、ADOX 概述 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复