请问,怎么在VC中判断Access数据库中的某个表是否存在?如果不存在就创建,否则就删除该表,然后再创建?

wingswings 2006-02-14 09:40:37
是不是能用一条sql语句实现呢??

另外,再请教一下,怎么用ADO来创建.mdb文件呢??
...全文
478 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wingswings 2006-02-20
  • 打赏
  • 举报
回复
wangk(倒之) :
真是太感谢了,MDB已经能够自动生成了。

可是最初的那个问题没什么办法了,是吗??只能通过查询结果来处理了??
wangk 2006-02-20
  • 打赏
  • 举报
回复
晕,楼主没看明白我的意思,我解释一下:
#import "c:\Program Files\Common Files\system\ado\Msado15.dll" no_namespace rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
#import "c:\Program Files\Common Files\System\ADO\Msadox.dll" rename_namespace("MsAdoxDB") rename("EOF", "adoXEOF")

这样可以直接使用Msado里面的东西,而Msadox的东西就需要使用命名空间了像这样:MsAdoxDB::_CatalogPtr m_pCatalog;
chehw 2006-02-18
  • 打赏
  • 举报
回复
如果用ODBC
判断表是否存在
SQLRETURN rc=SQLTables(hstmt, NULL, NULL, szTableName, "TABLE");

创建mdb:
SQLConfigDataSource(hWnd,
ODBC_CONFIG_DSN,
"Microsoft Access Driver (*.mdb)"
"CREATE_DB=yourdb.mdb;driver={Microsoft Access Driver (*.mdb)};READONLY=FALSE;");
zxfhero 2006-02-18
  • 打赏
  • 举报
回复
CString m_string;
CString m_Getstring;

m_comobject.GetLBText(m_comobject.GetCurSel(),m_string);
m_comban.GetLBText(m_comban.GetCurSel(),m_Getstring);
CString SqlCmd;
SqlCmd.Format("Alter Table %sSTUDENT Add %s REAL;",m_Getstring,m_string );
theApp.m_DB.ExecuteSQL(SqlCmd);
SqlCmd.Format("%s的%s加入成功",m_Getstring ,m_string);
AfxMessageBox(SqlCmd);
wingswings 2006-02-17
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP]) :
因为类似的错误很多,是不是每个都要rename呢??
蒋晟 2006-02-17
  • 打赏
  • 举报
回复
Yes, unless you redefine the conflicting redefinitions.
wingswings 2006-02-15
  • 打赏
  • 举报
回复
我顶
蒋晟 2006-02-15
  • 打赏
  • 举报
回复
_ConnectionPtr is in the ADO namespace. check your name of the ADO namespace
wingswings 2006-02-15
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP]) :
谢谢回复,可是依然还有很多处显示错误,真是奇怪.
#import "c:\Program Files\Common Files\system\ado\Msado15.dll" rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
#import "c:\Program Files\Common Files\System\ADO\Msadox.dll" rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
这样的话,会显示
error C2501: '_ConnectionPtr' : missing storage-class or type specifiers
等一系列错误
#import "c:\Program Files\Common Files\system\ado\Msado15.dll" no_namespace rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
#import "c:\Program Files\Common Files\System\ADO\Msadox.dll" no_namespace rename("EOF", "adoXEOF") rename("DataTypeEnum","adoXDataTypeEnum")
这样的话
则会提示
error C2011: '_Collection' : 'struct' type redefinition
等错误,
我之前用的是
#import "c:\Program Files\Common Files\system\ado\Msado15.dll" no_namespace rename("EOF","adoEOF") rename("DataTypeEnum","adoDataTypeEnum")
基本正常,没什么错,看来ADOX和ADO不能共存
蒋晟 2006-02-15
  • 打赏
  • 举报
回复
http://blog.joycode.com/jiangsheng/archive/2005/02/27/45009.aspx
wingswings 2006-02-14
  • 打赏
  • 举报
回复
wangk(倒之) :
如果只用adox的话
之前使用的
// 定义ADO连接、命令、记录集变量指针
_ConnectionPtr m_pPlanConn;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecordset;
就会使用出错啊
wingswings 2006-02-14
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP]) :
谢谢先,我之前在SQL SERVER2000里用的是
IF not EXISTS (SELECT name FROM sysobjects WHERE name = 'mytable1')
CREATE table mytable1 (MoudleNo int NULL, Para11 int NULL)
就可以实现了
ACCESS里面可以用
SELECT MSysObjects.Name FROM MsysObjects WHERE MSysObjects.Name = 'mytable'
查到是否存在目标表格
但是用
IF not EXISTS (SELECT MSysObjects.Name FROM MsysObjects WHERE MSysObjects.Name = 'mytable')
CREATE table mytable1 (MoudleNo int NULL, Para11 int NULL)
会提示出错,不知在ACCESS里面要怎么改呢??
wangk 2006-02-14
  • 打赏
  • 举报
