无法使用 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 文件)的主要内容,如果未能解决你的问题,请参考以下文章

OleDB 锁复制 .NET MS Access

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

连接 MS Access 而另一个应用程序使用相同的 MS Access 文件

使用 Oledb 对象插入 ms-access 查询获取无效查询异常

MS Access OleDB 不返回任何行

如何在 C# 中使用 OleDB 列出 MS Access 文件中的所有查询?