我使用以下代码模式来访问我的 *.accdb 文件:
accdb_path='C:pathtoaccdbfilewbe3.accdb';
accdb_url= [ 'jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='''';DBQ=' accdb_path ];
conn = database('','','','sun.jdbc.odbc.JdbcOdbcDriver',accdb_url);
如果我想创建一个新的 *.accdb 文件,我将如何做? 网络上有很多关于如何连接的内容,但我还没有找到如何创建 *.accdb 文件本身。
如果重要,我希望能够执行SQL 92语法。 我正在使用 Matlab 2015b。 我不想使用 Matlab GUI 来探索数据库。
实际上,您尝试做的事情可能非常难以实现。它可能需要通过ActiveX
控件访问的直接接口,我什至不确定是否可以完成。网络似乎缺乏一个关于访问互操作性的坚实信息库。
我可以建议您的一个快速解决方法,尽管很痛苦,是手动创建一个空的ACCDB
文件,您可以将其用作模板,然后在必须创建新数据库时复制它:
conn = CreateDB('C:PathBwbe3.accdb');
function accdb_conn = CreateDB(accdb_path)
status = copyfile('C:PathAtemplate.accdb',accdb_path,'f');
if (status)
accdb_url = ['jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=' accdb_path];
accdb_conn = database('','','','sun.jdbc.odbc.JdbcOdbcDriver',accdb_url);
else
accdb_conn = [];
error(['Could not duplicate the ACCDB template to the directory "' accdb_path '".']);
end
end
以下示例基于 Tommaso 的答案,该答案提供了用于复制空*.accdb
文件并连接到副本的代码。 基于一个下午的试验、错误、细读 web/help,我对此进行了扩展,以创建一个数据库表并将 Matlab 表导出到其中。 我还嵌入了注释,显示需要修改的地方,可能是由于我的旧 2015b 版本的 Matlab、错误捕获结构和文件副本中的警告。
srcPath = [pwd '/emptyFile.accdb']; % Source
tgtPath = [pwd '/new.accdb']; % Target
cpyStatOk = copyfile( srcPath, tgtPath );
% No warning B4 clobber target file
if cpyStatOk
accdb_url= [ ...
'jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='''';DBQ=' ...
tgtPath ];
conn = database('','','','sun.jdbc.odbc.JdbcOdbcDriver',accdb_url);
else
error('Couldn''t copy %s to %s',srcPath,tgtPath);
end % if cpyStatOk
try
% conn.Execute(['CREATE TABLE tstMLtbl2accdb ' ... Not for 2015b
curs = conn.exec(['CREATE TABLE tstMLtbl2accdb ' ...
'( NumCol INTEGER, StrCol VARCHAR(255) );']);
if ~isempty( curs.Message )
% fprintf(2,'%s: %sn',mfilename,curs.Message);
error('%s: %sn',mfilename,curs.Message);
% Trigger `catch` & close(conn)
end %if
% sqlwrite( conn, 'tstMLtbl2accdb', ...Not supported in 2015b
datainsert( conn, 'tstMLtbl2accdb', {'NumCol','StrCol'}, ...
table( floor(10*rand(5,1)), {'abba';'cadabra';'dog';'cat';'mouse'}, ...
'VariableNames',{'NumCol','StrCol'} ) );
catch xcptn
close(conn)
fprintf(2,'Done `catch xcptn`n');
rethrow(xcptn);
end % try
%
% Other database manipulations here
%
close(conn)
disp(['Done ' mfilename]);
这对我自己来说非常有教育意义,我希望它对其他考虑使用 SQL 作为关系数据库操作代码更繁重的 Matlab 对应物的替代方案有用。 有了这么多的开销,我不得不说,对驻留在 Matlab 工作区中的数据执行 SQL 操作并不吸引人,除非真正需要关系数据库查询引擎的超优化。
对于那些精通与 Access 接口的人,您对 datainsert
函数的字段名称参数的目的的评论将不胜感激。它在文档中被称为colnames
。 根据测试,Access 中的现有目标表和 Matlab 中的源表之间的字段名称和列数必须匹配。 因此,字段名称参数似乎没有任何用途。 帮助文档并不是那么有用。
后记:我根据TMW的例子为colnams
论点编写了一个"规范"。 TMW证实了这一解释:
colnames
参数告诉外部数据库环境通过data
参数提供的数据容器的字段的名称和顺序。 这些字段名称用于将传输数据的字段与驻留在外部数据库环境中的表tablename
中的字段进行匹配。 由于这种显式名称匹配,data
中字段的顺序不必与tablename
中的字段顺序匹配。
如果我发现经验行为与上述"规范"有任何偏差,我将更新这个答案。