回复
#import "C:\Program Files\Common Files\System\ado\msadox.dll" rename_namespace("msadoxnamespace") rename("EOF", "EndOfFile")

使用msadox里的东西就用msadoxnamespace::*。

wingswings 2006-02-14
  • 打赏
  • 举报
回复
jiangsheng(蒋晟.Net[MVP]) :
谢谢,这是个自动生成MDB文件的链接吧,里面用到了ADOX,可是我也用到了ADO,两个可以并存吗??
ADOX要求
#import "C:\Program Files\Common Files\System\ado\msadox.dll"
no_namespace rename("EOF", "EndOfFile")
ADO要求
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
两个不能都解开啊,提示有重复定义了
“msadox.tlh(104) : error C2011: '_Collection' : 'struct' type redefinition”之类的
有没办法呢??
蒋晟 2006-02-14
  • 打赏
  • 举报
回复
// Function that gets all table names & excludes System tables and views
void OpenSchemaTables()
{

ADODB::_ConnectionPtr Con;
ADODB::_RecordsetPtr Rs1;

CString csTemp;
_variant_t varCriteria[4];
LONG lIndex = 0;
HRESULT hr = 0;

try
{
// Getting primary key information for table "Authors".

_bstr_t bstrTableType("Table");

varCriteria[0].vt = VT_EMPTY;
varCriteria[1].vt = VT_EMPTY;
varCriteria[2].vt = VT_EMPTY;
varCriteria[3] = bstrTableType;

VARIANT varData;
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 4;
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);

// Fill the safe array.
for( lIndex = 0 ; lIndex < 4 ;lIndex++)
{
hr = SafeArrayPutElement(psa, &lIndex,&varCriteria[lIndex]);
}
// Initialize variant with safearray.
varData.vt = VT_VARIANT | VT_ARRAY;
V_ARRAY(&varData) = psa;

Con.CreateInstance(__uuidof(ADODB::Connection));
Con->Open(L"DSN=pubs", L"", L"", -1L);

Rs1 = Con->OpenSchema(ADODB::adSchemaTables,varData);

int nFieldCount = Rs1->Fields->GetCount();
VARIANT varValue;

csTemp.Empty();
while (VARIANT_TRUE != Rs1->GetadoEOF())
{
// Traversing through the Fields collection to get the values.
if(!csTemp.IsEmpty())
csTemp += " ; ";

varValue = Rs1->Fields->GetItem(_variant_t((long)2))->Value;
if(varValue.vt == VT_BSTR)
csTemp += varValue.bstrVal;
else
if(varValue.vt == VT_UI4)
csTemp.Format("%s %l",csTemp,varValue.lVal);

Rs1->MoveNext();
}
OutputDebugString(csTemp);
}
catch(_com_error &e)
{
// Exception handling.
DumpError(e);
}

}

// Utility function that gets error information from _com_error and
// displays an error message box.
void DumpError(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
CString str;
str.Format("\tCode = %08lx", e.Error());
str += " Msg: "; str += e.ErrorMessage();
str += " Source: "; str += bstrSource;
str += " Description: "; str += bstrDescription;
AfxMessageBox(str);
}
syy64 2006-02-14
  • 打赏
  • 举报
回复
不是用Sql语句啊,从数据库里取表名。
wingswings 2006-02-14
  • 打赏
  • 举报
回复
syy64(太平洋):
SELECT MSysObjects.Name FROM MsysObjects WHERE MSysObjects.Name = 'mytable'
这一句应该和你说的一样

在sql server2000中可以用if not exists来判断,可是在access中这样不行,不知有什么对应的SQL语句吗??
syy64 2006-02-14
  • 打赏
  • 举报
回复
打开数据库,读出所有的表名,判断是否跟你给的某个表名一样。
蒋晟 2006-02-14
  • 打赏
  • 举报
回复
http://www.codeguru.com/cpp/data/mfc_database/ado/article.php/c4315/
wingswings 2006-02-14
  • 打赏
  • 举报
回复
谢谢aa3000(杀手K) ,我用的是ado
可以用
SELECT MSysObjects.Name FROM MsysObjects WHERE MSysObjects.Name = 'mytable'
来查是否存在
可是接下来呢??
加载更多回复(1)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