首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >德尔福FireDAC与MS 2010数据库。为什么它要把ACE转换成Jet呢?

德尔福FireDAC与MS 2010数据库。为什么它要把ACE转换成Jet呢?
EN

Stack Overflow用户
提问于 2015-11-19 11:11:32
回答 1查看 2K关注 0票数 2

我通过以下步骤将.mdb数据库转换为.accdb数据库:https://support.office.com/en-us/article/Convert-a-database-to-the-accdb-file-format-69abbf06-8401-4cf3-b950-f790fa9f359c (使用MS 2010)

转换后,.accdb文件以以下方式开始:(database.accdb,使用十六进制编辑器查看的文件头),这是我的目的.

代码语言:javascript
运行
复制
00 01 00 00 53 74 61 6E 64 61 72 64 20 41 43 45 20 44 42 00 02 00 00 00 B5 6E 03 62 60 09 C2 55 E9 A9 67 72 40 3F 00 9C 7E 9F 90 FF 85 9A 31 C5
....Standard ACE DB.....µn.b`.ÂUé©gr@?.œ~Ÿ.ÿ…š1Å

打开数据库后,删除一个表,重新创建该表,并使用TFDConnection / TFDPhysMSAccessDriverLink / TFDBatchMove / TFDBatchMoveDataSetReader / TFDBatchMoveDataSetWriter和以下代码进行一些插入

代码语言:javascript
运行
复制
  FAccessDB := TFDConnection.Create(Self);
  FAccessDB.Name := '';
  FAccessDB.Params.Clear;
  FAccessDB.Params.Add('DriverID=MSAcc_Direct');
  FAccessDB.LoginPrompt := False;

  // FDPhysMSAccessDriverLink1
  FFDPhysMSAccessDriverLink1 := TFDPhysMSAccessDriverLink.Create(Self);
  FFDPhysMSAccessDriverLink1.Name := '';
  FFDPhysMSAccessDriverLink1.DriverID := 'MSAcc_Direct';

  // Table_Out
  FFDTable_Out := TFDTable.Create(Self);
  FFDTable_Out.Name := '';
  FFDTable_Out.Connection := FAccessDB;

  // FDBatchMove1
  FFDBatchMove1 := TFDBatchMove.Create(Self);
  FFDBatchMove1.Name := '';
  FFDBatchMove1.OnError := FDBatchMove1Error;
  FFDBatchMove1.OnFindDestRecord := FDBatchMove1FindDestRecord;
  FFDBatchMove1.OnProgress := FDBatchMove1Progress;

  // FDBatchMoveDataSetReader1
  FFDBatchMoveDataSetReader1 := TFDBatchMoveDataSetReader.Create(Self);
  FFDBatchMoveDataSetReader1.Name := '';

  // FDBatchMoveDataSetWriter1
  FFDBatchMoveDataSetWriter1 := TFDBatchMoveDataSetWriter.Create(Self);
  FFDBatchMoveDataSetWriter1.Name := '';

  // FDBatchMove1
  FFDBatchMove1.Reader := FFDBatchMoveDataSetReader1;
  FFDBatchMove1.Writer := FFDBatchMoveDataSetWriter1;
  FFDBatchMove1.Options := [poIdentityInsert];

  FAccessDB.Params.Values['Database'] := 'database.accdb';
  FAccessDB.Connected := True;
  aDropTableSQL := 'DROP TABLE ' + FTablenameDest;
  FAccessDB.ExecSQL(aDropTableSQL);
  FAccessDB.Commit;
  aCreateTableSQL := 'CREATE TABLE ' + FTablenameDest; // plus the rest 
                                              //of the create statement

  FFDTable_Out.TableName := FTablenameDest;
  FFDTable_Out.Active := True;
  FFDBatchMoveDataSetReader1.DataSet := FDataSetSrc; // a TDataset from 
                                                       // another database 
  FFDBatchMoveDataSetWriter1.DataSet := FFDTable_Out;
  FFDBatchMoveDataSetWriter1.Direct := True;

  FFDBatchMoveDataSetReader1.DataSet.Active := True;
  FFDBatchMoveDataSetWriter1.DataSet.Active := True;

  FFDBatchMove1.Mode := dmAlwaysInsert;
  FFDBatchMove1.Execute;
  FAccessDB.Commit;
  FAccessDB.Connected := False;

  FFDMSAccessService1 := TFDMSAccessService.Create(Self);
  FFDMSAccessService1.Name := '';

  FFDMSAccessService1.Database := 'database.accdb';
  FFDMSAccessService1.DestDatabase := 'database.accdb_temp.accdb';

  FFDMSAccessService1.DBVersion := avAccess2007;

  FFDMSAccessService1.Compact;   // <-- seems to convert here...

database.accdb的文件头变成

代码语言:javascript
运行
复制
00 01 00 00 53 74 61 6E 64 61 72 64 20 4A 65 74 20 44 42 00 01 00 00 00 B5 6E 03 62 60 09 C2 55 E9 A9 67 72 40 3F 00 9C 7E 9F 90 FF 85 9A 31 C5
....Standard Jet DB.....µn.b`.ÂUé©gr@?.œ~Ÿ.ÿ…š1Å

同样,在从.mdb转换到.accdb之前也是如此。

在我看来,“标准喷气数据库”意味着旧格式(.mdb),“标准.accdb”表示新格式(.accdb)

FireDAC会把它转换回来吗?为什么?如何保持新的访问格式(.accdb,.accdb)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-20 09:50:41

刚收到Embarcadero的答复(非常快的回答,酷!):

写道:这是一个众所周知的问题。目前,TFDMSAccessService并不真正支持avAccess2007。

--

致以最良好的问候,Dmitry / FireDAC架构师

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33802277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档