Добрый всем день! Решил немного просветиться относительно SQL. Благодаря некоторым ресурсам смог навоять небольшой макрос по чтению и записи данных в созданную мною таблицу в базе: [vba]
Код
Sub TST_Connection() Dim ADOcn As Variant Set ADOcn = CreateObject("ADODB.Connection") ADOcn.ConnectionString = "Provider=SQLOLEDB;Data Source=T-QCKM5VUY3TRFV;Initial Catalog=TestBase;Integrated Security=SSPI"
On Error GoTo CnErrorHandler ADOcn.Open SetDataDB (ADOcn) GetDataDB (ADOcn) ADOcn.Close Set ADOcn = Nothing Exit Sub CnErrorHandler:
For Each ADOErr In ADOcn.Errors Debug.Print ADOErr.Number Debug.Print ADOErr.Description Next End Sub
Sub GetDataDB(ADOcn As Variant) 'Set rss = New Recordset Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
MsgBox (rs.GetString) End Sub Sub SetDataDB(ADOcn As Variant) Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
[/vba] Но я вижу, что подключаясь, я заранее должен знать имя таблицы. Возможно ли забрать данные из базы из всех таблиц конкретной базы и закинуть их каждую (таблицу) на отдельный лист книги эксель, не зная наименований этих таблиц?
Добрый всем день! Решил немного просветиться относительно SQL. Благодаря некоторым ресурсам смог навоять небольшой макрос по чтению и записи данных в созданную мною таблицу в базе: [vba]
Код
Sub TST_Connection() Dim ADOcn As Variant Set ADOcn = CreateObject("ADODB.Connection") ADOcn.ConnectionString = "Provider=SQLOLEDB;Data Source=T-QCKM5VUY3TRFV;Initial Catalog=TestBase;Integrated Security=SSPI"
On Error GoTo CnErrorHandler ADOcn.Open SetDataDB (ADOcn) GetDataDB (ADOcn) ADOcn.Close Set ADOcn = Nothing Exit Sub CnErrorHandler:
For Each ADOErr In ADOcn.Errors Debug.Print ADOErr.Number Debug.Print ADOErr.Description Next End Sub
Sub GetDataDB(ADOcn As Variant) 'Set rss = New Recordset Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
MsgBox (rs.GetString) End Sub Sub SetDataDB(ADOcn As Variant) Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
[/vba] Но я вижу, что подключаясь, я заранее должен знать имя таблицы. Возможно ли забрать данные из базы из всех таблиц конкретной базы и закинуть их каждую (таблицу) на отдельный лист книги эксель, не зная наименований этих таблиц?Roman777
добрый день, подключался к .mdb определял таблицы так
[vba]
Код
For Each tek In Dbase.TableDefs If tek.RecordCount > 0 And tek.Attributes = 0 Then ' кроме пустых и системных Workbooks(Texcel).Sheets(1).Cells(3, t).Value = tek.Name t = t + 1 End If Next tek
[/vba]
добрый день, подключался к .mdb определял таблицы так
[vba]
Код
For Each tek In Dbase.TableDefs If tek.RecordCount > 0 And tek.Attributes = 0 Then ' кроме пустых и системных Workbooks(Texcel).Sheets(1).Cells(3, t).Value = tek.Name t = t + 1 End If Next tek
Sub TST_Connection2() Dim ADOcn As Variant Set ADOcn = CreateObject("ADODB.Connection") Dim s() As String, i&
ADOcn.ConnectionString = "Provider=SQLOLEDB;Data Source=T-QCKM5VUY3TRFV;Integrated Security=SSPI;Initial Catalog=TestBase" On Error GoTo CnErrorHandler ADOcn.Open s = GetAllTableNames(ADOcn) For i = 0 To UBound(s) Call GetDataDBFromTabl(ADOcn, i, s(i)) Next i ADOcn.Close Set ADOcn = Nothing Exit Sub CnErrorHandler:
For Each ADOErr In ADOcn.Errors Debug.Print ADOErr.Number Debug.Print ADOErr.Description Next End Sub
Sub GetDataDBFromTabl(ADOcn As Variant, index As Long, sNameTabl As String) Dim ss As String 'Set rss = New Recordset Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
SQL = "SELECT * From " & sNameTabl rs.Open SQL, ADOcn, 1, 1 If rs.PageCount > 0 Then ss = rs.GetString Worksheets(index + 5).Cells(1, 1) = ss End If End Sub
Function GetAllTableNames(ADOcn As Variant) As Variant Dim SQL As String Dim s As String Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic SQL = "SELECT TABLE_NAME AS [Table names] FROM INFORMATION_SCHEMA.TABLES WHERE table_type='BASE TABLE'" rs.Open SQL, ADOcn, 1, 1 s = rs.GetString s = Left(s, Len(s) - 1) GetAllTableNames = Split(s, Chr(13)) End Function
[/vba] Осталось данные к нормальному виду привести. Не пойму как вместо получения таблицы в виде строки после rs.GetString получить массив сразу, который можно было бы записать сразу в экселевскую таблицу (понятно, что строку можно обработать split-ом, но кажется, что это неверно).
ps, возможно ссылочка bmv98rus поможет...гляну, спс).
Благодарю отозвавшихся. Сделал так:
[vba]
Код
Sub TST_Connection2() Dim ADOcn As Variant Set ADOcn = CreateObject("ADODB.Connection") Dim s() As String, i&
ADOcn.ConnectionString = "Provider=SQLOLEDB;Data Source=T-QCKM5VUY3TRFV;Integrated Security=SSPI;Initial Catalog=TestBase" On Error GoTo CnErrorHandler ADOcn.Open s = GetAllTableNames(ADOcn) For i = 0 To UBound(s) Call GetDataDBFromTabl(ADOcn, i, s(i)) Next i ADOcn.Close Set ADOcn = Nothing Exit Sub CnErrorHandler:
For Each ADOErr In ADOcn.Errors Debug.Print ADOErr.Number Debug.Print ADOErr.Description Next End Sub
Sub GetDataDBFromTabl(ADOcn As Variant, index As Long, sNameTabl As String) Dim ss As String 'Set rss = New Recordset Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic
SQL = "SELECT * From " & sNameTabl rs.Open SQL, ADOcn, 1, 1 If rs.PageCount > 0 Then ss = rs.GetString Worksheets(index + 5).Cells(1, 1) = ss End If End Sub
Function GetAllTableNames(ADOcn As Variant) As Variant Dim SQL As String Dim s As String Set rs = CreateObject("ADODB.Recordset") 'for changing in recordset rs.CursorType = adOpenStatic rs.LockType = adLockOptimistic SQL = "SELECT TABLE_NAME AS [Table names] FROM INFORMATION_SCHEMA.TABLES WHERE table_type='BASE TABLE'" rs.Open SQL, ADOcn, 1, 1 s = rs.GetString s = Left(s, Len(s) - 1) GetAllTableNames = Split(s, Chr(13)) End Function
[/vba] Осталось данные к нормальному виду привести. Не пойму как вместо получения таблицы в виде строки после rs.GetString получить массив сразу, который можно было бы записать сразу в экселевскую таблицу (понятно, что строку можно обработать split-ом, но кажется, что это неверно).
ps, возможно ссылочка bmv98rus поможет...гляну, спс).Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Среда, 25.09.2019, 18:37
doober, так и на лист выплевывать не стоит, сразу цикл по рекордсету и запросы на отдельные таблицы. То есть вывернуть вложенность процедур на изнанку.
doober, так и на лист выплевывать не стоит, сразу цикл по рекордсету и запросы на отдельные таблицы. То есть вывернуть вложенность процедур на изнанку.bmv98rus
Замечательный Временно просто медведь , процентов на 20.