无法使用 OLEDB 连接 MS Access(.mdb 文件)
Posted
技术标签:
【中文标题】无法使用 OLEDB 连接 MS Access(.mdb 文件)【英文标题】:cannot connect with MS Access (.mdb file) with OLEDB 【发布时间】:2014-12-05 14:05:32 【问题描述】:我有问题。我必须编写一个使用 OLEDB 与 MS Access(.mdb 文件)连接的 ABAP 应用程序,但我的代码无法连接。我有 SY-SUBRC = 2。我该如何解决?如何在 MS Access 中检查 SQL 中 User ID=
中的内容?
INCLUDE ole2incl.
DATA: con TYPE ole2_object,
rec TYPE ole2_object.
DATA SQL(1023).
DATA: BEGIN OF SPL OCCURS 0,
VAL(1023),
END OF SPL.
DATA: BEGIN OF I1 OCCURS 0,
F1(10),
F2 TYPE I,
END OF I1.
IF con-header IS INITIAL OR con-handle = -1.
CREATE OBJECT con 'ADODB.Connection'.
IF NOT sy-subrc = 0.
EXIT.
ENDIF.
CREATE OBJECT REC 'ADODB.Recordset'.
IF NOT sy-subrc = 0.
EXIT.
ENDIF.
ENDIF.
*MDB connetion infomations
CONCATENATE 'Provider=' '''Microsoft.Jet.OLEDB.4.0''' ';'
INTO SQL.
CONCATENATE SQL 'Password=' '''platnikbcc''' ';'
INTO SQL.
CONCATENATE SQL 'User ID=' '''Admin''' ';'
INTO SQL.
CONCATENATE SQL 'Data Source=' '''D:\Platnik.mdb''' ';'
INTO SQL.
CONCATENATE SQL 'Mode=' '''Share Deny None'''
INTO SQL.
*MDB connection
CALL METHOD OF CON 'Open'
EXPORTING #1 = SQL.
*Query run
*SY-SUBRC still equals 0
CALL METHOD OF REC 'Open'
EXPORTING #1 = SQL
#2 = CON
#3 = '1'.
*SY-SUBRC = 2 FROM HERE
*Query (select) statement ...
SQL = 'select * from UBEZP_IDENT'.
*Query run
CALL METHOD OF REC 'Open'
EXPORTING #1 = SQL
#2 = CON
#3 = '1'.
*Selecting MDB record into SAP internal table
DO.
CALL METHOD OF REC 'getstring' = SQL
EXPORTING #1 = '2' "Do not modify!
#2 = 1 "Do not modify!
#3 = '|' "Do not modify!
#4 = '|'. "Do not modify!
IF sy-SUBRC EQ 0.
REFRESH SPL. CLEAR SPL.
SPLIT SQL AT '|' INTO TABLE SPL.
LOOP AT SPL.
CASE SY-TABIX.
WHEN 1.
I1-F1 = SPL-VAL.
WHEN OTHERS.
I1-F2 = SPL-VAL.
ENDCASE.
ENDLOOP.
APPEND I1. CLEAR I1.
ELSE.
EXIT.
ENDIF.
ENDDO.
*Result writing...
LOOP AT I1.
WRITE: AT /1(10) I1-F1,
AT (10) I1-F2.
ENDLOOP.
*Connetion close & destroy
FREE OBJECT con.
FREE OBJECT rec.
【问题讨论】:
这是密码吗?哎呀... 没有问题。这是在没有敏感数据的情况下进行测试的本地安装。 :P 我很确定 SY-SUBRC 等于 2,因为 mdb 文件有密码。我更改了代码,我可以在没有密码的情况下连接 mdb 文件。 MDB 连接 - 这不起作用:CONCATENATE 'Provider=Microsoft.Jet.OLEDB.4.0;' 'Data Source=D:\Platnik2.mdb;' 'Password=''platnikbcc'';' INTO sql.
有效:CONCATENATE 'Provider=Microsoft.Jet.OLEDB.4.0;' 'Data Source=D:\Platnik2.mdb;' 'Jet OLEDB:Database Password=''platnikbcc'';' INTO sql.
【参考方案1】:
我可以自己回答! :)
我更改了代码。从 MDB 文件下载数据的管理我这里就不写了。
INCLUDE ole2incl.
TYPE-POOLS ole2.
DATA: conn TYPE ole2_object,
rsdb TYPE ole2_object,
sql TYPE c LENGTH 1024.
*You need here something to manage downloaded data!
*Create ADODB Object:
START-OF-SELECTION.
CREATE OBJECT conn 'ADODB.Connection'.
CREATE OBJECT rsdb 'ADODB.Recordset'.
*Set connection and run query:
*MDB Connetion infomations
CONCATENATE 'Provider=Microsoft.Jet.OLEDB.4.0;'
'Data Source=D:\File.mdb;' 'Jet OLEDB:Database Password=''p@s$w0rD'';'
INTO sql.
CALL METHOD OF conn 'Open' EXPORTING #1 = sql.
*Query Statement ...
sql = 'SELECT * FROM EXAMPLE'.
*Run Query
CALL METHOD OF rsdb 'OPEN'
EXPORTING
#1 = sql
#2 = conn
#3 = '1'.
*Save records
DO.
CALL METHOD OF rsdb 'getstring' = sql
EXPORTING #1 = '2' "Do not modify!
#2 = 1 "Do not modify!
#3 = ' ' "Do not modify!
#4 = ' '. "Do not modify!
IF sy-subrc EQ 0.
*Save data into (for example) internal table.
ELSE.
EXIT.
ENDIF.
ENDDO.
*Manage your data, display, whatever
【讨论】:
以上是关于无法使用 OLEDB 连接 MS Access(.mdb 文件)的主要内容,如果未能解决你的问题,请参考以下文章
使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值
连接 MS Access 而另一个应用程序使用相同的 MS Access 文件