#sql #excel #vba #ms-access #adodb
#sql #excel #vba #ms-access #adodb
Вопрос:
Я сделал следующие объявления объекта ADODB в коде.
Dim OConn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
Set OConn = New ADODB.Connection
Set rs = New ADODB.Recordset
Я хотел бы использовать следующий код для чтения из таблицы в файле базы данных MS Access и создания набора записей rs.
'Get the table name from the search results.
tableName = ThisWorkbook.Sheets("PLC Module Data").Cells(2, 9).Value
'Set the SQL string.
strSql = "SELECT Code, Points, Type, Description, Rating " amp; _
"FROM " amp; tableName
'Set the connection string and open the connection to the Access DB.
OConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" amp; _
"Data Source=Q:AutoCAD ImprovementsPLC IO Utility DocsPLC IO Spreadsheet
AppPLC IO Appace_plc.mdb"
OConn.Open
'Open the recordset and error out if nothing is returned
Set rs = OConn.Execute(strSql)
If rs.EOF Then
MsgBox "No matching records found."
rs.Close
OConn.Close
Exit Sub
End If
Я проверил инструкцию запроса в самом файле Access, и она работает нормально. Я всегда получаю ошибку
Ошибка времени выполнения’-2147217900 (80040e14)’: Ошибка автоматизации
в строке,
Set rs = OConn.Execute(strSql)
Если бы кто-нибудь мог взглянуть на мой код и определить, почему это происходит, это было бы очень ценно. Я просмотрел похожие примеры онлайн, и кажется, что это должно быть правильно.
Комментарии:
1. Вы проверили, что
tableName = ThisWorkbook.Sheets("PLC Module Data").Cells(2, 9).Value
это правильное имя таблицы? Что это возвращает?2. Что решает SQL? Кроме того, вы пробовали,
rs.open strSQL,oconn.connection
3. На всякий случай я бы поместил имена полей в []:
"SELECT [Code], [Points], [Type], [Description], [Rating] "
4. Попробуйте это для вашей строки SQL:
strSql = "SELECT a.Code, a.Points, a.Type, a.Description, a.Rating FROM [" amp; tableName amp; "] AS a"
Затем добавьтеDebug.Print strSql
в следующей строке. Если вы все еще получаете ошибку, используя эту версию, пожалуйста, покажите нам, чтоDebug.Print
вам показывает.5. проверьте, действительно ли oConn открыт, используя, если Oconn.state <> adstateopen, то msgbox «Не открыт»
Ответ №1:
Я добавил скобки вокруг строки tableName, и теперь это работает. Спасибо за все отзывы.
'Set the SQL string.
strSql = "SELECT Code, Points, Type, Description, Rating " amp; _
"FROM [" amp; tableName amp; "]"