ADODB Recordset无法从Access

时间:2016-03-31 21:30:37

标签: excel vba ms-access sharepoint

我的工作中有一个项目有问题。我有一个关于Sharepoint的数据库。它被挂钩到.accdb文件(Access 2007/2010)。到目前为止,我使用ADODB Connection与标准ConnectionString(只有Provider - ACEDB 12.0)。

当我尝试从数据库中的多值字段中获取数据时,该列的记录集为空。例如:

我必须得到几个列:ID,位置,名称,人物(MVF),培训师(MVF)。

当People列中的单个记录超过3-4个值时 - 此列的记录集为空。如果少于3-4个值,我将得到以分号分隔的值(即使是LEFT JOIN语句来获取MVF的源数据也没有任何区别)

我正在使用Excel - 最终用户只使用Excel。

当我观看Recordset时 - 当应该放置人们的值时它有空值 - 基于此我认为问题是由连接类型或其他原因造成的。我也试过DAO连接 - 没有积极的结果。

我还尝试在.accdb文件中创建一个临时数据库,只执行SQL(INSERT INTO tmpDB SELECT People FROM inputDB; -it是伪代码,语法很好)然后我得到“无法执行INSERT INTO为多值字段“。

我知道,建议不要使用MVF,但它是一个SharePoint数据库,我的角色只是将数据从数据库传输到Excel。

更新

我尝试使用ODBC驱动程序......

objConn.ConnectionString = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & myconn & ";Uid=Admin;Pwd=;"

......而不是OLEDB提供商...

objConn.Provider = "Microsoft.ACE.OLEDB.12.0"
objConn.Open myconn

...但现在MVF总是空的。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。这就是我所做的。代码可能有语法错误。我在这里发布了从我的记忆中写下的代码 - 它不是我工作代码的副本。

主要和最重要的是连接类型。在研究后,我发现Microsoft建议使用ADO连接。正如我之前发布的那样,DAO需要通过记录集进行额外的循环,这可能是一个问题,使用带有连接字符串的DAO看起来并不比ADO好。

从MVF获取数据的最佳和唯一方法是DAO,但连接必须由" OpenDatabase"方法 - 在这种情况下,具有大量值的MVF没有问题。

Sub ImportMVFs()

 Dim dbs As DAO.Database
 Dim rsRecord As DAO.Recordset
 Dim rsChild As DAO.Recordset
 Dim strSQL As String
 Set dbs = "Path to database - works with .accdb too"
 Set db = ws.OpenDatabase(dbs) 'This type of connection is a best way to import from MVF.

 strSQL = "SELECT * FROM tblToImport;"
 Set rsRecord = db.OpenRecordset(strSQL)
 Debug.Print rsRecord.Field("Column1").Value
 Debug.Print rsRecord.Field("Column2").Value

 Do Until rsRecord.EOF

      Set rsChild = rsRecord.Field("MultiValuedFieldColumn") 

      Do Until rsChild.EOF
        Debug.Print rsChild.Field(0).Value 'We have to iterate through all mvfs
        'Here it's possible to make a temporary table in Access to reorganize MVFs into simple records
        'For example: Using SQLQuery as SQL string with Execute method.

        db.Execute SQLQuery
        rsChild.MoveNext
      Loop

      rsRecord.MoveNext

 Loop

 rsRecord.Close


 Set rsRecord = Nothing
 Set dbs = Nothing

End Sub