2016-03-31 2 views
0

У меня проблема с одним проектом в моей работе. У меня есть база данных по Sharepoint. Он подключен к файлу .accdb (Access 2007/2010). До сих пор я использовал ADODB Connection со стандартным ConnectionString (только Provider - ACEDB 12.0).ADODB Recordset не может получить целое многозначное поле из Access

Когда я пытаюсь получить данные из одного из многозначного поля из базы данных, набор записей пуст для этого столбца. Пример:

Мне нужно получить несколько столбцов: ID, местоположение, имя, люди (MVF), тренеры (MVF).

Когда одна запись в столбце Люди имеет более чем 3-4 значения - набор записей для этого столбца пуст. Если значение меньше 3-4, я получаю значения, разделенные точкой с запятой (даже оператор LEFT JOIN для получения исходных данных MVF не имеет значения)

Я работаю над Excel - пользователь использует ТОЛЬКО Excel.

Когда я смотрю набор Recordset - он имеет пустые значения, когда должны быть установлены значения людей. Основываясь на этом, я думаю, что проблема вызвана типом подключения или чем-то еще. Я пробовал также подключение DAO - никаких положительных результатов.

Я также пытался создать временную базу данных в файле .accdb только для выполнения SQL (INSERT INTO tmpDB SELECT People FROM inputDB; -это псевдокод, синтаксис хорош) И затем я получаю «Не удается выполнить INSERT INTO для многозначного поля ".

Я знаю, что MVF не рекомендуется использовать, но это БД SharePoint, и моя роль - только получить данные из db в Excel.

Update

Я пытался использовать драйвер 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

Вы пытались использовать драйвер ODBC Access вместо драйвера OLEDB, чтобы убедиться, что это работает лучше? –

+0

Это может помочь. Я проверю это завтра. – Krukosz

ответ

0

Я решил эту проблему. Вот что я сделал. Код может иметь синтаксические ошибки. Я размещаю здесь код, написанный из моей памяти - это не копия моего рабочего кода.

Главное и самое главное - это тип соединения. После восстановления я обнаружил, что Microsoft рекомендует использовать ADO-соединение. Как я уже писал ранее, DAO требует дополнительного цикла через набор записей, и это может быть проблемой, и использование DAO со строкой Connection не выглядит лучше, чем ADO.

Лучший и единственный способ получить данные из MVFS является DAO, но соединение должно быть получено «OpenDatabase» метод - в этом случае нет никаких проблем с MVFS с большим числом значений.

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