(配套例子程序:例2 _动态创建数据库表(ACCESS数据库) 、 例3_动态创建数据库表(SQL Sever 数据库))
编程环境:对话框编程 数据库名:test
1.在StdAfx.h中加入
#import "C:\Program Files\Common Files\System\ado\msadox.dll"
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
注意:对于COM库来说,要调用其中的方法,需要有域名。msadox.dll的默认域名是ADOX, msado15.dll的默认域名是ADODB,也就是说在引用它们的方法时需要在方法前加ADOX:: (ADODB::)。如果在import时用了no_namespace,则不用在方法前加域名,但同时引用多个COM库时只有一个库可以使用no_namespace。
2.定义变量
ADOX::_CatalogPtr m_pCatalog;
ADOX::_TablePtr m_pTable;
_ConnectionPtr m_pConnection;
3.初始化COM库
在OnInitDialog()中添加
::CoInitialize(NULL);
4.在OnInitDialog()中创建catalog 和 connection 实例,并分别建立连接
如果是在ACCESS数据库中创建表,代码如下:
try
{
CString strConnect;
char curDir[80];
//ADOX连接数据库
m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
GetCurrentDirectory(80,curDir);
strConnect.Format("Provider=Microsoft.JET.OLEDB.4.0;Data source=%s\\test.mdb",curDir);
m_pCatalog->PutActiveConnection(_bstr_t(strConnect));
//ADODB连接数据库
m_pConnection.CreateInstance(__uuidof(Connection)); //创建连接对象实例
strConnect="DRIVER={Microsoft Access Driver (*.mdb)};uid=;pwd=;DBQ=test.mdb;";
m_pConnection->Open(_bstr_t(strConnect),"","",adModeUnknown); //打开数据库
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
如果是在SQL Sever数据库中创建表,代码如下:
try
{
CString strConnect;
//ADOX连接数据库
m_pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
strConnect.Format("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test;Data Source=localhost");
m_pCatalog->PutActiveConnection(_bstr_t(strConnect));
//ADODB连接数据库
m_pConnection.CreateInstance(__uuidof(Connection)); //创建连接对象实例
strConnect="DRIVER={SQL Server};uid=;pwd=;Server=localhost;DATABASE=test";
m_pConnection->Open(_bstr_t(strConnect),"","",adModeUnknown); //打开数据库
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
5.在按钮的响应事件中添加
//查看myTable表是否存在,存在的话不再创建该表
m_pTable = NULL;
try
{
int tableCount=m_pCatalog->Tables->Count;
int i=0;
while(i<tableCount)
{
m_pTable=(ADOX::_TablePtr)m_pCatalog->Tables->GetItem((long)i);
CString tableName=(BSTR)m_pTable->Name;
if(tableName=="myTable")
{
return;
}
i++;
}
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
return;
}
//创建表
m_pTable = NULL;
try
{
m_pTable.CreateInstance(__uuidof(ADOX::Table));
m_pTable-> PutName( _bstr_t("myTable"));
m_pTable-> Columns-> Append( "Column1",ADOX::adInteger,0);
m_pTable-> Columns-> Append( "Column2",ADOX::adInteger,0);
m_pTable-> Columns-> Append( "Column3",ADOX::adVarWChar,8);
m_pCatalog-> Tables-> Append( _variant_t((IDispatch *)m_pTable));
}
catch(_com_error &e)
{
AfxMessageBox(e.Description());
}