2016-03-31 5 views
0

私の仕事で1つのプロジェクトに問題があります。私はSharepoint上のデータベースを持っています。それは.accdbファイルにアクセスされます(Access 2007/2010)。これまでは、標準のConnectionString(プロバイダ - ACEDB 12.0のみ)でADODB Connectionを使用しました。ADODB RecordsetはAccessから多値フィールド全体を取得できません

データベースから複数値フィールドの1つからデータを取得しようとすると、レコードセットはこの列に対して空です。例:

ID、場所、名前、人物(MVF)、トレーナー(MVF)の列をいくつか取得する必要があります。

[人]列の単一レコードの値が3-4より大きい場合、この列のレコードセットは空です。私がセミコロンで区切られた値を取得している場合、私はセミコロン区切りの値を取得しています(MVFのソースデータを取得するためのLEFT JOIN文でさえ違いはありません)

私はExcelで作業しています。ユーザーはExcelのみを使用します。

私はRecordsetを見ると、人々の価値を置くべきときは空の値を持っています。これを基にして、問題は接続のタ​​イプなどによって引き起こされると思います。私もDAO接続を試みました - 肯定的な結果はありません。

私はまた、SQLを実行するためにのみ.accdbファイル内にテンポラリデータベースを作成しようとしました。(INSERT INTO tmpDB SELECT inputDBから人を擬似コードすると、構文は良好です)多値フィールドの場合はINSERT INTO "となります。

MVFは使用することをお勧めしませんが、それはSharePoint DBであり、私の役割はdbから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は常に空です。

+0

OLEDBドライバの代わりにAccess ODBCドライバを使用してみましたか? –

+0

それは助けることができます。私は明日それを確認します。 – Krukosz

答えて

0

この問題は解決しました。ここで私がやったことがあります。コードに構文エラーがある可能性があります。私はここに自分の記憶から書かれたコードを投稿します - それは私の作業コードのコピーではありません。

主なものと最も重要なものは接続の種類です。再調査後、私はMicrosoftがADO接続を使用することを推奨することを発見しました。私が前に投稿したように、DAOはレコードセットを通して追加のループを必要とし、それは問題であり、DAOをConnection文字列で使用すると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 
関連する問題