ado中是否能动态创建mdb数据库? 请问ado中是否支持动态创建数据库并且在其中创建表并进行各种操作?如果不支持用哪种方法比较好?请贴出源码。或给出连接。我比较菜,希望多点注释。给我发邮件也可以。稿费酬谢。呵呵 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用ADOX::CatalogPtr来创建mdb文件: HRESULT hr = S_OK; //Set ActiveConnection of Catalog to this string CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = d:\\test.mdb")); try { ADOX::_CatalogPtr m_pCatalog = NULL; hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog)); if(FAILED(hr)) { _com_issue_error(hr); } else { m_pCatalog->Create(_bstr_t(strcnn)); //Create MDB } } catch(_com_error &e) { // Notify the user of errors if any. AfxMessageBox(_T(“error“)); } ado技术目前已经成为连接数据库的主流技术,下面我来介绍如何使用ado来动态创建access数据库。为了使用ado,必须引入微软的两个动态连接库msadox.dll和msado15.dll:#pragma warning (disable: 4146)#import "c:\Program Files\Common Files\system\ado\msadox.dll"#import "c:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")#pragma warning (default: 4146)将上述代码加入到stdafx.h文件中,由于ado是com组件,因此使用ado之前还要初始化com环境:CoInitialize(NULL); 下面是一个在access数据库中创建表的sql语句的例子:create table test( name text(20) WITH COMPRESSION not null, score decimal(12,4) not null default 0, ID smallint not null default 0, birthday date, sex char(1), CONSTRAINT CK_CH_SEX Check(SEX in ('N','V')), CONSTRAINT PK_ID Primary Key (ID)); 使用ADOX::CatalogPtr来创建mdb文件: HRESULT hr = S_OK; //Set ActiveConnection of Catalog to this string CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = d:\\test.mdb")); try { ADOX::_CatalogPtr m_pCatalog = NULL; hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog)); if(FAILED(hr)) { _com_issue_error(hr); } else { m_pCatalog->Create(_bstr_t(strcnn)); //Create MDB } } catch(_com_error &e) { // Notify the user of errors if any. AfxMessageBox(_T(“error“)); } 创建一个连接对象打开刚刚建立的mdb文件:_ConnectionPtr g_pConn; g_pConn.CreateInstance(__uuidof(Connection)); g_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb;", "", "", adConnectUnspecified); 下面函数用来执行sql文件中的sql语句:// Function name : RunSqlScript// Description : 执行SQL脚本, [email protected], 2003-09-15// Return type : BOOL 成功返回TRUE// Argument : LPCSTR SqlScriptFile SQL脚本文件名// Argument : char separator SQL 分割符号, 缺省';' // Argument : char Re SQL 注释符号, 缺省'-'BOOL RunSqlScript(LPCSTR SqlScriptFile, char separator = ';', char Re = '-'){ BOOL bRet = FALSE; CFileFind finder; CString ErrLong; if (finder.FindFile(SqlScriptFile) == TRUE) { CFile fSql; TCHAR *buffer, *pSQL, *p; fSql.Open(SqlScriptFile,CFile::modeRead); UINT nFileLength = fSql.GetLength(); buffer = (TCHAR *)malloc((nFileLength + 1) * sizeof(TCHAR)); _tcsnset(buffer, TCHAR('\0'), nFileLength + 1); UINT nBytesRead = fSql.Read(buffer,nFileLength); //把sql文件内容读入内存缓冲区 fSql.Close(); p = pSQL = buffer; BOOL bRunOK = FALSE; BOOL bInNote = FALSE; BOOL bSkip = FALSE; CString strSQL; TCHAR ch; ErrLog = _T(""); while (p < (buffer + nFileLength)){ //判断是否是注释行 if (bInNote) { if (*p == TCHAR('\x0a')) bInNote = FALSE; } else { if ((*p == Re) && (*(p+1) == Re)) { bInNote = TRUE; p++; } else { //判断是否是sql语句结束标志 if (*p == separator){ strSQL = _T(""); bSkip = FALSE; while (pSQL < p) { if (bSkip == FALSE){ if ((*(pSQL) == Re) &&(*(pSQL+1) == Re)) { bSkip = TRUE; pSQL++; } else { ch = *pSQL; strSQL = strSQL+ch; } } else{ if (*pSQL = TCHAR('\x0a')){ bSkip = FALSE; ch = TCHAR(' '); strSQL = strSQL + ch; } } pSQL++; } pSQL = p + 1; ErrLog = ErrLog + _T("-- SQL Running ...\n");& 出错了啊。我再一个基于对话框的初始化函数里测试。其中执行到hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog));时。hr为FAILED即无法创建。这是怎么一回事阿。编译没有提示出错阿。但是无法实现创建数据库的功能 看我的blog http://blog.csdn.net/laiyiling 问题已经查出来了.是我自己的问题.非常感谢vcleaner(我没做大哥已经很久了.......) 的热心帮助这100分当之无愧.同时也谢谢热心参与讨论的各位大哥.希望我们以后共同交流vc的经验.结贴了啊!!!!!!!!!!!!!! [API] 請問有 FindMemory 的 API 嗎 Mscomm控件问题 定时器制作 配置文件不能正确读写!!!! 如何删除非模式对话框? 要对单文档视图进行切分窗口应该怎么做呀? 招聘成都的程序员VC.. 什么地方可以找到win2000的ddk 不用MFC,如何使用ActiveX控件? 急!跪求,IE浏览器不支持这个ACTIVE X 控件的原因及解决办法! 编译错误,不知道是什么原因 VCKBase5周年精华版光盘(2CD)代理(北京地区送上门)
//Set ActiveConnection of Catalog to this string
CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = d:\\test.mdb"));
try
{
ADOX::_CatalogPtr m_pCatalog = NULL;
hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog)); if(FAILED(hr)) { _com_issue_error(hr); } else {
m_pCatalog->Create(_bstr_t(strcnn)); //Create MDB }
}
catch(_com_error &e)
{
// Notify the user of errors if any.
AfxMessageBox(_T(“error“));
}
#import "c:\Program Files\Common Files\system\ado\msadox.dll"
#import "c:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFile")
#pragma warning (default: 4146)将上述代码加入到stdafx.h文件中,由于ado是com组件,因此使用ado之前还要初始化com环境:CoInitialize(NULL); 下面是一个在access数据库中创建表的sql语句的例子:create table test
(
name text(20) WITH COMPRESSION not null, score decimal(12,4) not null default 0, ID smallint not null default 0, birthday date, sex char(1), CONSTRAINT CK_CH_SEX Check(SEX in ('N','V')), CONSTRAINT PK_ID Primary Key (ID)); 使用ADOX::CatalogPtr来创建mdb文件: HRESULT hr = S_OK;
//Set ActiveConnection of Catalog to this string
CString strcnn(_T("Provider=Microsoft.JET.OLEDB.4.0;Data source = d:\\test.mdb"));
try
{
ADOX::_CatalogPtr m_pCatalog = NULL;
hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog)); if(FAILED(hr)) { _com_issue_error(hr); } else {
m_pCatalog->Create(_bstr_t(strcnn)); //Create MDB }
}
catch(_com_error &e)
{
// Notify the user of errors if any.
AfxMessageBox(_T(“error“));
} 创建一个连接对象打开刚刚建立的mdb文件:_ConnectionPtr g_pConn; g_pConn.CreateInstance(__uuidof(Connection)); g_pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\test.mdb;",
"", "", adConnectUnspecified); 下面函数用来执行sql文件中的sql语句:// Function name : RunSqlScript
// Description : 执行SQL脚本, [email protected], 2003-09-15
// Return type : BOOL 成功返回TRUE
// Argument : LPCSTR SqlScriptFile SQL脚本文件名
// Argument : char separator SQL 分割符号, 缺省';'
// Argument : char Re SQL 注释符号, 缺省'-'
BOOL RunSqlScript(LPCSTR SqlScriptFile, char separator = ';', char Re = '-')
{
BOOL bRet = FALSE;
CFileFind finder;
CString ErrLong;
if (finder.FindFile(SqlScriptFile) == TRUE)
{
CFile fSql;
TCHAR *buffer, *pSQL, *p;
fSql.Open(SqlScriptFile,CFile::modeRead);
UINT nFileLength = fSql.GetLength();
buffer = (TCHAR *)malloc((nFileLength + 1) * sizeof(TCHAR));
_tcsnset(buffer, TCHAR('\0'), nFileLength + 1); UINT nBytesRead = fSql.Read(buffer,nFileLength); //把sql文件内容读入内存缓冲区
fSql.Close(); p = pSQL = buffer;
BOOL bRunOK = FALSE;
BOOL bInNote = FALSE;
BOOL bSkip = FALSE;
CString strSQL;
TCHAR ch;
ErrLog = _T("");
while (p < (buffer + nFileLength)){
//判断是否是注释行
if (bInNote)
{
if (*p == TCHAR('\x0a'))
bInNote = FALSE;
}
else
{
if ((*p == Re) && (*(p+1) == Re))
{
bInNote = TRUE;
p++;
}
else
{
//判断是否是sql语句结束标志
if (*p == separator){
strSQL = _T("");
bSkip = FALSE;
while (pSQL < p)
{
if (bSkip == FALSE){
if ((*(pSQL) == Re) &&(*(pSQL+1) == Re))
{
bSkip = TRUE;
pSQL++;
}
else
{
ch = *pSQL;
strSQL = strSQL+ch;
}
}
else{
if (*pSQL = TCHAR('\x0a')){
bSkip = FALSE;
ch = TCHAR(' ');
strSQL = strSQL + ch;
}
}
pSQL++;
}
pSQL = p + 1;
ErrLog = ErrLog + _T("-- SQL Running ...\n");
&
我再一个基于对话框的初始化函数里测试。
其中执行到hr = m_pCatalog.CreateInstance(__uuidof (ADOX::Catalog));
时。hr为FAILED即无法创建。
这是怎么一回事阿。编译没有提示出错阿。
但是无法实现创建数据库的功能
这100分当之无愧.
同时也谢谢热心参与讨论的各位大哥.希望我们以后共同交流vc的经验.
结贴了啊!!!!!!!!!!!!!!