本文演示了如何使用 ActiveX 数据对象扩展的数据定义语言和 $ 安全 (ADOX) 使用 Visual c + + 创建新的 Jet 数据库使用较旧的格式化 Jet 数据库中的数据。 本文还说明 ADOX 使用 Visual c + + 中使用以下技术:
- 如何使用 ADOX 使用 Visual c + + 创建 Jet 数据库
- 如何获取数据库中的表的列表
- 如何获取包括列和类型的表的元数据
- 如何使用 ADOX 的 附加 方法可创建表和列
- 如何使用 Jet OLE DB 提供程序特定的属性创建链接的表
- 如何使用 ADOX 结合 ADO 将数据从一个数据库复制到另一个数据库
- 如何从 Jet 数据库中删除表
将测试
CompactDatabase 方法在 Jet 同步复制对象 (JRO) 的显示方法不会不 efectively 表格转换为 Jet 4.0 格式如果源表是在 Access 2.0 中或在 Access 95 格式。如果 Access 2.0 或 Access 95 中生成的表将转换为使用 JRO 对象的
CompactDatabase 方法的 Jet 4.0 格式,Access 2000 或 Access 2002,不能成功地打开该数据库。此问题是仍在 microsoft 的调查。请注意 JRO 对象打算只使用 Jet 4.0 和 Jet 3.5 x 格式的数据库。
若要转换您旧的 Jet 数据库 (早于 Jet 3.5 格式),请创建一个新的 4.0 格式数据库并将复制的所有表使用 ADOX。下面的代码演示如何执行此操作。这是一个简单的示例,不能解决几个特殊的方案,如主关键字、 索引、 属性,和关系。该示例仅复制表并不复制源数据库中的其他对象。有关这些技术的其他信息,请参阅 MSDN 库的网站上的 ADOX 文档。
将下面的代码保存在一个 c + + 项目,然后生成项目:
注意: 您没有更改任何内容在代码中的 # import 和连接字符串路径除外。
#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll"
#include <iostream>
using namespace std;
void main()
{
CoInitialize(NULL);
//ADO Connection Object pointers for source and destination.
ADODB::_ConnectionPtr SourceCon = NULL;
ADODB::_ConnectionPtr DestCon = NULL;
//ADOX Catalog object pointers for source and destination.
ADOX::_CatalogPtr DestDB = NULL;
ADOX::_CatalogPtr SourceDB = NULL;
//Connection string.
_bstr_t SrcConnectionString(L""), DestConnectionString(L""), SourceDBLocation(L"");
ADOX::_TablePtr linkedTbl = NULL;
ADOX::_ColumnPtr f = NULL;
ADOX::_TablePtr DestTable = NULL;
try{
SourceDBLocation = (L"C:\\JET30FormatDB.mdb");
//Per Q299484, you must use ODBC Provider to avoid alphabetical ordering.
SrcConnectionString = "Driver={Microsoft Access Driver (*.mdb)};"
"DBQ=" + SourceDBLocation;
DestConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"
"Data Source=C:\\JET40FormatDB.mdb;" ;
SourceCon.CreateInstance(__uuidof(ADODB::Connection));
SourceCon->Open(SrcConnectionString,"","",-1);
SourceDB.CreateInstance(__uuidof (ADOX::Catalog));
//ADOX catalog must have an active ADO connection
SourceDB->PutActiveConnection(_variant_t((IDispatch *) SourceCon));
DestDB.CreateInstance(__uuidof (ADOX::Catalog));
//This line creates a Jet database, and throws an exception if it already exists.
DestDB->Create(DestConnectionString);
DestCon.CreateInstance(__uuidof(ADODB::Connection));
DestCon->Open(DestConnectionString,"","",-1);
DestDB->PutActiveConnection(_variant_t((IDispatch *) DestCon));
//Get the count of tables in Source Database.
long x = SourceDB->Tables->Count;
for (int i = 0; i < x ; i++)
{
// Go through each table that is listed as TABLE and not SYSTEM TABLE or ACCESS SYSTEM TABLE.
if (SourceDB->Tables->Item[(long)i]->Type == _bstr_t(L"TABLE"))
{
cout<<"Now copying "<< (LPCSTR)SourceDB->Tables->Item[(long)i]->Name<<endl;
_bstr_t tblName = SourceDB->Tables->Item[(long)i]->Name;
//Start creating a table.
DestTable.CreateInstance(__uuidof(ADOX::Table));
DestTable->Name = tblName;
//Get number of columns in Source Table.
int cnt = SourceDB->Tables->Item[tblName]->Columns->Count;
//Use ADOX Append method to append all columns to the destination table.
for ( int col = 0; col < cnt; col++)
{
f = SourceDB->Tables->Item[tblName]->Columns->Item[(long)col];
DestTable->Columns->Append(f->Name,f->Type,f->DefinedSize);
}
//Finally, append destination table.
DestDB->Tables->Append( DestTable.GetInterfacePtr());
//This step is to get the data from source table.
//Create a temporary linked table in Destination Database
//and run "Insert Into mynewTable Select * from LinkedTable".
linkedTbl.CreateInstance(__uuidof(ADOX::Table));
linkedTbl->ParentCatalog = DestDB;
linkedTbl->Name = "TempLink2";
linkedTbl->Properties->Item["Jet OLEDB:Create Link"]->Value = (long)true;
linkedTbl->Properties->Item["Jet OLEDB:Link Datasource"]->Value = SourceDBLocation;
linkedTbl->Properties->Item["Jet OLEDB:Remote Table Name"]->Value = tblName;
DestDB->Tables->Append(linkedTbl.GetInterfacePtr());
DestCon->Execute("Insert into " + tblName + " Select * From TempLink2", NULL, -1);
//You do not have to keep this linked table around, so you can delete it.
DestDB->Tables->Delete("TempLink2");
DestTable.Release();
linkedTbl.Release();
}
else
{
cout <<"Skipping "<< (LPCSTR)SourceDB->Tables->Item[(long)i]->Name <<endl;
}
} // End of for loop.
DestCon->Close();
SourceCon->Close();
}
catch(_com_error &e)
{
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
cout<< "Source: "<< (LPCSTR)bstrSource <<"\nDescription : " << (LPCSTR)bstrDescription <<endl;
}
}
有关详细的信息,请访问 MSDN 库在下面的 Microsoft 网站:
在左窗格的 MSDN 库中在目录树中浏览到下面的帮助主题:
\Data Access
\Microsoft Data Access Components
\ADO
\SDK Documentation
\Microsoft ActiveX Data Objects (ADO)
\ADO Programmer's Guide
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
225048
(http://support.microsoft.com/kb/225048/EN-US/
)
信息: 从 DAO/jet 迁移到 ADO/jet 的问题
304322
(http://support.microsoft.com/kb/304322/EN-US/
)
ACC2002: 如何使用 ADOX 要导入关系
230588
(http://support.microsoft.com/kb/230588/EN-US/
)
如何链接和刷新链接使用 ADOX 的 Jet 表
279245
(http://support.microsoft.com/kb/279245/EN-US/
)
FIX: 设置或通过使用一个访问数据库的 ADOX 检查值时,默认列属性清除
304323
(http://support.microsoft.com/kb/304323/EN-US/
)
ACC2002: 如何使用 ADOX 功能来创建一个 SQL 传递查询
275252
(http://support.microsoft.com/kb/275252/EN-US/
)
ACC2000: 如何创建表与通过 ADOX 的 Jet 数据类型
252908
(http://support.microsoft.com/kb/252908/EN-US/
)
如何使用 ADOX 通过主键创建表
230501
(http://support.microsoft.com/kb/230501/EN-US/
)
如何压缩的 Access 数据库,通过 ADO
文章编号: 321328 - 最后修改: 2005年8月15日 - 修订: 1.4
这篇文章中的信息适用于:
- Microsoft Visual Studio 6.0 企业版
- Microsoft ActiveX Data Objects 2.7
| kbmt kbfile kbhowto KB321328 KbMtzh |
机器翻译注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版:
321328
(http://support.microsoft.com/kb/321328/en-us/
)
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。