Vba excel ado примеры

Skip to content

ADO in Excel VBA – Connecting to database using SQL

Home » Excel VBA » ADO in Excel VBA – Connecting to database using SQL

  • adodb.connection vba

ADO Excel VBA – SQL Connecting to Database Example Macros helps to connect the different data sources from Excel VBA. Select, Delete,Update Records set.

In this Section:

  • What is ADO?
  • What is Database?
  • What is SQL?
  • adodb.connection VBA Reference
  • Practical Learning: Using ADO and SQL with VBA
  • Example File

What is ADO?

ADO Stands for ActiveX Data Objects, is Microsoft’s Client-Server technology to access the data between Client and Server.  ADO can’t access the data source directly, it will take help of OLE DB Provider to communicate with the data source.  Most of the times OLE DB providers are specific to a particular Data Source Type. However, we have an OLE DB provider for ODBC, it is a general purpose provider with help of this ADO can access any Data source which can understand ODBC.
ADO in Excel VBA - Connecting to a database using SQL -example-1

What is Database?

Database (DB) is a collection of information organized in such a way that a computer program can easily understand and read the data. And the Database Management System (DBMS) are designed to understand and interact with other computer applications to perform the different operations on the data. MySQL, Microsoft SQL Server, Microsoft Access, Oracle, and IBM DB2 are some of the well know DBMS.

Generally the information stored in the data in the form of tables, and a table is designed with set of records (rows) and fields (columns).

You can use Microsoft Excel to store some data, where an Excel workbook will act as a data source, worksheet will be a table and the rows and the columns of the worksheet will be records and the fields of the table.

What is SQL?

SQL Stands for Structured Query Language, ADO use SQL commands to communicate with the databases. Following are the most commonly used SQL commands to deal with the databases:

SELECT command used to retrieve the data from a data source
INSERT command used to insert the records to a data source
UPDATE command used to modify the existing records of the data source
DELETE command used to delete the records from a data source

adodb.connection VBA Reference

adodb.connection VBA Reference helps as to refer ADO in Excel VBA. We can use ADO in Excel VBA to connect the data base and perform data manipulating operations. We need add ‘Microsoft Activex Data Objects Library’ from References to reference the ADO in VBA. Here is the adodb.connection VBA Reference screen-shot.

adodb.connection VBA Reference

ADO in Excel VBA – Practical Learning: Using ADO and SQL with VBA

To retrieve the data from any data source into Excel using ADO:
1. We have to Open the connection to the Data Source
2. We need to run the required SQL command
3. We have to copy the resulted record set into our worksheet
4. We have to close the record set and connection

We will  consider the Excel workbook as data source and we will connect to the worksheet (table) to retrieve the data. In this example we will get the data from Sheet1 to Sheet2 using ADO.

Assuming you have an excel workbook with the following data in Sheet1, as shown below.

EmpID EmpName EmpSalary

1

Jo

22000

2

Kelly

28000

3

Ravi

30000

ADO in Excel VBA - Connecting to a database using SQL -example-2

Step 1:Add reference for Microsoft Activex Data Objects Library

ADO in Excel VBA - Connecting to a database using SQL -example-3
1. Go to VBE (Alt+F11) and Select References.. from Tools Menu.
2. Then select ” Microsoft Activex Data Objects Library” from the list.
3. And Create sub procedure to write the code:

Sub sbADOExample()
'We will write the code here 
End Sub
Step 2: Create the Connection String with Provider and Data Source options
Dim sSQLQry As String
Dim ReturnArray

Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset

Dim DBPath As String, sconnect As String


DBPath = ThisWorkbook.FullName 'Refering the sameworkbook as Data Source

'You can provide the full path of your external file as shown below
'DBPath ="C:InputData.xlsx"

sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"
'If any issue with MSDASQL Provider, Try the Microsoft.Jet.OLEDB:
'sconnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Step 3: Open the Connection to data source
Conn.Open sconnect
Step 4: Create SQL Command String
      sSQLSting = "SELECT * From [Sheet1$]" ' Your SQL Statement (Table Name= Sheet Name=[Sheet1$]) 
Step 5: Get the records by Opening this Query with in the Connected data source
       mrs.Open sSQLSting, Conn
Step 6: Copy the reords into our worksheet
        Sheet2.Range("A2").CopyFromRecordset mrs
Step 7: Close the Record Set and Connection
           'Close Recordset
            mrs.Close

          'Close Connection
           Conn.Close
So, the final program should look like this:
Sub sbADOExample()
Dim sSQLQry As String
Dim ReturnArray

Dim Conn As New ADODB.Connection
Dim mrs As New ADODB.Recordset

Dim DBPath As String, sconnect As String



DBPath = ThisWorkbook.FullName

'You can provide the full path of your external file as shown below
'DBPath ="C:InputData.xlsx"

sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"

'If any issue with MSDASQL Provider, Try the Microsoft.Jet.OLEDB:
'sconnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBPath _
    & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Conn.Open sconnect
    
    sSQLSting = "SELECT * From [Sheet1$]" ' Your SQL Statement (Table Name= Sheet Name=[Sheet1$])
    
    mrs.Open sSQLSting, Conn
        '=>Load the Data into an array
        'ReturnArray = mrs.GetRows
                ''OR''
        '=>Paste the data into a sheet
        Sheet2.Range("A2").CopyFromRecordset mrs
    'Close Recordset
    mrs.Close

'Close Connection
Conn.Close

End Sub

Example File

You can download the example files here and explore it. Getting Data Using ADO (Using MSDASQL Provider)

Getting Data Using ADO (Using MSDASQL Provider)

Download the Example File: ANALYSIS TABS – Getting Data Using ADO (Using Microsoft.Jet.OLEDB Provider)

Getting Data Using ADO (Using Microsoft.Jet.OLEDB Provider)

Effortlessly Manage Your Projects and Resources
120+ Professional Project Management Templates!

A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.

Save Up to 85% LIMITED TIME OFFER
Excel VBA Project Management Templates
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates

Excel Pack
50+ Excel PM Templates

PowerPoint Pack
50+ Excel PM Templates

MS Word Pack
25+ Word PM Templates

Ultimate Project Management Template

Ultimate Resource Management Template

Project Portfolio Management Templates

Related Posts

    • What is ADO?
    • What is Database?
    • What is SQL?
    • adodb.connection VBA Reference
    • ADO in Excel VBA – Practical Learning: Using ADO and SQL with VBA
    • Example File

VBA Reference

Effortlessly
Manage Your Projects

120+ Project Management Templates

Seamlessly manage your projects with our powerful & multi-purpose templates for project management.

120+ PM Templates Includes:

134 Comments

  1. Vandana
    August 7, 2013 at 4:49 PM — Reply
  2. lisa Pereira
    February 12, 2014 at 7:33 AM — Reply

    HI,
    Nice one.. I am trying to pull multiple values from one parameter in excel, for example. I need to pull the parameter from Range(“a2”) separated by commas,
    how can I do this?

  3. PNRao
    February 25, 2014 at 11:58 PM — Reply

    Hi Lisa,

    Assuming you have data at A1 as “1st,2nd,3rd,4th” and you want to separate it.

    You can use Split function to separate the values. Please see the following code.

    fullText=Range(“A1″).Value ‘i.e; fullText=”1,2,3,4″
    arraySplitValues=Split(fullText,”,”)

    Now your array contains the comma delimited values:
    arraySplitValues(0) contains 1st
    arraySplitValues(1) contains 2nd
    arraySplitValues(2) contains 3rd
    arraySplitValues(3) contains 4th

    You can print the values at any Range like:
    Range(“B1”)=arraySplitValues(3)

    or you can loop the entire array to print all values:

    For iCntr=0 to ubound(arraySplitValues,1)
    Cells(iCntr+1,2)=arraySplitValues(iCntr) ‘ this will print all the values in the B Column
    Next

    Please explain your question in more detailed,so that I can help you in better way.

    Thanks-PNRao!

  4. Hi – great article! 2 questions:
    1. Do you have to install the ActiveX Object library 2.8 on every machine that uses this Excel file? I ask because I need to set up multiple files for multiple users who could benefit from this functinality (ADODB + SQL queries vs. Linked spreadsheets).
    2. Do you know how to create an auto-install program for these MS library features? I ask because I don’t prefer to guide every user through the installation procedure.

    Thanks again!
    Stephen

  5. PNRao
    March 24, 2014 at 11:13 PM — Reply

    Hi Stephen,
    Thanks for your comments! Please see my answers below:
    1.You do not required to install ActiveX Object library in every machine, by default it is installed when user have installed in MS Office.
    2.I think the above information answers this question too…

    To help you in understanding clearly: ActiveX Object Library is .DLL file which is installed with your office installation. You need to this reference this in your code, to use the ADO functionality in Excel VBA.

    When you successfully write any code using ADO by referring ActiveX Object Library in your workbook. You can send the file to any one, it should work automatically in any system.

    Hope this helps.
    Thanks-PNRao!

  6. Lisa Pereira
    June 18, 2014 at 5:00 AM — Reply

    Hi PN,
    You are awesome , i love this site.have used your ideas and has helped me a lot. love it..
    What i needed to know was that having pulled the record set into sheet :-
    1) I want to use the values listed in rows in column A
    2) transpose them into a cell and use these values to pull another query record-set with the IN statement.
    is there a way to do this in one connection only or open another connection.?
    let me know if this is possible.
    Regards..
    lisa

  7. PNRao
    June 19, 2014 at 12:11 AM — Reply

    Hi Lisa,
    How are you doing! Thanks for your feedback!
    Yes, this can be done. Here is an example case:
    To explain this, I have entered some data in ADO sheet of the example file (available at end of the article)
    Step1: Entered 1 at Range A2, 2 at Range A3
    The I concatenate these values at C1 using the below formul
    -> =A2&”,”&A3
    i.e; Now you can see ‘1,2’ at C1, I want to pass this in my SQL IN Operator, So – I changed the SQL Query string as follows:

    Step2: sSQLSting = “SELECT * From [DataSheet$] where Quarter IN (” & Range(“C1”) & “);”
    i.e; it will form the query as ‘SELECT * From [DataSheet$] where Quarter IN (1,2);’

    Step3: Now executed and got the required values in the ADO sheet.

    Hope this helps!
    Thanks-PNRao!

  8. Jon McNeil
    July 1, 2014 at 9:58 PM — Reply

    Thanks PN,

    This is working nicely. The only thing that I cannot appear to fix is that when one user has the source file open (from which the data comes from) the other user, who is using the destination file (where the data is pulled to), opens a read-only source file when they run the macro. Is there a way round this?
    The source file is only supposed to be viewed by one person whereas the destination file is for multiple users

    Thanks in advance,

    Jon

  9. Shubhangi
    July 1, 2014 at 11:24 PM — Reply

    I used this code to connect to MS Access 2007 database but am getting a runtime error and an application error when I try to open the same. I used DSN as MS Access Database and Provider as Microsoft.ACE.OLEDB.12.0.
    Please help.

  10. PNRao
    July 2, 2014 at 3:35 PM — Reply
  11. Noz
    July 3, 2014 at 3:24 PM — Reply

    This is very well explained, if this had been available when I was first learning it would have save me loads of time. Do you have something similar on how to insert into SQL tables from excel?

  12. PNRao
    July 4, 2014 at 12:48 AM — Reply

    Hi Noz, Thanks for your comments!

    Yes, you can write insert query, you can download the example file and change the query string as follows:
    sSQLSting = “INSERT INTO [DataSheet$](Quarter, Sales) Values(2,5000)”

    and comment the below line, as insert query will not return any values.
    ‘ActiveSheet.Range(“A2”).CopyFromRecordset mrs

    Now your ADO procedure should look like this:

    Sub sbADO()
    Dim sSQLQry As String
    Dim ReturnArray

    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset

    Dim DBPath As String, sconnect As String

    DBPath = ThisWorkbook.FullName

    'You can provide the full path of your external file as shown below
    'DBPath ="C:InputData.xlsx"

    sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"

    Conn.Open sconnect
    'sSQLSting = "SELECT * From [DataSheet$]" ' Your SQL Statemnt (Table Name= Sheet Name=[DataSheet$])
    sSQLSting = "INSERT INTO [DataSheet$](Quarter, Sales) Values(2,5000)"
    mrs.Open sSQLSting, Conn
    '=>Load the Data into an array
    'ReturnArray = mrs.GetRows
    ''OR''
    '=>Paste the data into a sheet
    'ActiveSheet.Range("A2").CopyFromRecordset mrs
    'Close Recordset
    mrs.Close

    'Close Connection
    Conn.Close

    End Sub

  13. Jaishree Ramani
    July 10, 2014 at 8:08 PM — Reply

    hello, this really helps when you have a simple query.. would you be kind enough to provide an example for a parameter query (multiple) i.e for dates say selct* from table data between fromDate and toDate?

  14. PNRao
    July 11, 2014 at 1:29 AM — Reply

    Hi,
    Sure, you change the query to suits your requirement.
    For example:
    I have changed the query sting from sSQLSting = “SELECT * From [DataSheet$]” to sSQLSting = “SELECT * From [DataSheet$] Where Quarter Between 2 And 4” in the example file. And now it will pull the data if the quarter is between 2 and 4.

    For your requirement, sSQLSting will be something like below:

    sSQLSting = “SELECT * From [DataSheet$] Where YOUR_Date_Varibale Between ‘LowerDate’ And ‘UpperDate’”

    If Dates creates any problems, try to use date values.

    Hope this helps-Thanks-PNRao!

  15. Jaishree Ramani
    July 11, 2014 at 6:57 PM — Reply

    Hi Sir,
    that works but I am having issue with the parameters dates as my query below
    “O.DELIVERY_DATE BETWEEN :”From date” AND :”To Date” ) . how do i setup the parameters in vba to ensure that the record-set only pulls data in ‘DD-MMM-YYYY’ format. right now i have the dates converted to text(“dd-mmm-yyyy”) but when the data is returned its shows up in ‘mm/ddd/yyyy’ .

    note :i have the user to input the dates..

  16. PNRao
    July 12, 2014 at 1:05 PM — Reply

    Hi,
    You can create the query string use as shown below:

    FromDate = 1 / 1 / 2010
    ToDate = 12 / 30 / 2012
    sSQLSting = “SELECT * From [DataSheet$] Where O.DELIVERY_DATE Between ” & FromDate & ” And ” & ToDate

    And your excel, default date format is ‘mm/ddd/yyyy’, you can format the dates using either sql or VBA.

    In VBA it is like this: Format(YourDate,”mm-dd-yyyy”)

    Thanks-PNRao!

  17. Jaishree Ramani
    July 14, 2014 at 8:21 PM — Reply

    Hi Sir,
    my code is
    userInput (“Pls type FromDate”) ,FromDate
    userInput (“Pls type ToDate”) ,ToDate
    FromDate = format(FromDate,”dd-mmm-yyyy”)
    ToDate = format(ToDate,”dd-mmm-yyyy”)

    “select…
    …..”AND O276054.DELIVERY_DATE BETWEEN ” & FromDate & ” And ” & ToDate & _ ”

    i tried that but i keep getting error ‘saying missing expression..’
    what am i doing wrong??

  18. PNRao
    July 15, 2014 at 10:56 AM — Reply

    Hi,
    I could not find any issue in the code. As per the Error message, something wrong with the query string. Could you please provide me the complete query string.

    Or you can try this: You can use Debug.Print YourstrQery, now look into the Immediate Window to see the resulted query.

    You can send me the file with some dummy data to our email id: info@analysistabs.com

    Thanks-PNRao!

  19. Nigel
    July 18, 2014 at 7:29 PM — Reply

    Hello, very good site .. quick question do you have an example for record-sets and Pivot tables or cross-tabs.?
    i have an issue which I am trying to merge two query’s into one record-set and Pivot them into a cross report?
    something similar to what Discoverer does. but I am trying to combine aggregate data points with Detail data points into one sheet without errors..(that’s why the two query s)

    please direct in a right direction if this is doable???

  20. PNRao
    July 20, 2014 at 12:31 AM — Reply

    Hi Nigel,

    Please look into the example below:


    'Add reference for Microsoft Activex Data Objects Library

    Sub sbADO()
    Dim sSQLQry As String
    Dim ReturnArray

    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset

    Dim DBPath As String, sconnect As String

    DBPath = ThisWorkbook.FullName

    'You can provide the full path of your external file as shown below
    'DBPath ="C:InputData.xlsx"

    sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';"

    Conn.Open sconnect
    sSQLSting = "SELECT * From [DataSheet$]"

    '***********> You can change this query as per your requirement (Join / Union)

    mrs.Open sSQLSting, Conn

    'Set record set as a pivot table data source
    Set objPivotCache = ActiveWorkbook.PivotCaches.Add( _
    SourceType:=xlExternal)
    Set objPivotCache.Recordset = mrs
    With objPivotCache
    .CreatePivotTable TableDestination:=Range("G20"), _
    TableName:="MyPivotTable1"
    End With

    'Close Recordset
    mrs.Close

    'Close Connection
    Conn.Close

    End Sub

    Hope this helps! Thanks-PNRao!

  21. Gavrav
    July 24, 2014 at 1:59 PM — Reply

    Hi,
    I would like to automate my daily process by using VBA and macro actually my doubt is there any solution for instead of copying and pasting the query statement to SSMS 2005 which is stored in excel.So by making that statements as link or by clicking some command buttons to pass that query to SSMS and thus the statement should be executed automatically by using ODBC conn or OLEDB data sources. Is it Possible ???

  22. PNRao
    July 24, 2014 at 2:53 PM — Reply

    Hi Gavrav,

    Yes – we can do this. You can simply record a macro and fetch the data using tools in Data menu tab.

    Thanks-PNRao!

  23. Ricky Dobriyal
    July 26, 2014 at 9:39 PM — Reply

    Hi All,
    I am very glad that I visited this website and would like thank you for giving such valuable info.
    I have one question in VBA while using ADO and database as excel how we can use where condition and other query on excel sheet like below example of this website.

    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    Conn.Open sconnect
    sSQLSting = “SELECT * From [DataSheet$] WHERE ” ‘ Your SQL Statemnt (Table Name= Sheet Name=[DataSheet$])

    mrs.Open sSQLSting, Conn
    ‘=>Load the Data into an array
    ‘ReturnArray = mrs.GetRows
    ”OR”
    ‘=>Paste the data into a sheet
    ActiveSheet.Range(“A2”).CopyFromRecordset mrs
    ‘Close Recordset
    mrs.Close

    Here is only select condition used. Please help me how we can use different SQL condition.

    Another question how we can connect to MYsql database using VBA?

    Please help me in the above questions and thanks a ton in advannce.

    Regards,
    Ricky

  24. PNRao
    July 26, 2014 at 9:49 PM — Reply

    Hi Ricky,

    Thanks for your comments.

    Please check the codes provided in the comments section, I have given the example queries which you have mentioned.

    And regarding MySQL, you can use the following connection string:
    sconnect = “DRIVER={MySQL ODBC 5.1 Driver};” & _ “SERVER=[Server];” & _ “DATABASE=[Database];” & _ “USER=[UserName];” & _ “PASSWORD=[Password];” & _ “Option=3”

    And replace [Server], [Database], [UserName] and [Password] with the respective original server name, database, User and Password.

    If your system is not insstalled MySQL, then you have to download and install MYSQL ODBC Driver: http://dev.mysql.com/downloads/connector/odbc/5.1.html

    Hope this helps!
    Thanks-PNRao!

  25. Nigel
    July 29, 2014 at 8:32 PM — Reply

    Hi Pn,
    Thanks your previous example works perfectly. would you be able to help with multiple record sets. I need to add the second query record-set in between the data of the first record set after exporting to sheet.

  26. Nigel
    July 30, 2014 at 5:30 AM — Reply

    Hi PN, sorry hope if didn’t confuse you with my inquiry.. I will provide an example
    I need to combine two record sets as I cannot put them in one query due to the data constraints.
    query1= “select Total_DLV , AVAIL_DLV between date1 and date2 from Table1″ into Sheet1
    query2=”select Sch_DLV , between date1 and date2 from Table2” into Sheet1
    combine data from the two querys into sheet1 like
    DLV_date—>aug1, Aug 2 ,aug3 (horizontal)
    Total_DLV , ..
    AVAIL_DLV
    Sch_DLV
    please let me know if this is possible..

  27. Amir
    August 1, 2014 at 4:08 PM — Reply

    Hi
    Nice explanation!
    Question: how can i get the data from different ‘sourcerange’ from within one sheet i.e multiple columns?

    code:
    SourceRange = “C1:C6500 ,D1:D6500 ,AB1:AB6500,AG1:AG6500”
    szSQL = “SELECT * FROM [” & SourceSheet$ & “$” & SourceRange$ & “];”

  28. Nigel
    August 7, 2014 at 12:00 AM — Reply

    Hi PN ,
    i fixed the issue.,, this was more to do with my query itself. i managed to fix this within the first query itself. no need for multiple queries.
    however please provide an example for multiple record-sets if possible..

  29. Ricky Dobriyal
    August 17, 2014 at 12:54 AM — Reply

    Hello Team,

    I have a sheet with thousand records and I want filter recordes based on Activsheet name

    Query is working fine when I am putting directly the value in condition like below

    sSQLSting = “SELECT * From [Data$] where Country =’India’; ”

    But I want to filter it based on Acrive sheet name.

    I tried two methods but it is prompting same Run time error.

    s = ActiveSheet.Name

    sSQLSting = “SELECT * From [Data$] where Country =s ”
    sSQLSting = “SELECT * From [Data$] where Country =Activeshet.name ”
    sSQLSting = “SELECT * From [Data$] where Country =’Activeshet.name’ ”

    Please cound you advise me how I can do this..

  30. PNRao
    August 17, 2014 at 11:15 AM — Reply

    Hi Amir,
    You can mention the column names, instead of specifying multiple ranges, for example:
    szSQL = “SELECT Column1, Column2 FROM [Sheet1$]”

    Thanks-PNRao!

  31. PNRao
    August 17, 2014 at 11:44 AM — Reply

    Hi Ricky,
    Please change your code like this:

    s = ActiveSheet.Name
    sSQLSting = “SELECT * From [Data$] where Country = ‘” & s & “‘”

    Thanks-PNRao!

  32. Graig
    September 1, 2014 at 4:10 AM — Reply

    I see you share interesting content here, you can earn some additional
    cash, your blog has huge potential, for the
    monetizing method, just search in google – K2 advices
    how to monetize a website

  33. Yogesh
    September 10, 2014 at 10:55 PM — Reply

    is there a way to send parameters(through InputBox/MsgBox) using Select statement and extracting user specific data into excel using ADO.
    Thanks for all your help and support.
    Yogesh

  34. Mandeep
    September 11, 2014 at 9:56 AM — Reply

    Dear Pn rao,

    Please let me know if you are pulling data from excel , is this code using sql while retrieving data ? because this is not connecting to server. waiting for your response. thanks in advance.
    MAndeep

  35. Mandeep
    September 11, 2014 at 9:59 AM — Reply

    Explain me this line of code please ” sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

  36. PNRao
    September 11, 2014 at 8:19 PM — Reply

    Hi Mandeep,
    We need to create a connection string to connect any data base using VBA.
    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    Provider=MSDASQL.1 : This is OLEDB Provider, this helps excel to understand the data base query syntax.
    DSN=Excel Files : Data Source Name, Excel Files is data source in the given example.
    DBQ= &DBPath : Data base file path, this is the full path of Excel File to connect.
    HDR=Yes’: Headers, Yes – if the first line of your data (in sheet or range) having headers, other wise No.

    Hope this helps!
    Thanks-PNRao!

  37. PNRao
    September 11, 2014 at 8:22 PM — Reply

    Hi Mandeep,
    Yes, we are pulling the data from Excel using ADO. You need to change the connection string if you are connecting any other DB.

    Thanks-PNRao!

  38. PNRao
    September 11, 2014 at 8:28 PM — Reply

    Hi Yogesh,
    Yes, you can use Inputbox to enter some parameters and change the query accordingly.
    Example:
    x = InputBox(“Please enter field to select”, “Please Enter”)
    ‘You cna change the below query
    ‘sSQLSting = “SELECT * From [Sheet1$]
    ‘As shown below:
    sSQLSting = “SELECT ” & x & ” From [Sheet1$]”
    ‘Your remaing code here, similarly you can keep a WHERE Condition—

    Thanks-PNRao!

  39. Navneet Rao Ingle
    September 15, 2014 at 2:35 PM — Reply

    Hi PN,
    I am trying to copy the data from one workbook to another. Everything goes fine till the fetching of data from the source workbook but when I tried to paste the data in the destination workbook I am getting the following error:

    Run-time error ‘-2147467259 (80004005)’:

    You cannont move a part of a PivotTable report, or insert worksheet
    cells, rows, or columns inside a PivotTable report. To insert worksheet
    cells, rows, or columns, first move the PivotTable report (with the
    PivotTable report selected, on the Options tab, in the Actions group,
    click Move PivotTable). To add, move, or remove cells within the
    report, do one of the following:

    Code used is:

    Dim DNameRecvd
    Dim query As String
    Dim ReturnArray

    DNameRecvd = DName

    Dim conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset

    Dim DBPath As String, sconnect As String
    DBPath = ThisWorkbook.FullName

    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    conn.Open sconnect
    query = “SELECT * from [Data$]”
    mrs.Open query, conn

    Workbooks(“DestinationFile”).Activate
    Sheets(“Sheet4”).Activate

    Sheet4.Range(“A2”).CopyFromRecordset mrs ‘—-Receiving error message at this line

    mrs.Close
    ActiveWorkbook.Save
    MsgBox (“Done”)

    Please help. Thanks in Advance.

  40. gayathiri
    September 22, 2014 at 3:47 PM — Reply

    Dear Pn Rao
    i have to go through entire spreadsheet/workbook to find current status of articles by adding received date to 20 and if it matches today’s date. change the color of that row. can i do it without ADO connection

  41. PNRao
    September 22, 2014 at 7:56 PM — Reply

    Hi Gayathri,
    Yes, we can open the workbook and do whatever we want without using VBA. Your code will be some thing like this:
    You can open the required file:
    set Wb=Workbooks.Open(“C:tempworkbook.xlsx”)
    Assuming you have recieved date in Column A
    iCntr=1
    Do while Wb.Sheets(“SheetName”).Cells(iCntr,1)<>”
    If Format(Wb.Sheets(“SheetName”).Cells(iCntr,1),”DD-MM-YYYY”)=Format(Now(),”DD-MM-YYYY”) then
    ‘Here you can change the cell/range color
    End If
    Loop

    Hope this helps!
    Thanks-PNRao!

  42. gayathiri
    September 23, 2014 at 11:14 AM — Reply

    thanks a lot.. :)but where to put this code. either by keeping a button or create a macro module for this workbook. My requirement is Say if the article is received on september 10 i have to get that row say in green color on september 30

  43. gayathiri
    September 24, 2014 at 1:37 PM — Reply

    Mr.Rao thanks for your timely help:) :) Customized ur code and it works well..

  44. PNRao
    September 26, 2014 at 9:31 PM — Reply

    You are most welcome!
    Thanks-PNRao!

  45. Est228
    October 10, 2014 at 9:45 PM — Reply

    Dear PnRao
    I am using this code to connect to MS Access 2013 and used your previous comment to Shubhangi to structure the code. Everything seems to be working fine until I get to this part of the code:
    sSQLSting = “SELECT * FROM [BD_X]” where BD_X is the name of my Access table
    Here I keep getting an Error. I all ready have the required OLEDB and also tried using this code instead:
    sSQLSting = “SELECT * FROM [BD_X$]”
    I would appreciate some help.

  46. PNRao
    October 12, 2014 at 10:06 AM — Reply

    Hi,
    You can use the table name directly: sSQLSting = “SELECT * FROM BD_X”.

    If you want to refer Excel sheet as table then it will be like [BD_X$], if you connect any data base like MS Access, MS SQL Server, Oracle or Teradata you can use the table name.

    Hope this helps!
    Thanks-PNRao!

  47. Philip
    October 26, 2014 at 8:48 PM — Reply

    Greetings PNRao,

    I am in between developing a small project for the place I work at.
    Currently I am helping out the call center gang with automating their reports.
    There is a huge report that they spool off a web site at the end of each month…
    They obtain it in the form of an excel file with 97 format, which means each sheet is limited to 65535 rows only.
    So therefore the report spans to 4 sheets and could be more…
    I have completely automated this report into various pivot format for them per their requirement using Excel VBA.
    However the code is slow to about 10 seconds.
    There are many data analysis involved like filtering out the blanks off 2 columns, unwanted rows from another and pivoting them to obtain 4 reports using different criteria each.
    I am talking about 260000+ records analyzed to about 72000+ actual meaningful data for the report.

    Now, I thought maybe ADO could work out the trick more efficiently and faster.
    I have worked with ADO before in access/excel and know how to on the basics of connection etc.

    Currently, I need to know 2 things at this point:

    1) Is the ADO method faster than using excel automation via variant and/or range methods combined with loops?
    2) How do I append data from 4 sheets into 1 recordset to later analyze it with various select statements? Do I have to use an append query to obtain data from each sheets? If so, let me know how the query would look.

    Note: What I am thinking of doing is to completely do the required data manipulations within ADODB recordset and insert the manipulated data into a new sheet in Excel 8 format. Also, to run queries and to obtain the reports required from these manipulated data and again insert sheets into excel form query object.

    Could you kindly guide me into the various steps I need to be looking at to achieve these goals.

    Thanks in advance,
    Philip

  48. Suruchi
    October 27, 2014 at 10:47 PM — Reply

    Hi PN ,

    This is really helpful .
    One thing that is not working at my end is changing HDR=No’; … this code is not giving me the header which is required.
    I tried with for loop which is working in that case , just wanted to know if how would HDR would work.

    Thank you

  49. Suruchi
    October 28, 2014 at 11:55 AM — Reply

    Hi PN,

    This code is working fine , but I am not able to get the header eve after making HDR =No .
    Could you please help me on this .

    Thanks ,
    Suruchi

  50. PNRao
    October 29, 2014 at 10:34 PM — Reply

    Hi Philip,
    PivotTable is better than ADO, if your customers use Excel 2010 or higher. And to combine the Data into one record set, you query all data into one record set using UNIONs.

    Hope this helps.
    Thanks-PNRao!

  51. PNRao
    October 29, 2014 at 10:38 PM — Reply

    Hi Suruchi,
    The usage of HDR is to tell the ADO whether your data has headers or not.
    HDR= Yes means: You have the data and the first row is having headers and data starts from the next row.
    HDR= No means: Your data has no header row and and data the data starts from the first row.

    Hope this clarifies your query.
    Thanks-PNRao!

  52. Mani
    November 6, 2014 at 2:29 PM — Reply

    Hi PNRao,

    This is a great & Nice Information!
    Would you be kind enough to answer the following question too,

    Question: how can i get the data from Oracle Database, currently I use SQL Developer to query and store the result in excel and process it later, but since the number of individual sqls increased i’m looking for something like this and if you can help me in this regard, it would be great.

    Thanks in advance
    Mani

  53. Amjed
    November 14, 2014 at 4:34 PM — Reply

    Hi,
    i would like to connect to PL/SQL developer from MS Excel and fetch the records from it and copy to the excel sheet. The query i want to execute is ‘SELECT * FROM TABLE_NAME’. Please let me know the connection string to use.
    Thanks in Advance.

  54. Satyarth Rao
    November 19, 2014 at 11:54 PM — Reply

    Hi PN,
    I am trying to pull data from SQL Server 2012 using excel VBA Code but it is showing that SQL Sever is not exit or access is denied. Please let me know how to do so. It will be a great help.
    Thanks in Advance.

  55. Scott
    November 28, 2014 at 4:08 AM — Reply

    Is it possible to join 2 tables from separate databases in an SQL query within Excel VBA?
    I am currently extracting data from a table in a Firebird database but need to access data from records form a table in another Firebird database. The results of the query are used as input to a case statement that totals and dumps data into a worksheet.
    I can do this in Access since I link to the tables as required, can I have 2 connections open at once in Excel?

  56. Prasad Sakpal
    December 2, 2014 at 12:40 PM — Reply

    Amazing Website…………..Thank you for giving me proper information.

  57. Prasad Sakpal
    December 2, 2014 at 12:44 PM — Reply

    With help of this website, i have entered the insert query & it is properly working but on this “mrs.Open sSQLSting, Conn” statement getting errors ‘Run-Time Error 3704’. Please help on this..I appreciated.

  58. Prasad Sakpal
    December 2, 2014 at 12:45 PM — Reply

    Record is properly inserted into SQL database but getting above error message. please check…

  59. Sub sbADO()
    Dim sSQLQry As String
    Dim ReturnArray
    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset
    Dim DBPath As String, sconnect As String
    sconnect = “Provider=SQLOLEDB.1;Data Source=******;Initial Catalog=******;User ID=*******;Password=*****;”
    Conn.Open sconnect
    sSQLSting = “INSERT INTO [tablename](code, fname,lname,process) Values(‘20202020′,’Prasad’,’Sakpal’,’PC001′)”
    mrs.Open sSQLSting, Conn ‘ Getting error message on this line, but record is properly inserted in to SQL database.
    mrs.Close
    Conn.Close
    End Sub

    Error is = ‘Run-Time Error 3704′
    Application Defined or Object Defined Error

  60. sandeep
    December 5, 2014 at 4:49 PM — Reply

    Hi,
    I have a query. While uploading data to SQL, if i try to download data from SQL using excal vba it is failing and throwing error.Do we have any wayt to handle mulitple calls in SQL using VBA….
    An really confused shud it be done at vba end or SQL end?

  61. This thread has been very helpful in getting going. However, there is one problem. I am using an ODBC driver talking to Google big query but I imagine this problem I have could be relevant to any DBMS connection that has it’s own SQL variant. The key requirement for me is to be able to pass the NATIVE SQL code that the DBMS supports rather than being forced into submitting ANSI SQL which very limiting. I’m using a driver that is meant to supports both.
    The following works as intended:
    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset
    Conn.Open “DSN=bq”
    SQLString = “SELECT count(*) as a from EVENTS.Game_20141205 ”
    mrs.Open SQLString, Conn
    Sheet2.Range(“A2”).CopyFromRecordset mrs
    mrs.Close
    Conn.Close

    But if I try and submit any non-ANSI SQL statement for example:
    SQLString = “select a from (SELECT count(*) as a from EVENTS.Game_20141205) ”
    (and this SQL runs perfectly well if you send it directly to Google bigquery directly from the google webconsole)

    The driver pops an error:
    Run-time error ‘-2147217911 (80040e09)’:
    [Simba][SQLEngine] (31480) syntax error near ‘select a from (SELECT count(*) as a from EVENTS.Game_20141205) <<>>
    which I assume is because it’s not ANSI form SQL. Does anyone know how to submit the native SQL through vba (which should directly be passed through to the DBMS without any checking)

  62. Henning
    December 15, 2014 at 8:06 PM — Reply

    In the file “remedy-export” there are no header and 5 rows of data

    When I run the code, it only assigns data from row 2 to row 5 to the array. What am I doing wrong?

    [code]
    Sub Connect_to_Sheet()
    Dim SQLString As String
    Dim ReturnArray
    Dim Conn As New ADODB.Connection
    Dim rsRecordset As New ADODB.Recordset
    Dim DBPath As String, sConnect As String

    Dim Col_Idx, Row_Idx As Long

    DBPath = ThisWorkbook.Path & “remedy-export.xlsx”
    sConnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=NO’;”
    Conn.Open sConnect

    SQLString = “SELECT * From [Ark2$]”
    rsRecordset.Open SQLString, Conn, adOpenStatic, adLockReadOnly
    Row_Idx = rsRecordset.RecordCount
    ReturnArray = rsRecordset.GetRows
    rsRecordset.Close

    Conn.Close

    End Sub
    [end code]

  63. saibabu
    December 19, 2014 at 12:14 AM — Reply

    Hi All,

    i want to copy only specific cells range.

    KINDLY HELP ME.

  64. kesav
    December 30, 2014 at 1:12 PM — Reply

    hi pn
    i am trying to connect ms access 2010 data base but its showing erroe
    provider not recognized can to help me for over comming from this problem
    thanks
    kesav

  65. baha
    January 6, 2015 at 11:14 PM — Reply

    Ho to delete table in existing access database? by using

  66. PNRao
    January 12, 2015 at 9:25 PM — Reply

    Hi Baha,

    You can delete the table using TRUNCATE or Drop statement if have full permissions.
    To delete only the data: TRUNCATE TABLE table_name;

    Warning: If you use the below statement, you will loss the entire table and you can not roll back.
    To delete entire data: DROP TABLE table_name;

    Thanks-PNRao!

  67. Haridas
    January 25, 2015 at 12:37 AM — Reply

    Hi,
    I need VBA & SQL learning material because i don’t have knowledge in VBA but i have knowledge in MS Office(Advance excel..).
    Any one please send to my email.

  68. sachin
    January 27, 2015 at 6:10 PM — Reply

    I was creating a macro to remove exact row duplicate in excel using sql query,but it it giving me “Runtime error -2147217865(80040e37)”. Below isthe VBA code

    Sub sbADOExample()
    Dim sSQLQry As String
    Dim ReturnArray

    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset

    Dim DBPath As String, sconnect As String

    DBPath = ThisWorkbook.FullName

    ‘You can provide the full path of your external file as shown below
    ‘DBPath =”E:tempInputData.xlsx”

    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    Conn.Open sconnect

    sSQLSting = “select distinct column1, count(*) From [Sheet1$] group by column1 having count(*) >1″

    ‘ Your SQL Statement (Table Name= Sheet Name=[Sheet1$])

    mrs.Open sSQLSting, Conn
    ‘=>Load the Data into an array
    ‘ReturnArray = mrs.GetRows
    ”OR”
    ‘=>Paste the data into a sheet
    Sheet2.Range(“A2”).CopyFromRecordset mrs
    ‘Close Recordset
    mrs.Close

    ‘Close Connection
    Conn.Close

    End Sub

    Note : Above code working perfectly fine for 2 column

  69. PNRao
    February 3, 2015 at 9:53 PM — Reply

    Hi Sachin,

    I found no issues in your code. Please send your file with some dummy data. So that we can help you to solve your issue.

    Thanks-PNRao!

  70. Manoj
    February 23, 2015 at 5:40 PM — Reply

    Hi PN Rao – Thanks for the post really helpful
    I am trying to use Sum( Case when ( condition) then 1 else 0 end ) in this concept and it keeps saying automation error
    The same code is working perfectly in SQL server
    Please advise

    Thanks
    Manoj

  71. Hi Rao

    I am also getting the same kind of error as Sachin is geeting

    I am getting the error in this line “mrs.Open sSQLsting,conn”

    error is “Runtime error -2147217865(80040e37)”

  72. PNRao
    March 2, 2015 at 7:05 PM — Reply

    Hi Richard and Sachin,

    Please make sure that the field names are correct. I could not find any issue in the Sachin’s query.

    Thanks-PNRao!

  73. Enrico
    March 19, 2015 at 9:13 PM — Reply

    Dear analists

    the code is working but I am retrieving in Sheets(1) just 54’816 lines on 575’000 present in Sheets(2).
    do you know why?
    I am using Excel 2010

    Thanks
    Enrico

  74. Aswin
    March 23, 2015 at 11:41 PM — Reply

    Hi PN ,

    Read through the post great information you are sharing indeed.. I have a scenario where i would need to pull the values in a column in sheet say Sheet1 whose range may be dynamically changing into IN clause in SQL server query with values like ‘A’,’B’,’C’ etc

  75. guys77
    March 29, 2015 at 10:36 AM — Reply

    Hi experts..
    How about Dbf files?what string/connection code?
    Thanks

  76. KUMAR
    May 4, 2015 at 1:07 PM — Reply

    Really great. I could get what I could not even in Microsoft site

  77. HONEY
    May 8, 2015 at 12:23 PM — Reply

    Hi,

    I want to access the info of memory usage of production database in my excel sheet.

    can anyone help me with vba.

  78. sheriff
    May 14, 2015 at 9:54 PM — Reply

    Hi,

    I want to get a notification automatically when a file is copied in a folder. Can this be done by VBA macro ?

    Please help me.

    Thanks,
    Sheriff

  79. sheriff
    May 14, 2015 at 9:58 PM — Reply
  80. Sam
    May 22, 2015 at 8:04 AM — Reply

    Hi,

    Thanks for sharing this info…
    Very useful

    regards
    sam

  81. Anand Jo
    May 29, 2015 at 9:19 PM — Reply

    Thanks for the code. It works with the user input when input command is used. But, it does not work when the user enters a value in the textfield in the userform created in excel VBA. Why does this happen? It just does not work with the userform text field input. Any help is appreciated. Here is the code:

    Sub UForm()
    Dim sSQLSting As String
    Dim ReturnArray

    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset
    Dim DBPath As String, sconnect As String

    DBPath = ThisWorkbook.FullName
    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”
    Conn.Open sconnect
    sSQLSting = “SELECT * From [Sheet1$] where Order_Number = ” & ordernotext1 ‘ Your SQL Statement (Table Name= Sheet Name=[Sheet1$])
    mrs.Open sSQLSting, Conn

    Sheets(“ReportsO”).Range(“A8”).CopyFromRecordset mrs
    mrs.Close
    Conn.Close
    End Sub

  82. kishan Sanghani
    June 5, 2015 at 4:18 AM — Reply

    Hi ,

    I am able to execute query from VBA on my DB2. But sometime I need to abort query because of DB conjunction. Please suggest me way to abort query , if executed through VBA.

    Thanks in advance.

    Regards,
    Kishan Sanghani

  83. Krishna
    June 10, 2015 at 9:00 PM — Reply

    Hi,

    Am able to connect to excel data source using ADO connection. But my excel has 265000 rows and 118 columns. When I try to open record set, it struck and it taking more time.. Is that any way to use Ado connection and open record set in quick turnaround? Pls suggest.. Tnx

  84. UDAY PRATAP
    June 17, 2015 at 5:09 PM — Reply

    Nice Explanation…..Thanks.
    If I want to save picture of employees in (the respective rows) a column. for example Emp_Photo
    and if I run Select * from [Sheet1$] it is bringing all information but not the pictures
    How to achieve it?

  85. UDAY PRATAP
    June 17, 2015 at 5:12 PM — Reply

    Try to connect in a blank New workbook and after connection is established then copy the original sheet into this new workseets.

  86. Vic
    June 30, 2015 at 7:37 PM — Reply

    Hi,

    The code you gave worked! I am really kinda new to this old VBA stuff. My problem is it opens on a new sheet in a new workbook. How can I have the data displayed on an existing sheet with existing columns?

    Thank you in advance for your help PN.

    – V

  87. Sameer
    July 9, 2015 at 5:56 PM — Reply

    Hi PN – Your site has awesome content and I am hoping you can resolve my query.

    I have a MySQL database and I have connect it to excel using VBA on the local machine. Now I want to give the same excel file as an input/output mechanism to all the users to interact with the database installed on my computer. All the users are in a network. Any help would be greatly appreciated.

  88. PNRao
    July 9, 2015 at 7:51 PM — Reply

    Hi Sameer,

    Thanks for your feedback!

    Here are the possible solutions and my preference order:

    Solution 1: You can create new database in any server and export the local database into server and change the connection string. All your user need to have MySQL OLEDB Provider in their PCs.

    Solution 2. You can export to MS Access database and change the connection string. For this your user do not required to install any additional Provider.

    Hope this helps!
    Thanks-PNRao!

  89. Mahantesh
    September 9, 2015 at 5:18 PM — Reply

    StrSQL=”SELECT * FROM [Shee1$] MINUS SELECT * FROM [Sheet2$] is not getting executed.

    Help required.

  90. Dung Nguyen
    September 14, 2015 at 8:58 PM — Reply

    Hi PNRao,

    I would query to the first worksheet of selected workbook through navigate to the workbook location and user select it( I used worksheets(1) but can not successful), can you show me a sample how to assign this parameter of worksheets(1) to the vba query?

    Regards/Dung

  91. This paragraph ցives ϲlear idea in support οf the new users.

  92. Sriram
    October 7, 2015 at 12:48 PM — Reply

    Hi
    Am trying to run sql Analysis query in excel macro . Can you please help me .

    Thanks in advance

  93. Dan
    October 21, 2015 at 7:20 AM — Reply

    Hi,

    Very helpful page, thank you.

    I have managed to use a select query to retreive data from a second sheet however I am wanting to update data in a sheet using this method. I have changed the sSQLSting to an update query which appears to run but the data does not update.

    Could I please trouble you for a simple example of how to update a cell value?

    Column A (Dealer) is unique and Column B (Value) is the cell that I am trying to update

    Sheet name = DATA
    Column A = Dealer
    Column B = Value

    Thank you,

    Dan

  94. Dan
    October 21, 2015 at 10:19 AM — Reply

    Sorry for wasting your time with my first message, was a pretty simple mistake in the end.
    I have it working however I am wanting to source the value that I am updating from a cell on the sheet. I have done this with:
    Dim NewVal As String
    NewVal = Sheets(“ADO”).Range(“N2”).Value
    When I try to put this into the sSQLSting it errors. Can you please help me out.

    Thanks again.

    Code:

    ‘Add reference for Microsoft Activex Data Objects Library

    Sub sbADOUPDATE()
    Dim sSQLQry As String
    Dim sSQLQry2 As String
    Dim NewVal As String

    Dim ReturnArray

    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset

    Dim DBPath As String, sconnect As String

    DBPath = “P:DocumentsSALESOrderwrite2015TestingBook2.xlsx”
    NewVal = Sheets(“ADO”).Range(“N2″).Value

    ‘You can provide the full path of your external file as shown below
    ‘DBPath =”C:InputData.xlsx”

    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    Conn.Open sconnect
    sSQLSting = “UPDATE [Data$] SET Content = ‘testing2’ WHERE Dealer = ‘Q325′”

    mrs.Open sSQLSting, Conn
    sSQLSting2 = “UPDATE [Data$] SET Content = 1000 WHERE Dealer = ‘Q375′”

    mrs.Open sSQLSting2, Conn

    ‘Close Connection
    Conn.Close

    End Sub

  95. Masaru
    November 1, 2015 at 11:58 PM — Reply

    Question: I have a header where it has been merge with under a 3 column, is it possible to call the sub column? Thanks!

  96. Michael
    November 10, 2015 at 8:37 PM — Reply

    Hi All
    I have a spreadsheet with an Excel Table named Table1 with two Columns named Quarter and Sales.
    The Table has say 4 rows of data beneath the header. Then there is more data in the rows below the table which is not part of the table.

    How do I copy only the data in the Table rows?
    Using SqlQry = “SELECT [Quarter], [Sales] FROM [Sheet2$][Table1$]”
    Copied all the data in the two columns including the data outside the Table.
    Thanks.

  97. loes
    November 25, 2015 at 7:52 PM — Reply

    Hello,

    I am trying to set up a connection to MySQL and came across this example. I applied the code to my own file. But what i can not seem to figure out is why the file does not take the values you write in A1, A2 etc. where in the code do you tell the code to skip the first line?

  98. Ray
    November 26, 2015 at 10:35 AM — Reply

    This is precisely what i was searching for..Thanks a Ton.

    One question please….Here we saw fetching data from a spreadsheet using ADO.

    Can we write data from a User interface,like a form (in Spreadsheet A) to a Database (Spreadsheet B) using ADO ?

    Please can you point me to where can I get more info on this.

    All the best with your efforts. God bless !

  99. mike
    January 15, 2016 at 1:22 PM — Reply

    Hello,

    I have made a connection with a dbf file with VBA this works great, but is it also possible to open multiple dbf files en join them in the SQL? Iám trying hard but can’t figure it out.

  100. Shwetanjali Das
    February 11, 2016 at 12:10 PM — Reply

    Hi,

    I want to fetch records from a database. How to do that? I have read only access to that database.

  101. srimeenakshi
    March 22, 2016 at 6:01 PM — Reply

    hi friends,
    i want a code to update a table in a database. when we click command button in vba?
    anyone can help me

  102. Iris
    March 29, 2016 at 3:21 PM — Reply

    hi, i couldn’t download the example file, seems the linkage was corrupted.

  103. Akit
    May 3, 2016 at 10:09 AM — Reply

    HI ,

    Really helpful blog, I am encountering an error when I tried to use Like operator in my sql statement.

    exs
    Dim sSQLQry As String
    Dim ReturnArray
    Dim Conn As New ADODB.Connection
    Dim mrs As New ADODB.Recordset
    Dim DBPath As String, sconnect As String
    DBPath = ThisWorkbook.FullName
    ‘You can provide the full path of your external file as shown below
    ‘DBPath =”C:InputData.xlsx”
    sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”
    Conn.Open sconnect
    Debug.Print YourstrQery,

    1. SQLSting = “SELECT * From [Sheet1$] WHERE [URL] like ‘%POST /login.form HTTP/1.1%’ ”

    2. SQLSting = “SELECT * From [Sheet1$] WHERE session in(Select Distinct session from [Sheet1$]) and [URL] like ‘%POST /login.form HTTP/1.1%’ ”

    mrs.Open sSQLSting, Conn

  104. ram
    May 10, 2016 at 12:34 PM — Reply

    There are records in the sheet titled ‘Table2’, which have Cust_ID not present in column Cust_ID in the sheet titled ‘Table1’ (e.g. 110, 117). Can you write an Excel VBA program that transfers the data in these sheets to 2 separate tables in Access DB, runs the appropriate query and provides the list of unmatched records from ‘Table2’? Please use ADO method for database connectivity. The program should execute on clicking a button in Excel and output should comprise of unmatched records displayed in a new Excel sheet.

  105. Guilherme
    June 4, 2016 at 12:08 AM — Reply

    I did’nt find the example file =(
    Can you send me the link?

  106. PNRao
    June 4, 2016 at 9:43 PM — Reply

    Thanks- We have fixed the download link.

    Thanks-PNRao!

  107. Kamal Kroor
    June 21, 2016 at 1:08 PM — Reply

    Dear All,
    Any one can help me with using variables in update command? in the above example, update is used only with exact number which will not be the case for real time situation. We need a variable that takes values from the user form.
    Thanks,

    Kamal Kroor

  108. Célio Ávila
    June 21, 2016 at 7:56 PM — Reply

    Damn… I’ve been trying so hard to learn this, but nothing ever seems to work.
    I finally downloaded the example file and not even that is working. I get the message, “System error &H8000FFFF (-2147418113). Catastrophic Failure.”
    I activated the 2.8 library something, so I dont know what could be going wrong.

    Also, every source I look for to study gives me a completely different macro example, so I can’t even compare them to better understand the coding.

    When I do find good content to learn SQL from, it doesnt seem to be related to excel vba, so it doesnt help me all that much.

    I’m trying to learn how to filter data with ADO insteand of using autofilter. At first I saw someone posting this example:

    Sub testConnection()
    Dim wb As Workbook
    Dim c As WorkbookConnection
    Dim sql As String

    Set wb = ActiveWorkbook

    Set c = wb.Connections.Item(1)
    sql = c.ODBCConnection.CommandText
    sql = Replace(sql, “WHERE (`’Sheet1$’`.k=10)”, _
    “WHERE (`’Sheet1$’`.k=9) AND (`’Sheet1$’`.l=11) AND (`’Sheet1$’`.m=12) AND (`’Sheet1$’`.n=13) “)
    c.ODBCConnection.CommandText = sql
    c.Refresh

    End Sub

    can anyone make sense of this?

  109. Ankush
    June 28, 2016 at 3:31 PM — Reply

    Hi

    Could you let me know if we can connect a macro to the server and get the information from the log files.

    And if yes , then could you let me know how we could connect to the server.

  110. Stanley
    July 1, 2016 at 1:25 PM — Reply

    Hi PNRao,

    Your website is awesome!
    Do you have experience to use RANK() OVER(PARTITION BY) function by ADODB connection?
    I need to rank first and output them.
    Any help would be greatly appreciated.

    Stanley

  111. Stewart
    July 15, 2016 at 2:27 PM — Reply

    HI PNRao,

    New to using VBA & ADO , I wish to use a similar code that uses an input-box to pull through the relevant input from a closed workbook to my current active workbook, is this possible?

    Kind Regards,

    Stewart

  112. Sanjeev Sharma
    August 6, 2016 at 12:54 AM — Reply

    Thanks!! for the valuable information!!

  113. Pawan
    August 30, 2016 at 10:49 AM — Reply

    Very nice Article. I have one query in this that I have one column which has number as well as text and I found one thing that vb query that declare the fields type as Number and it will not show Text values. So is it possible to import all the fields with data type as a string because string can capture both number as well as text.

  114. Tomi
    August 30, 2016 at 11:58 PM — Reply

    Hi, I am new to VBA and application development. Please how can someone start with learning VBA and Database Application development? Thank you

  115. Durgam Sasidhar
    January 4, 2017 at 7:36 PM — Reply

    WOW, This is what am searching for entire day, and this post Cleared My doubts and issues. Thx a lot

  116. Sunil Sehgal
    April 5, 2017 at 11:05 AM — Reply

    Hello sir,
    While I run my code it is showing automation error. Can you please etell me why is it so occuring.. tell me the solutio n for the same.

  117. Hasan
    May 4, 2017 at 9:05 PM — Reply

    Hi,

    when the Excel file is opened read-only, the sql query (with both providers MSDASQL and Microsoft.Jet.OLEDB) does not return any results.

    Any ideas how to overcome this, maybe using additional parameters?

  118. Rakesh
    May 17, 2017 at 2:43 PM — Reply

    Hi PNRao,

    Information provided by you in your website is excellent.
    I customised this code to postgresql,but getting an Run-Time error object required: 424.Can you please help me with this error.

    Thanks
    Rakesh

  119. AK
    July 19, 2017 at 7:57 PM — Reply

    Dear PN,

    Really, this webpage is very useful, thanks for your efforts.

    I have one question here:
    Instead of figures (2 & 5000) at ‘Values(2,500)’ how can use variables or cells from active sheet?

    Thanks in advance & regards,
    AK

  120. PNRao
    July 19, 2017 at 8:51 PM — Reply
    You need to form the string as per your requirement.
    Replace the below statement:
    sSQLSting = “INSERT INTO [DataSheet$](Quarter, Sales) Values(2,5000)”.
    
    With:
    
    sSQLSting = “INSERT INTO [DataSheet$](Quarter, Sales) Values(" &Range("A1") &"," &Range("A2") &")”.
    

    The second statement will read the values from Range A1 and A2 of ActiveSheet. You can also specify the sheet name if it is not a active sheet, Sheets(“SheetName”).Range(“A1”)

    Thanks!

  121. YasserKhalil
    July 20, 2017 at 10:59 PM — Reply

    That’s really awesome. Thank you very much
    How to update closed workbook using ADO?

  122. Andi permana
    November 30, 2017 at 4:36 PM — Reply

    How do I use where statement and group by??

  123. Mayur raj
    March 4, 2018 at 12:50 PM — Reply

    Hi recordset stores the result in array form, when using select a view/output is getting stored.but using insert there is no output, it will process the query and store data in mentioned table.
    Add one more line, select * from [inserted_table]
    Before msr.
    Hope you get the logic.
    Thanks

  124. Anil
    April 19, 2018 at 6:10 PM — Reply

    Hi Sir,

    I have insert code but show the error.

    Option Explicit
    Dim BlnVal As Boolean

    Private Sub Done_Click()
    Dim sSQLQry As String
    Dim ReturnArray
    Dim con As ADODB.Connection
    Dim sqlstr As String, datasource As String
    Set con = New ADODB.Connection
    datasource = “D:TEST.xlsx” ‘change to suit

    Dim sconnect As String
    sconnect = “Provider=Microsoft.ACE.OLEDB.12.0;” & _
    “Data Source=” & datasource & “;” & _
    “Extended Properties=”Excel 12.0;HDR=YES”;”
    With con
    .Open sconnect

    sqlstr = “Insert Into [Sheet2$](Sno, Name, Amt) Values (GP.ComboBox1.Value, GP.TextBox1, GP.TextBox2)”

    .Execute sqlstr
    .Close
    End With

    Set con = Nothing

    End Sub

  125. Anil
    April 19, 2018 at 6:14 PM — Reply

    I have insert data in offline Excel File & Same Update Data Combobox1 and TextBox1 only Number accept. not Text.

  126. nalini raju
    May 14, 2018 at 6:47 PM — Reply

    ‘Iam not able to insert
    ‘Iam getting error–Automation error in runtime
    ‘Using MSDASQL Provider
    ‘sconnect = “Provider=MSDASQL.1;DSN=Excel Files;DBQ=” & DBPath & “;HDR=Yes’;”

    ‘Using Microsoft.Jet.OLEDB Provider – If you get an issue with Jet OLEDN Provider try MSDASQL Provider (above statement)
    sconnect = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & DBPath _
    & “;Extended Properties=”Excel 8.0;HDR=Yes;IMEX=1″;”

    Conn.Open sconnect
    ‘DeleteId = InputBox(“Name”)
    ” sSQLSting = “SELECT DISTINCT Date,SalesRep,Product,Discount,Units,Region,Net_Sales From [DataSheet$]”
    ‘ Your SQL Statemnt (Table Name= Sheet Name=[DataSheet$])
    ‘ sSQLSting = “UPDATE [DataSheet$] SET SalesRep=10,Product=10,Discount=10,Units=10,Region=10 WHERE Units=1”
    sSQLSting = “INSERT INTO [RAMA$](Quarter, Sales) Values(” & Sheets(“RAMA”).Range(“A1”) & “,” & Sheets(“RAMA”).Range(“A2”) & “)”
    ‘ sSQLSting = “Select * from [DataSheet$]” ‘ where Date is not null”
    mrs.Open sSQLSting, Conn

    ‘ Sheets(“RAMA”).Range(“A1”).CopyFromRecordset mrs

    mrs.Close

    ‘Close Connection
    Conn.Close
    End Sub

  127. Taesoo
    June 14, 2018 at 4:51 PM — Reply

    Hi,

    I read date from db file but can not read full data.
    Below is the data in db file
    Date
    4/16/2016 16:39
    4/19/2016 12:50
    4/22/2016 16:12
    4/25/2016 10:28
    4/27/2016 10:51

    This is what I read
    Date
    4/16/2016
    4/19/2016
    4/22/2016
    4/25/2016
    4/27/2016

    Sub db_query()

    Dim conn As Object, rst As Object
    Worksheets(“results”).Range(“A2:AI5001”).ClearContents

    Set conn = CreateObject(“ADODB.Connection”)
    Set rst = CreateObject(“ADODB.Recordset”)

    conn.Open “DRIVER=SQLite3 ODBC Driver;Database=D:backup.db;”

    strSQL = “SELECT Date from Tb_Result_Summary”
    rst.Open strSQL, conn, 1, 1

    Worksheets(“results”).Range(“A2”).CopyFromRecordset rst
    rst.Close

    Set rst = Nothing: Set conn = Nothing

    End Sub

  128. Baze
    July 9, 2018 at 3:50 PM — Reply

    Hi PN, thank you for this material. it is very educative especially for a person who is beginner in VBA like me.
    I am trying to make a connection from my excel file to a database and i tried your code but it resulted in a mistake :

    ‘Sheet1$’ is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long

    I am apologizing in advance, cause this question might seem very beginner for you, but I am in my first steps with VBA.

  129. Deepak Bisht
    October 2, 2018 at 6:45 PM — Reply

    Each time i pull data the file opened in read only mode.. Please advise

  130. Prabhu Murugan
    December 20, 2018 at 9:42 AM — Reply

    Hi,

    A column in an excel file consist of values only. But still select query for the field throws data type mismatch in criteria even after I changed all the cells to values.

    select * from table where field < 0

    It works only for

    select * from table where field < ‘0’

  131. Amber
    July 18, 2019 at 5:58 AM — Reply

    I want to get into an array all records brought by getRows but I can’t. When I try like this, the array stay empty anyway. I only get success by using getString but my goal is insert each record into a cell of a listbox. I hope you can understend my english!

  132. anil
    November 17, 2019 at 12:50 PM — Reply

    thanks for efforts sir as a beginer easyly understand whole concept

  133. Mon
    February 9, 2020 at 1:15 PM — Reply

    Hi,

    please advise how can I use the SQL command to delete the record

    thank you

  134. Dinesh
    May 2, 2020 at 10:37 PM — Reply

Effectively Manage Your
Projects and  Resources

With Our Professional and Premium Project Management Templates!

ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.

We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.

Project Management
Excel VBA

Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.

Analysistabs Logo

Page load link

VBA Projects With Source Code

3 Realtime VBA Projects
with Source Code!

Take Your Projects To The Next Level By Exploring Our Professional Projects

Go to Top

Table of Contents

Definitive Guide To ADO in Excel and VBA

There are several methods to work with external data and files in Excel. ADO (ActiveX Data Objects) is one of the best and most frequently used tools to work with external data and files. In Excel, we can use the combination of ADO with VBA (Visual Basic for Applications) to work with external data sets in memory. ADO always comes in handy when we need to perform complex, multi-layered procedures and checks on external datasets.

What is ActiveX Data Objects (ADO)?

ADO in Excel and VBA is a tool in that helps developers to write VBA code to access data without knowing how the database is implemented; developers should be aware of the database connectivity only. Being a developer, you don’t need to know the SQL to access a database when using ADO, although you can run SQL commands directly using ADO. So, in short, ADO helps developers accomplish two major tasks:

  • Connect to a data source
  • Specify the datasets with which to work

Using the ADODB connection, we connect our VBA application with the databases e.g., SQL, MS Access, Microsoft List, Excel workbook, etc.,

Understanding the fundamental syntax of ADO (Connection String and Recordset)

While dealing with external data and files, we must connect the data source before doing anything. To establish the connection, we must provide VBA a few pieces of information. The required information will be provided to VBA in the form of the connection string.

What is a connection string?

A connection string is nothing but a text string that contains a series of variables (also called arguments), which VBA uses to identify the data source and open the connection for further use.

Let’s understand the connection string and its arguments that point to an MS Access database and MS Excel Workbook. You can find several other connection strings at ConnectionStrings.com – Forgot that connection string? Get it here!

Connection Sting – MS Access database 

“Provider=Microsoft.ACE.OLEDB.12.0; ” & _
“Data Source= C:MyDatabase.accdb;” & _
“User ID= Administrator;” & _
“Password= AdminPassword”

Connection Sting – MS Excel workbook

“Provider=Microsoft.ACE.OLEDB.12.0; ” & _
“Data Source= C:MyExcelWorkbook.xlsx;” & _
“Extended Properties=Excel 12.0”

ADO connection string can have multiple arguments basis the data source type. Let’s understand the arguments which commonly used i.e., Provider, Data Source, Extended Properties, User ID, and Password (the same have been used in the previous example for MS Access and Excel).

Live Project – Data Entry Application in Excel and VBA using ADO
Data Entry Application in Excel and Access

Provider: With the help of Provider argument in the connection string, VBA identifies the type of data source we are going to work with. Suppose we are going to work with MS Access or MS Excel datasets, then the Provider syntax will be:

Provider=Microsoft.ACE.OLEDB.12.0

Data Source: This argument helps VBA to find the source of database or workbook that contains the data needed. For this parameter, we need to pass the full path of the database or workbook. For example:

Data Source=C:MydirectoryMyDatabaseName.accdb

Extended Properties: Extended Properties is required when we connect to an Excel Workbook. With the help of this argument, VBA identifies that data source is something else than a database. You can use this argument below:

Extended Properties=Excel 12.0

User ID: The User ID argument is optional and only used if the data source is protected with a user id and password. For example:

User Id = Admin

Password: This argument is optional and only need if the password is required to connect to the data source. For example:

Password = MyPassword

Note: You can skip User ID and Password arguments if the data source is not protected.

What is a Recordset?

A Recordset object is a group of records that can either come from a data source or as the output of a query to the table. The Recordset provides several methods and properties to examine the data that exists within the data source.

In addition to building a connection to the data source, we need to define the dataset (Recordset) with which we need to work. We can define the Recordset to open an existing table or query using the 4 common arguments: Source, ConnectString, CursorType, and LockType.

Recordset.Open Source, ConnectString, CursorType, LockType

Let’s understand all these 4 parameters.

Source in Recordset

The source data is typically a table, a SQL statement, or a query that retrieves records from the data source. Please see the below example of Source in different scenarios.

Providing MS Access table name ‘Product’ to Source

Recordset.Open “Product”

SQL statement to Source. In below code, MySQL is a variable holding SQL statement.

MySQL=”Select * from [Product] where Region=”North’”
Recordset.Open MySQL

ConnectString in Recordset

ConnectString is the argument that we have already discussed while understanding the ConnectionString. We just need to pass the ConnectionString here so that Recordset can identify the data source.

So, suppose we are going to connect with MS Access table ‘Product’ in Recordset then the code will be like:

Recordset.Open Product, ConnectionString

CursorType in Recordset

A cursor is a mechanism that enables the Recordset to move over the records in a database. It allows developers to retrieve each row at a time and manipulate its data. In simple language, a cursor is nothing more than a point to a row on which you are performing the data manipulation work.

The CursorType that are commonly used in Recordset code:

  1. adOpenForwardOnly: This is the default cursor type available in Recordset. If we don’t pass any CursorType in the code, then Recordset will automatically consider adOpenForwardOnly. This cursor is very efficient and allows us to move through the Recordset from beginning to end (one way only). This cursor is ideal for reporting purposes where we need to extract the data. This cursor does not allow to perform any changes to data.
  2. adOpenDynamic: When we need to loop through the data, moving up and down in the datasets, and want to identify any edits made to the dataset then adOpenDynamic can be used in Recordset. As it performs almost all the activities required in database operation, this cursor takes a lot of memory and resources of the system and should be used only when needed.
  3. adOpenStatic: This CursorType is ideal for quick return as it uses a static copy of data from the database. This is different from adOpenForwardOnly CursorType as it allows the developer to navigate the returned records. In addition to these, this CursorType allows data to be updateable by setting the LockType except adLockReadOnly (we will see LockType in upcoming part of this blog).

LockType: A LockType is a mechanism that helps developer to apply restrictions on a table or datasets to avoid unauthorized access or changes to the Recordset. We usually use two LockType in ADO:

  • adLockReadOnly: This is the default LockType in Recordset which indicates that there is no need to edit the data returned. If we don’t provide the LockType to Recordset then VBA considers this internally.
  • adLockOptimistic: This LockType is ideal when we need to edit the data returned to Recordset. We can use this if we want to perform Add, Update and Delete method in the database.

Referencing the ADO object library in VBA

Now, we have strong fundamentals of ADO and the codes/arguments. Let’s create our own ADO procedures to perform some basic operations. It will help us get more clarity and understanding of ADO in real projects.

To use the ADO in the Excel project, we need to add the reference of the ADO object library in the Visual Basic Application (VBA) window. Once we add the reference of ADO in the Excel project, Excel will start understanding the objects, properties, and methods of ADO.

Note: we can use ADO library without giving the reference of ADO in Excel with Late Binding technique, but it will increase the complexity of code and you will not be able to get the help while writing the code. So, we would recommend you start using the Early Binding i.e., giving the reference of ADO and then writing the code. Once you have expertise in the code then you can move to Late Binding technique.

To start adding the reference of ADO, just open the MS Excel application and create a new workbook and save the file with a Macro enabled extension e.g., .xlsm. Open the Visual Basic Editor window using the Shortcut key ALT + F11.

image 11

Saving Excel file with macro enabled extension

Once Visual Basic Editor window will appear on screen then click on Tools (available in the application menu) -> References….

image 12

Tool menu to open Reference Dialog Box

Once you click on References.. then it will open the References dialog box as shown in the picture below. In the available references list, just scroll down until you find the latest version of the Microsoft ActiveX Data Objects Library. Just tick the Checkbox and click on the OK button available in the dialog box to add the ADO reference to the current Excel file.

image 13

Reference Dialog Box in VBA to Select ADO

Note: you can see several versions of the ADO library in Reference dialog box. We would recommend you select the latest version from the list or if you are developing a project for your client then check the version of MS Excel and available ADO on client system and then go with that library to make your code compatible.

After clicking on OK button, we can open the Reference dialog box again to ensure that whether the ADO reference is selected or not. If that is selected, then it will start appearing on top of the list as check marked (as you can see in above image).

VBA code to Use ADO and get data from MS Access database

Writing the code to get the data from Customer table of MS Access database.

Sub GetCustomerData ()
Dim MyConnect as String
Dim MyRecordset as ADODB.Recordset
MyConnect= “Provider=Micorosft.ACE.OLEDB.12.0;” & _
“Data Source= D:TheDataLabsSales.accdb”
Set MyRecordset= New ADODB.Recordset
MyRecordset.Open “Customer”, MyConnect, adOpenStatic, adLockReadOnly
ThisWorkbook.Sheets(“Customer”).Range(“A2”).CopyFromRecordset MyRecorset
With ActiveSheet.Range (“A1:C1”)
.value = Array (“Name”, “Gender”, “Address”)
.EntireColumn.AutoFit
End With
End Sub

Now we are done with putting all the code together in a procedure to get the data from Customer table and provide the output in MS Excel worksheet “Customer”.

Understand VBA Codes line by line

For better clarity, let’s take a moment to understand the VBA code.

Sub GetCustomerData ()

With the help of this line, we are declaring a procedure named ‘GetCustomerData’.

Dim MyConnect as String

Declaring a string variable to hold the Connection sting so that VBA can identify the data source.

Dim MyRecordset as ADODB.Recordset

Declaring a Recordset object variable to hold the data that will be returned by the procedure.

MyConnect= “Provider=Micorosft.ACE.OLEDB.12.0; Data Source= D:TheDataLabsSales.accdb”

Here, we are defining the connection string for the ADO procedure. As we are connecting the ‘Sales’ MS database to get the data from the Customer table hence, we are passing the Provider parameter as Micorosft.ACE.OLEDB.12.0 and Source as D:TheDataLabsSales.accdb. The same has been already discussed in the Connection String section of the post.

Set MyRecordset= New ADODB.Recordset

With the help of the line of code, we are setting the reference of ADODB Recordset to MyRecordset object variable.

MyRecordset.Open “Customer”, MyConnect, adOpenStatic, adLockReadOnly

This line of code helps us in opening the Recordset to return static and read-only data.

ThisWorkbook.Sheets(“Customer”).Range(“A2”).CopyFromRecordset MyRecorset

Here, we are using Excel’s CopyFromRecordset method to get the data from the Recordset and provide the output in the range starting from the “A2” to the spreadsheet named ‘Customer’.

With ActiveSheet.Range (“A1:C1”) …. End With

These lines of Code help us in getting the column header and putting the header name in active sheet range A1 to C1. We need these lines of code because the CopyFromRecordset method does not return column headers or field names.

Live Project in Excel

Using ADO with Microsoft Visual Basic, we have developed the Data Entry Application Project in MS Excel and MS Access to transfer the data. Refer the below link.
Data Entry Application in Excel and Access

Interested in developing Data Entry Form without Using ADO
Easy-To-Follow: Create a Fully Automated Data Entry Userform in Excel and VBA in 5 Easy Steps
How to Create a Multi-User Data Entry Form in Excel (Step-by-step Guide)
Advance Data Entry Form

Read more topics

If you have any question on ‘Definitive Guide To ADO in Excel and VBA’ then please leave your comment in comment section. Thanks!

Содержание

  • 1 Excel based database
  • 2 Insert a row to a worksheet by using the SQL statement
  • 3 Opening an Excel Spreadsheet with ADO
  • 4 Use ADO to read the data from Access database to Excel

Excel based database

   <source lang="vb">

Sub ExcelExample()

   Dim r As Integer, f As Integer
   Dim vrecs As Variant
   Dim rs As ADODB.Recordset
   Dim cn As ADODB.Connection
   Dim fld As ADODB.Field
   Set cn = New ADODB.Connection
   cn.Provider = "Microsoft OLE DB Provider for ODBC Drivers"
   cn.ConnectionString = "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=C:mydb.mdb;"
   cn.Open
   Debug.Print cn.ConnectionString
   Set rs = New ADODB.Recordset
   rs.CursorLocation = adUseClient
   rs.Open "SELECT * FROM Employees", cn, adOpenDynamic, adLockOptimistic
   For Each fld In rs.Fields
       Debug.Print fld.Name,
   Next
   Debug.Print
   vrecs = rs.GetRows(6)
   For r = 0 To UBound(vrecs, 1)
       For f = 0 To UBound(vrecs, 2)
           Debug.Print vrecs(f, r),
       Next
       Debug.Print
   Next
   Debug.Print "adAddNew: " & rs.Supports(adAddNew)
   Debug.Print "adBookmark: " & rs.Supports(adBookmark)
   Debug.Print "adDelete: " & rs.Supports(adDelete)
   Debug.Print "adFind: " & rs.Supports(adFind)
   Debug.Print "adUpdate: " & rs.Supports(adUpdate)
   Debug.Print "adMovePrevious: " & rs.Supports(adMovePrevious)
   
   rs.Close
   cn.Close
   

End Sub

</source>
   
  

Insert a row to a worksheet by using the SQL statement

   <source lang="vb">

Public Sub WorksheetInsert()

 Dim Connection As ADODB.Connection
 Dim ConnectionString As String
 ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "Sales.xls;" & _
   "Extended Properties=Excel 8.0;"
   
 Dim SQL As String
   
 SQL = "INSERT INTO [Sales$] VALUES("VA", "On", "Computers", "Mid", 30)"
 Set Connection = New ADODB.Connection
 Call Connection.Open(ConnectionString)
   
 Call Connection.Execute(SQL, , CommandTypeEnum.adCmdText Or ExecuteOptionEnum.adExecuteNoRecords)
 Connection.Close
 Set Connection = Nothing

End Sub

</source>
   
  

Opening an Excel Spreadsheet with ADO

   <source lang="vb">

Sub Open_ExcelSpread()

  Dim conn As ADODB.Connection
  Set conn = New ADODB.Connection
  conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & CurrentProject.Path & _
      "Report.xls;" & _
      "Extended Properties=Excel 8.0;"
  conn.Close
  Set conn = Nothing

End Sub

</source>
   
  

Use ADO to read the data from Access database to Excel

   <source lang="vb">

Public Sub SavedQuery()

 Dim Field As ADODB.Field
 Dim Recordset As ADODB.Recordset
 Dim Offset As Long
   
 Const ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:mydb.mdb;Persist Security Info=False"
   
 Set Recordset = New ADODB.Recordset
 Call Recordset.Open("[Sales By Category]", ConnectionString, _
   CursorTypeEnum.adOpenForwardOnly, LockTypeEnum.adLockReadOnly, _
   CommandTypeEnum.adCmdTable)
 If Not Recordset.EOF Then
   With Sheet1.Range("A1")
     For Each Field In Recordset.Fields
       .Offset(0, Offset).Value = Field.Name
       Offset = Offset + 1
     Next Field
     .Resize(1, Recordset.Fields.Count).Font.Bold = True
   End With
   Call Sheet1.Range("A2").CopyFromRecordset(Recordset)
   Sheet1.UsedRange.EntireColumn.AutoFit
 Else
   Debug.Print "Error: No records returned."
 End If
 Recordset.Close
 Set Recordset = Nothing

End Sub

</source>

Понятие о библиотеке ADO

Библиотека ADO (Microsoft ActiveX Data Object) служит для доступа к базам данных различных типов и предоставляет
объектный программный интерфейс к интерфейсу OLE DB, который предлагается компанией Microsoft как альтернатива
интерфейсу ODBC. Объектная модель ADO реализована на базе технологии COM (Component Object Model).

Библиотека ADO может быть использована в любых средах, которые в состоянии выступить в роли OLE-клиента, например,
в MS Office (VBA), 1C:Предприятии, административных скриптах Windows (.vbs и .js) и т.д. Примеры кода в настоящей
статье будут приводиться на языке VBScript для административных скриптов Windows. С помощью библиотеки ADO можно
обратиться к огромному количеству типов баз данных, например, dBASE, Access, Excel, Oracle, Paradox, MS SQL Server,
Sybase, текстовые файлы, FoxPro, Active Directory Service, Microsoft Jet, Interbase, Informix, PostgreSQL, MySQL
и т.д., необходимо только наличие установленного соответствующего OLE-провайдера («драйвера» соответствующего типа
базы данных, который устанавливается в систему как правило из дистрибутива этой же базы данных). Примеры кода в
настоящей статье будут приводиться только для MS SQL Server, т.к. невозможно объять необъятное. Перечень свойств
и методов ADO, приведённый в этой статье, не является исчерпывающим (в некоторых случаях и описание некоторых
свойств и методов не является полным). Полное описание объектной модели библиотеки ADO вы можете получить в MSDN
или в файле «ADO210.CHM», который входит в поставку MS Office. Однако материала данной статьи достаточно, чтобы
начать работать с ADO.

Основными объектами библиотеки ADO являются объекты Connection,
Command и Recordset.

Объект Connection

Объект Connection обеспечивает создание подключения к источнику данных и эквивалентен текущему сетевому соединению
с сервером. Объект Connection предоставляет возможность настройки соединения перед его открытием, установки базы
данных по умолчанию, установки и разрыва соединения с источником данных, задания настроек и выполнения команды с
помощью метода Execute. Примечание: для выполнения команды можно использовать также метод Execute объекта
Command, не прибегая к объекту Connection.

Объект Connection создаётся следующим образом:


Set objConn = CreateObject(«ADODB.Connection»)

После этого вы можете вызывать и использовать методы и свойства этого объекта для доступа к базам данных:

Описание
Version Содержит строку, определяющую версию библиотеки. Только чтение.
ConnectionString Определяет параметры подключения к источнику данных. Чтение и запись. Это строка, содержащая несколько
параметров, разделённых точкой с запятой. Свойство ConnectionString автоматически получает значение, заданное в
качестве одноимённого аргумента метода Open. Свойство ConnectionString доступно для записи только для закрытого
соединения. Многочисленные примеры различных строк подключения для различных типов баз данных вы можете найти в
Интернете или в документации к соответствующим программным продуктам.
ConnectionTimeout Устанавливает или возвращает число секунд ожидания подключения к базе данных. Значение по умолчанию — 15.
Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера.
Если время, указанное в ConnectionTimeout, истекает до открытия подключения, происходит ошибка, и ADO отменяет
попытку подключения. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока подключение не будет
открыто. Удостоверьтесь, что используемый провайдер поддерживает свойство ConnectionTimeout. Свойство доступно для
записи только для закрытого соединения.
CommandTimeout Устанавливает или возвращает число секунд ожидания выполнения команды. Значение по умолчанию — 30. Чтение и
запись. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера.
Если время, указанное в CommandTimeout, истекает до завершения выполнения команды, происходит ошибка, и ADO отменяет
команду. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока команда не будет выполнена.
Удостоверьтесь, что используемый провайдер поддерживает свойство CommandTimeout. Установка CommandTimeout объекта
Connection никак не связана с установкой свойства CommandTimeout объекта Command.
Provider Устанавливает или возвращает строковое значение, которое содержит имя используемого провайдера. По умолчанию
— «MSDASQL». Провайдер может быть также установлен содержанием свойства ConnectionString или параметром метода Open.
Определение провайдера в более чем одном месте может иметь непредсказуемые результаты.
DefaultDatabase Устанавливает или возвращает строковое значение, которое содержит заданную по умолчанию базу данных. Если есть
заданная по умолчанию база данных, запросы SQL могут использовать «дисквалифицированный» синтаксис для обращения
к объектам в этой базе данных. Чтобы обращаться к объектам из другой базы данных, вы должны «квалифицировать»
имена объектов именем этой базы данных. При подключении провайдер записывает заданную по умолчанию базу данных в
это свойство. Некоторые провайдеры разрешают только одну такую базу данных на одно подключение, и в этом случае вы
не сможете изменить это свойство. Некоторые источники данных и провайдеры могут не поддерживать это свойство,
генерируя ошибку или возвращая пустую строку.
CursorLocation Определяет расположение курсора, т.е. место, где выполняется работа с данными. Возможные значения:

  • adUseNone(1) — курсор не используется (только для совместимости со старыми версиями).
  • adUseServer(2) — курсор на стороне провайдера (по умолчанию).
  • adUseClient(3) — курсор на стороне пользователя. Может предоставлять дополнительные возможности, которые
    отсутствуют на стороне провайдера.

Изменение свойства CursorLocation не имеет никакого эффекта при уже существующем подключении. Связанные объекты
Recordset и курсоры, возвращённые методом Execute, наследуют эту установку. При открытом объекте Recordset это
свойство доступно только для чтения.

Mode Определяет режим доступа для изменения данных в сеансе. Возможные значения:

  • adModeUnknown(0) — режим доступа не установлен или не может быть определён (по умолчанию).
  • adModeRead(1) — режим только для чтения.
  • adModeWrite(2) — режим только для записи.
  • adModeReadWrite(3) — режим для чтения и записи.
  • adModeShareDenyRead(4) — не разрешает открывать соединение на чтение другим пользователям.
  • adModeShareDenyWrite(8) — не разрешает открывать соединение на запись другим пользователям.
  • adModeShareExclusive(12) — не разрешает открывать соединение другим пользователям.
  • adModeShareDenyNone(16) — разрешает открывать соединение с любым видом доступа другим пользователям.

Вы можете установить это свойство только тогда, когда объект Connection закрыт.

Errors Содержит коллекцию объектов Error. Любая инструкция, использующая объекты ADO, может сгенерировать одну или
более ошибок провайдера. Когда происходит ошибка, в эту коллекцию могут быть помещены один или более объектов Error.
Если следующая подобная инструкция также сгенерирует ошибку, коллекция будет очищена и заполнена заново. Каждый
объект Error представляет определённую ошибку провайдера, но не ошибку ADO (ошибки ADO подвергаются механизму
обработки исключительных ситуаций). Используйте метод Clear, чтобы вручную очистить коллекцию Errors. Некоторые
свойства и методы возвращают предупреждения, которые появляются как объекты Error в коллекции Errors, при этом
не останавливая выполнение программы. Перед тем, как вы вызываете методы Resync, UpdateBatch или CancelBatch
объекта Recordset, метод Open объекта Connection, или устанавливаете свойство Filter объекта Recordset, вызовите
метод Clear коллекции Errors. После этого вы можете прочитать свойство Count коллекции Errors, чтобы проверить
возвращенные предупреждения.
State Содержит состояние объекта. Только чтение. Свойство State может принимать следующие значения:

  • adStateClosed(0) — объект закрыт.
  • adStateOpen(1) — объект открыт.
  • adStateConnecting(2) — объект соединяется.
  • adStateExecuting(4) — объект выполняет команду.
  • adStateFetching(8) — объект выполняет выборку строк.
Properties Содержит коллекцию динамических свойств соединения (объектов Property). Подробнее — см. раздел «Динамические
свойства объектов».
Open(ConnectionString, UserID, Password, Options) Открывает сеанс подключения к источнику данных. Параметры:

  • ConnectionString — необязательный. Строка, определяющая параметры подключения к источнику данных. Автоматически
    наследует значение свойства ConnectionString объекта Connection. Вы можете или установить свойство ConnectionString
    объекта Connection перед вызовом метода Open, или использовать параметр ConnectionString метода Open.
  • UserID — необязательный. Имя пользователя, используемое при соединении.
  • Password — необязательный. Пароль пользователя.
  • Options — необязательный. Способ подключения к источнику данных. Возможные значения:
    • adAsyncConnect(16) — открывает подключение асинхронно. Чтобы определить, когда подключение станет доступным,
      можно обрабатывать событие ConnectComplete.
    • adConnectUnspecified(-1) — по умолчанию. Открывает подключение синхронно.

Если вы передаете информацию о пользователе и пароле как в строке ConnectionString, так и в параметрах UserID и
Password, параметры UserID и Password имеют приоритет. Закончив ваши операции с открытым подключением, используйте
метод Close() для освобождения всех связанных системных ресурсов.

Close() Закрывает соединение с источником данных. Закрытие объекта не приводит к удалению его из памяти. Можно изменить
свойства объекта, а затем открыть его снова. При закрытии подключения закрываются также все активные наборы записей
(объекты Recordset) для данного подключения. Объекты Command, связанные с данным подключением, уже не будут связаны
с данным объектом Connection. Закрытие объекта Connection во время транзакции генерирует ошибку и ADO автоматически
откатывает транзакцию.
Execute(CommandText, RecordsAffected, Options) Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. Возвращает
объект Recordset, доступный только для чтения курсором Forward-only, если переданная команда возвращает записи.
(Если нужен объект Recordset, доступный для записи, следует создать его непосредственно, и воспользоваться его
свойствами и методами.) Параметры:

  • CommandText — обязательный. Строка, содержащая оператор SQL, имя таблицы, хранимой процедуры или другую команду
    провайдера.
  • RecordsAffected — необязательный. Целое число (long), определяющее число записей, затронутых командой.
    Заполняется провайдером.
  • Options — необязательный. Целое число (long), определяющее тип команды. Возможные значения (значения можно
    суммировать):

    • adCmdText(1) — текстовое определение команды или хранимой процедуры.
    • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
    • adCmdStoredProc(4) — хранимая процедура.
    • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).
    • adAsyncExecute(16) — асинхронное выполнение команды.
    • adExecuteNoRecords(128) — не возвращать строки.
Cancel() Отменяет выполнение последнего асинхронного вызова Execute() или Open(), если действие ещё не завершено.
ConnectComplete(pError, adStatus, pConnection) Событие возникает после того, как осуществлено подключение к источнику данных. Параметры:

  • pError — содержит объект Error, если произошли ошибки (свойство adStatus равно adStatusErrorsOccurred(2))
  • adStatus — определяет состояние соединения. Возможные значения (для всех событий):
    • adStatusOK(1) — операция произведена успешно.
    • adStatusErrorsOccurred(2) — операция потерпела неудачу.
    • adStatusCantDeny(3) — операция не может быть отменена.
    • adStatusCancel(4) — произошла отмена операции.
    • adStatusUnwantedEvent(5) — предотвращает последующие уведомления до завершения выполнения метода события.
  • pConnection — объект Connection, который вызвал событие.
Disconnect(adStatus, pConnection) Событие возникает после того, как прервано подключение к источнику данных. Параметры аналогичны параметрам
события ConnectComplete.
InfoMessage(pError, adStatus, pConnection) Событие возникает каждый раз, когда генерируется предупреждение (warning). Параметры аналогичны параметрам
события ConnectComplete.
WillConnect(ConnectionString, UserID, Password, Options, adStatus, pConnection) Событие возникает перед тем, как осуществлено подключение к источнику данных. Параметры в основном аналогичны
параметрам события ConnectComplete. Options — целое число (long), которое указывает способ подключения —
adAsyncConnect(16) или adConnectUnspecified(-1). В обработчике события можно изменять параметры подключения.
WillExecute(Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection) Событие возникает перед выполнением команды. Параметры:

  • Source — строка, содержащая оператор SQL или имя хранимой процедуры.
  • CursorType — тип курсора для Recordset, который будет открыт. Тип курсора можно изменять. Возможные
    значения:

    • adOpenUnspecified(-1) — тип курсора не определён.
    • adOpenForwardOnly(0) — определяет forward-only курсор. То же, что и статический курсор, но вы
      можете прокручивать записи только вперед. Это оптимизирует выполнение, если вы должны сделать только один проход по
      Recordset’у.
    • adOpenKeyset(1) — Определяет keyset-курсор. То же, что и динамический курсор, но вы не можете видеть записи,
      добавляемые другими пользователями, хотя записи, удаляемые другими пользователями, недоступны в вашем Recordset’е.
      Изменения данных другими пользователями видимы.
    • adOpenDynamic(2) — Определяет динамический курсор. Добавления, изменения и удаления другими пользователями
      видимы; разрешены все типы движения через Recordset, исключая закладки, если провайдер их не поддерживает.
    • adOpenStatic(3) — Определяет статический курсор. Статическая копия набора записей, которую вы можете
      использовать, чтобы найти данные или генерировать отчёты. Добавления, изменения или удаления другими пользователями
      не видимы.
  • LockType — тип блокировки для Recordset, который будет открыт. Возможные значения:
    • adLockUnspecified(-1) — тип блокировки не определён.
    • adLockReadOnly(1) — только для чтения. Вы не можете изменить данные.
    • adLockPessimistic(2) — пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей.
      Запись блокируется сразу после начала редактирования и до момента сохранения записей.
    • adLockOptimistic(3) — оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент
      сохранения изменений, т.е. когда вы вызываете метод Update().
    • adLockBatchOptimistic(4) — оптимистические пакетные модификации. Требуется для пакетного режима модификации
      (отложенное сохранение записей).
  • Options — целое число (long), указывающее опции выполнения команды или открытия Recordset’а.
  • adStatus — определяет состояние события. Возможные значения — см. описание аналогичного параметра события
    ConnectComplete.
  • pCommand — объект Command, для которого применяется это событие.
  • pRecordset — объект Recordset, для которого применяется это событие.
  • pConnection — объект Connection, для которого применяется это событие.

Событие WillExecute может произойти из-за вызовов Connection.Execute, Command.Execute, или Recordset.Open. Параметр
pConnection всегда содержит ссылку на объект Connection. Если событие происходит из-за вызова Connection.Execute,
параметры pRecordset и pCommand будут установлены в Nothing. Если событие происходит из-за вызова Recordset.Open,
параметр pRecordset будет содержать ссылку на объект Recordset, а параметр pCommand будет установлен в Nothing.
Если событие происходит из-за вызова Command.Execute, параметр pCommand будет содержать ссылку на объект Command,
а параметр pRecordset будет установлен в Nothing.

ExecuteComplete(RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection) Событие происходит после завершения работы команды. Параметр RecordsAffected — целое число (long) — содержит
количество записей, которые затрагивает команда. Остальные параметры аналогичны одноимённым параметрам описанных
выше других событий. Событие ExecuteComplete может произойти вследствие вызовов Connection.Execute, Command.Execute,
Recordset.Open, Recordset.Requery или Recordset.NextRecordset.
BeginTrans()

CommitTrans()

RollbackTrans()

Вызов метода BeginTrans начинает новую транзакцию. Провайдеры, которые поддерживают вложенные транзакции,
при вызове метода BeginTrans в пределах открытой транзакции начинают новую, вложенную транзакцию. Возвращаемое
методом BeginTrans значение указывает уровень вложения: возвращаемое значение «1» указывает, что вы открыли
транзакцию верхнего уровня (то есть транзакция не вложена в пределах другой транзакции), «2» указывает, что вы
открыли транзакцию второго уровня (транзакция, вложенная в пределах транзакции верхнего уровня), и т.д.

Вызов метода CommitTrans сохраняет изменения, сделанные в пределах открытой транзакции и завершает транзакцию. Вызов
метода RollbackTrans полностью отменяет любые изменения, сделанные в пределах открытой транзакции и завершает
транзакцию. Вызов любого из этих методов в момент, когда нет никакой открытой транзакции, генерирует ошибку. Вызовы
методов CommitTrans или RollbackTrans затрагивают только последнюю открытую транзакцию; вы должны закрыть или
откатить текущую транзакцию прежде, чем разрешить любые высокоуровневые транзакции.

BeginTransComplete(TransactionLevel, pError, adStatus, pConnection)

CommitTransComplete(pError, adStatus, pConnection)

RollbackTransComplete(pError, adStatus, pConnection)

Эти события вызываются после того, как заканчивает выполняться соответствующая операция (по работе с
транзакциями) на объекте Connection.
OpenSchema(QueryType, Criteria, SchemaID) Получает информацию схемы базы данных от провайдера. Возвращает объект Recordset. Recordset будет открыт как
статический курсор только для чтения. Параметры:

  • QueryType — число, тип запроса схемы. Подробнее — см. MSDN, описание перечисления «SchemaEnum».
  • Criteria — необязательный. Массив ограничений запроса (фильтр). Подробнее — см. MSDN.
  • SchemaID — GUID для запроса схемы провайдера, не определенной спецификацией. Этот параметр требуется, если
    QueryType установлен в adSchemaProviderSpecific(-1); иначе этот параметр не используется.

Объект Error содержит информацию об ошибках доступа к данным, которые принадлежат отдельной операции провайдера. Вы
можете обратиться к свойствам объекта Error, чтобы получить информацию о каждой ошибке:

Описание
Description Содержит строку, определяющую короткое описание ошибки. Это свойство по умолчанию.
Number Содержит уникальный код, определяющий тип ошибки (целое число).
Source Идентифицирует имя объекта, который вызвал ошибку (строка).
SQLState Содержит строку из пяти символов, которая указывает код ошибки по стандарту SQL ANSI.
NativeError Содержит определённый провайдером код ошибки (целое число).

Подключаемся к базе данных и выполняем запрос с помощью объекта Connection:

Set objConn = CreateObject(«ADODB.Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

objConn.ConnectionTimeOut = 15

objConn.CommandTimeout = 30

‘Подключаемся к базе данных

objConn.Open

‘Выполняем запрос

Set objRecordset = objConn.Execute(«SELECT name, filename FROM sysdatabases»)

‘Перебираем результаты запроса

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Set objRecordset = Nothing

Работаем с ошибками провайдера:

Set objConn = CreateObject(«ADODB.Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«bla-bla-bla=bla-bla-bla;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

‘Подключаемся к базе данных

objConn.Open

‘Перебираем коллекцию ошибок

For Each E in objConn.Errors

WScript.Echo «Error.Description: » & E.Description

WScript.Echo «Error.Number: » & E.Number

WScript.Echo «Error.Source: » & E.Source

WScript.Echo «Error.SQLState: » & E.SQLState

WScript.Echo «Error.NativeError: » & E.NativeError

WScript.Echo

Next

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Пример асинхронного подключения и обработки событий:

Set objConn = WScript.CreateObject(«ADODB.Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB» & _

«;bla-bla=bla-bla» & _

«;Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

WScript.Echo «Подключаемся к базе данных (асинхронно)…»

objConn.Open ,,,16

WScript.Echo «objConn.State = » & objConn.State

WScript.Echo «Спим две секунды…»

WScript.Sleep 2000

WScript.Echo «Закончили спать.»

WScript.Echo «Закрываем соединение…»

objConn.Close

WScript.Echo «Снова подключаемся к базе данных (асинхронно)…»

objConn.Open ,,,16

WScript.Echo «objConn.State = » & objConn.State

WScript.Echo «Отменяем соединение…»

objConn.Cancel

Set objConn = Nothing

Set objRecordset = Nothing

‘************************************************

Function Connection_WillConnect(ConnectionString, UserID, _

Password, Options, adStatus, pConnection)

pConnection.ConnectionString = ConnectString

WScript.Echo «WillConnect event: pConnection.State = » & pConnection.State

End Function

Function Connection_ConnectComplete(pError, adStatus, pConnection)

WScript.Echo «ConnectComplete event: pConnection.State = » & pConnection.State

End Function

Function Connection_Disconnect(adStatus, pConnection)

WScript.Echo «Disconnect event: pConnection.State = » & pConnection.State

End Function

Function Connection_InfoMessage(pError, adStatus, pConnection)

WScript.Echo «InfoMessage event: pError.Description = » & pError.Description

End Function

Пример асинхронного выполнения запроса и обработки событий:

Set objConn = WScript.CreateObject(«ADODB.Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

‘Подключаемся к базе данных

objConn.Open

‘Выполняем запрос (асинхронно)

Set objRecordset = objConn.Execute(«SELECT name, filename FROM sysdatabases»,,16)

‘Ждём, пока выполнится запрос

While objConn.State <> 1

WScript.Sleep 500

Wend

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Set objRecordset = Nothing

‘************************************************

Function Connection_ExecuteComplete(RecordsAffected, pError, adStatus, _

pCommand, pRecordset, pConnection)

‘Перебираем результаты запроса

While Not pRecordset.EOF

strRes = vbNullString

For i=0 To pRecordset.Fields.Count-1

strRes = strRes & CStr(pRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

pRecordset.MoveNext

Wend

End Function

‘************************************************

Function Connection_WillExecute(strSource, CursorType, LockType, Options, _

adStatus, pCommand, pRecordset, pConnection)

CursorType = 2

LockType = 2

WScript.Echo «WillExecute event: CursorType = » & CursorType

WScript.Echo «WillExecute event: LockType = » & LockType

WScript.Echo «WillExecute event: Options = » & Options

End Function

Пример работы с транзакциями:

Set objConn = WScript.CreateObject(«ADODB.Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

‘Подключаемся к базе данных

objConn.Open

‘Начинаем транзакцию

objConn.BeginTrans

‘Создаём таблицу

Set objRecordset = objConn.Execute(«CREATE TABLE newTable (newColumn INT PRIMARY KEY)»)

‘Откатываем транзакцию

objConn.RollbackTrans

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Set objRecordset = Nothing

‘************************************************

Function Connection_BeginTransComplete(TransactionLevel, pError, _

adStatus, pConnection)

WScript.Echo «BeginTransComplete event: TransactionLevel = » & TransactionLevel

End Function

‘************************************************

Function Connection_CommitTransComplete(pError, adStatus, pConnection)

WScript.Echo «CommitTransComplete event»

End Function

‘************************************************

Function Connection_RollbackTransComplete(pError, adStatus, pConnection)

WScript.Echo «RollbackTransComplete event»

End Function

Пример работы с методом OpenSchema:

Set objConn = CreateObject(«ADODB.Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

‘Подключаемся к базе данных

objConn.Open

‘Получаем данные о столбцах таблиц, которые являются доступными для

‘данного пользователя. Фильтруем по базе данных «pubs», таблице «authors».

Set objRecordset = objConn.OpenSchema(4, Array(«pubs», «dbo», «authors»))

‘Перебираем результаты запроса

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

If IsNull(objRecordset.Fields(i).Value) Then

strRes = strRes & «NULL» & vbTab

Else

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

End If

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Set objRecordset = Nothing

Динамические свойства объектов

Объекты Connection, Command, Recordset, Parameter и Field имеют встроенную коллекцию Properties, содержащую объекты
Property. Коллекция имеет следующие свойства и методы:

  • Count — содержит количество объектов в коллекции.
  • Item(index) — возвращает элемент коллекции по имени или порядковому номеру.
  • Refresh() — обновляет коллекцию, чтобы отразить доступные объекты, определённые провайдером.

Объект Property представляет динамические характеристики объекта ADO, которые определяются провайдером
данных. Объект Property обладает следующими свойствами:

Описание
Name Содержит имя свойства (строка).
Type Содержит тип свойства. Может принимать значения перечисления DataTypeEnum (подробнее — см. MSDN, а также
свойство Type объекта Parameter в данной статье).
Value Содержит значение свойства.
Attributes Содержит одну или несколько характеристик свойства — сумму одной или более констант:

  • adPropNotSupported(0) — провайдер не поддерживает это свойство.
  • adPropRequired(1) — пользователь должен задать значение данного свойства перед инициализацией источника
    данных.
  • adPropOptional(2) — пользователю не требуется задавать значение данного свойства перед инициализацией источника
    данных.
  • adPropRead(512) — данное свойство доступно для чтения.
  • adPropWrite(1024) — пользователь может задать значение данному свойству.

Вы можете изменять значения (Value) этих свойств, но не их характеристики (Attributes). Вы не можете удалить такое
свойство.

Чтение коллекции Properties:

Set objConn = CreateObject(«ADODB.Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

‘Подключаемся к базе данных

objConn.Open

‘Перебираем коллекцию динамических свойств

i=1

For Each Prop in objConn.Properties

WScript.Echo i

WScript.Echo «Property.Name: » & Prop.Name

WScript.Echo «Property.Type: » & Prop.Type

WScript.Echo «Property.Value: » & Prop.Value

WScript.Echo «Property.Attributes: » & Prop.Attributes

If (Prop.Attributes And 1) = 1 Then

WScript.Echo «необходимо задать значение свойства перед инициализацией источника данных: ДА»

Else

WScript.Echo «необходимо задать значение свойства перед инициализацией источника данных: НЕТ»

End If

If (Prop.Attributes And 2) = 2 Then

WScript.Echo «не требуется задавать значение свойства перед инициализацией источника данных: ДА»

Else

WScript.Echo «не требуется задавать значение свойства перед инициализацией источника данных: НЕТ»

End If

If (Prop.Attributes And 512) = 512 Then

WScript.Echo «свойство доступно для чтения: ДА»

Else

WScript.Echo «свойство доступно для чтения: НЕТ»

End If

If (Prop.Attributes And 1024) = 1024 Then

WScript.Echo «свойство доступно для записи: ДА»

Else

WScript.Echo «свойство доступно для записи: НЕТ»

End If

WScript.Echo

i=i+1

Next

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Смена текущей базы данных с помощью коллекции Properties:

Set objConn = CreateObject(«ADODB.Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

objConn.ConnectionTimeOut = 15

objConn.CommandTimeout = 30

‘Подключаемся к базе данных

objConn.Open

‘Выполняем запрос

Set objRecordset = objConn.Execute(«SELECT name, filename FROM sysdatabases»)

‘Перебираем результаты запроса

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

WScript.Echo

‘Меняем текущую базу данных

objConn.Properties(«Current Catalog»).Value = «pubs»

‘Выполняем запрос

Set objRecordset = objConn.Execute(«SELECT au_lname, au_fname FROM authors»)

‘Перебираем результаты запроса

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

‘Закрываем соединение

objConn.Close

Set objConn = Nothing

Set objRecordset = Nothing

Объект Command

Объект Command создаётся следующим образом:


Set objComm = CreateObject(«ADODB.Command»)

После этого вы можете вызывать и использовать методы и свойства этого объекта.

Объект Command существует для задания и выполнения команд и запросов. Хотя запрос можно выполнить и без
использования объекта Command (с помощью метода Execute объекта Connection или метода Open объекта Recordset),
объект Command незаменим при выполнении запроса с параметрами и удобен в случае, когда требуется сохранить
текст команды для её повторного использования. Объект Command может быть использован как в паре с объектом
Connection, так и без него, т.к. строку подключения можно задать непосредственно в свойстве ActiveConnection
объекта Command.

Свойства и методы объекта Command:

Описание
ActiveConnection Определяет объект Connection, с которым связан данный объект Command. Значением этого свойства может быть и
строка, содержащая ту же информацию, что и свойство ConnectionString объекта Connection. Попытка выполнить метод
Execute объекта Command при незаданном свойстве ActiveConnection приведёт к ошибке. Назначение закрытого объекта
Connection в качестве значения свойства ActiveConnection также вызовет ошибку (объект должен быть открыт). Закрытие
объекта Connection, с которым связан объект Command, устанавливает свойство ActiveConnection в Nothing.
CommandText Строка, определяющая текст команды, например, оператор SQL, имя таблицы или вызов хранимой процедуры. В
зависимости от установки свойства CommandType, ADO может автоматически изменить свойство CommandText.
CommandTimeout Устанавливает или возвращает число секунд ожидания выполнения команды. Значение по умолчанию — 30. Чтение и
запись. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера.
Если время, указанное в CommandTimeout, истекает до завершения выполнения команды, происходит ошибка, и ADO отменяет
команду. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока команда не будет выполнена.
Удостоверьтесь, что используемый провайдер поддерживает свойство CommandTimeout. Установка CommandTimeout объекта
Connection никак не связана с установкой свойства CommandTimeout объекта Command.
CommandType Определяет тип команды. Возможные значения:

  • adCmdUnspecified(-1) — тип команды не определён.
  • adCmdText(1) — текстовое определение команды или хранимой процедуры.
  • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
  • adCmdStoredProc(4) — хранимая процедура.
  • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).

Если значение свойства равно adCmdUnknown (по умолчанию), команды могут выполняться медленнее, потому что
ADO должна делать запросы провайдеру, чтобы определить, является ли CommandText инструкцией SQL, хранимой процедурой
или именем таблицы. Если свойство CommandType не соответствует типу команды в свойстве CommandText, при вызове
метода Execute происходит ошибка.

Prepared Указывает, сохранить ли откомпилированную версию команды перед первым выполнением (true или false). Это может
замедлить первое выполнение команды, но ускорит любое последующее выполнение. Если провайдер не поддерживает
компиляцию команды, при установке этого свойства в true может произойти ошибка (или автоматическая установка в
false).
State Содержит состояние объекта. Только чтение. Возможные значения:

  • adStateClosed(0) — объект закрыт.
  • adStateOpen(1) — объект открыт.
  • adStateConnecting(2) — объект соединяется.
  • adStateExecuting(4) — объект выполняет команду.
  • adStateFetching(8) — объект выполняет выборку строк.

Свойство State может иметь комбинацию значений. Например, если асинхронно выполняется инструкция, это свойство будет
иметь объединенное значение adStateOpen и adStateExecuting.

Properties Содержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические
свойства объектов».
Parameters Содержит коллекцию параметров объекта (объектов Parameter). Использование метода Refresh() этой коллекции
отыскивает информацию параметров для хранимой процедуры или параметрического запроса. Некоторые провайдеры
не поддерживают хранимые процедуры или параметрические запросы; в этом случае вызов метода Refresh() вызовет
ошибку. Перед вызовом метода Refresh() вы должны правильно установить значения свойств ActiveConnection, CommandText
и CommandType. Если вы обращаетесь к коллекции перед вызовом метода Refresh(), ADO автоматически вызовет его и
заполнит коллекцию. Коллекция параметров имеет следующие свойства и методы:

  • Count — содержит количество объектов в коллекции.
  • Item(index) — возвращает элемент коллекции по имени или порядковому номеру.
  • Append(object) — добавляет предварительно созданный объект в коллекцию.
  • Delete(index) — удаляет элемент из коллекции по имени или порядковому номеру.
  • Refresh() — обновляет коллекцию, чтобы отразить доступные объекты, определённые провайдером.
NamedParameters Указывает, нужно ли передавать провайдеру имена параметров. Булево (по умолчанию — ложь). Если это свойство
установлено в True, ADO передаёт значение имени каждого параметра в коллекции параметров. Провайдер использует имя
параметра, чтобы установить соответствие параметрам в свойстве CommandText. Если это свойство установлено в ложь,
имена параметров игнорируются, и провайдер использует порядок параметров, чтобы установить соответствие параметрам
в свойстве CommandText.
Execute(RecordsAffected, Parameters, Options) Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. В основном
аналогичен методу Execute() объекта Connection (см. выше). Все параметры являются необязательными. Параметр
«Parameters» представляет собой массив параметров типа Variant, передаваемый оператору SQL (не для выходных
параметров).
Cancel() Отменяет выполнение последнего асинхронного вызова Execute(), если действие ещё не завершено.
CreateParameter(Name, Type, Direction, Size, Value) Создаёт и возвращает объект Parameter с заданными свойствами. Метод CreateParameter не добавляет созданный
параметр к коллекции Parameters. Для этого следует использовать метод Append(objParameter) этой коллекции.
Аргументы метода CreateParameter (все аргументы необязательные):

  • Name — строка, имя параметра.
  • Type — целое число (long), тип данных параметра (строка, число, булево и т.д.). Подробнее — см. в MSDN
    значения перечисления DataTypeEnum, а также свойство Type объекта Parameter в данной статье.
  • Direction — целое число (long), «направление» параметра. Возможные значения:
    • adParamUnknown(0) — направление параметра неизвестно.
    • adParamInput(1) — по умолчанию, входной параметр.
    • adParamOutput(2) — выходной параметр.
    • adParamInputOutput(3) — параметр представляет собой и входной, и выходной параметр
    • adParamReturnValue(4) — параметр представляет собой возвращаемое значение.
  • Size — целое число (long), максимальная длина параметра в символах или байтах.
  • Value — Variant, значение параметра.

Объект Parameter является членом коллекции Parameters и представляет собой параметр запроса с параметрами
(например, критерий сравнения предложения WHERE оператора SELECT) или параметр хранимой процедуры. В зависимости
от функциональных возможностей провайдера некоторые методы или свойства объекта Parameter могут быть недоступны.
Если вы знаете имена и свойства параметров, связанных с хранимой процедурой или параметризованным запросом, вы
можете использовать метод CreateParameter для создания объектов Parameter и метод Append() для добавления их к
коллекции параметров. Это позволит вам не вызывать метод Refresh() коллекции параметров, чтобы отыскать информацию
о параметрах с помощью провайдера (потенциально ресурсоёмкая операция). Свойства и методы объекта Paramrter:

Описание
Name Строка, имя параметра. Для объектов Parameter, ещё не добавленных в коллекцию параметров, это свойство доступно
для чтения и записи, в противном случае — только для чтения.
Value Variant, значение параметра. Если команда содержит параметр, свойство Value которого пусто, и вы получаете
от команды объект Recordset, вы должны закрыть Recordset перед чтением свойства Value. Иначе (для некоторых
провайдеров) свойство Value может не содержать правильное значение.
Attributes Содержит сумму одной или более характеристик объекта (целое число, long). Чтение и запись. Возможные значения:

  • adParamSigned(16) — параметр принимает значения со знаком.
  • adParamNullable(64) — параметр принимает пустые значения.
  • adParamLong(128) — параметр принимает двоичные данные.
Direction Целое число (long), «направление» параметра. Возможные значения — см. описание метода CreateParameter объекта
Command. Не все провайдеры могут определить направление параметров в их хранимых процедурах. В таких случаях вы
должны установить свойство Direction прежде, чем выполните запрос.
Precision Указывает степень точности для числовых значений. Целое число (byte), которое указывает максимальное число
цифр.
NumericScale Указывает масштаб числовых значений. Целое число (byte), которое указывает число десятичных разрядов справа
от десятичной точки.
Size Целое число (long), максимальная длина параметра в символах или байтах. Во многих случаях во избежание ошибок
крайне желательно заполнить этот параметр.
Type Целое число (long), тип данных параметра (строка, число, булево и т.д.). Подробнее — см. в MSDN значения
перечисления DataTypeEnum. Некоторые возможные значения:

  • adEmpty(0) — значение не задано.
  • adSmallInt(2) — двухбайтное целое со знаком.
  • adInteger(3) — четырёхбайтное целое со знаком.
  • adSingle(4) — число с плавающей запятой с одинарной точностью.
  • adDouble(5) — число с плавающей запятой с двойной точностью.
  • adCurrency(6) — денежная сумма с фиксированной точкой с четырьмя цифрами справа от десятичной точки
    (восьмибайтное целое число со знаком).
  • adError(10) — 32-битный код ошибки.
  • adBoolean(11) — булево значение.
  • adDecimal(14) — числовое значение с фиксированной точностью и масштабом.
  • adTinyInt(16) — однобайтное целое со знаком.
  • adUnsignedTinyInt(17) — однобайтное целое без знака.
  • adUnsignedSmallInt(18) — двухбайтное целое без знака.
  • adUnsignedInt(19) — четырёхбайтное целое без знака.
  • adBigInt(20) — восьмибайтное целое со знаком.
  • adUnsignedBigInt(21) — восьмибайтное целое без знака.
  • adBinary(128) — двоичное значение.
  • adChar(129) — строковое значение.
  • adUserDefined(132) — определяемая пользователем переменная.
  • adDBDate(133) — дата формата yyyymmdd.
  • adDBTime(134) — время формата hhmmss.
  • adDBTimeStamp(135) — дата и время формата yyyymmddhhmmss плюс тысячные доли секунды.
AppendChunk(Data) Добавляет данные в конец большого текста или двоичных данных. Параметр Data имеет тип Variant. В ситуациях,
когда системная память ограничена, вы можете использовать метод AppendChunk для управления большими значениями по
частям. Первый вызов AppendChunk() перезаписывает новые данные поверх любых существующих данных. Последующие вызовы
AppendChunk() добавляют данные к существующим данным параметра. Вызов AppendChunk() с пустым значением удаляет все
данные параметра.
Properties Содержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические
свойства объектов».

Пример «независимого» использования объекта Command:

Set objComm = CreateObject(«ADODB.Command»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objComm.ActiveConnection = ConnectString

objComm.CommandText = «SELECT name, filename FROM sysdatabases»

Set objRecordset = objComm.Execute

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

Set objComm = Nothing

Set objRecordset = Nothing

Пример использования объекта Command в паре с объектом Connection:

Set objConn = CreateObject(«ADODB.Connection»)

Set objComm = CreateObject(«ADODB.Command»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objConn.ConnectionString = ConnectString

objConn.Open

objComm.ActiveConnection = objConn

objComm.CommandText = «SELECT name, filename FROM sysdatabases»

Set objRecordset = objComm.Execute

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

objConn.Close

Set objConn = Nothing

Set objComm = Nothing

Set objRecordset = Nothing

Пример получения информации о параметрах хранимой процедуры:

Set objComm = CreateObject(«ADODB.Command»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objComm.ActiveConnection = ConnectString

‘получаем информацию о параметрах хранимой процедуры «sp_adduser»

objComm.CommandText = «sp_adduser»

objComm.CommandType = 4

For Each Param In objComm.Parameters

WScript.Echo «Name = » & Param.Name

WScript.Echo «Attributes = » & Param.Attributes

WScript.Echo «Direction = » & Param.Direction

WScript.Echo «Size = » & Param.Size

WScript.Echo «Type = » & Param.Type

WScript.Echo

Next

Set objComm = Nothing

Пример исполнения хранимой процедуры с параметрами — упаковка файла в CAB-архив средствами SQL-сервера:

Set objComm = CreateObject(«ADODB.Command»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objComm.ActiveConnection = ConnectString

‘упаковка файла «C:boot.ini» в cab-архив

objComm.CommandText = «xp_makecab»

objComm.CommandType = 4

objComm.Parameters.Append objComm.CreateParameter(,129,,11,»C:boot.cab»)

objComm.Parameters.Append objComm.CreateParameter(,129,,5,»mszip»)

objComm.Parameters.Append objComm.CreateParameter(,17,,,0)

objComm.Parameters.Append objComm.CreateParameter(,129,,11,»C:boot.ini»)

objComm.Execute

Set Param = Nothing

Set objComm = Nothing

Объект Recordset

Объект Recordset создаётся следующим образом:


Set objConn = CreateObject(«ADODB.Recordset»)

После этого вы можете вызывать и использовать методы и свойства этого объекта. Объект Recordset состоит из записей
и полей. Не все свойства объекта поддерживаются всеми провайдерами.

При открытии набора записей (Recordset’а) вы должны определить тип используемого курсора. В библиотеке ADO определены
четыре типа курсоров:

  • Динамический курсор (Dynamic cursor). Позволяет видеть данные, добавленные, изменённые и удалённые другими
    пользователями. Допускает все типы переходов по набору записей, а также использование закладок, если это позволяет
    провайдер.
  • Курсор набора данных (Keyset cursor). Позволяет видеть данные, изменённые другими пользователями. Допускает все
    типы переходов по набору записей, а также использование закладок, если это позволяет провайдер.
  • Статический курсор (Static cursor). Позволяет получить копию набора записей для создания отчёта. Допускает все
    типы переходов по набору записей, а также использование закладок, если это позволяет провайдер.
  • Курсор Forward-only (Forward-only cursor). Аналогичен предыдущему, но позволяет проходить через набор записей
    только вперёд. Обеспечивает максимальную производительность.

Чтобы открыть набор записей в одном из рассмотренных четырёх режимов, необходимо задать соответствующее значение
свойству CursorType или параметру CursorType метода Open. Не все провайдеры поддерживают все типы курсоров. По
умолчанию используется курсор типа Forward-only.

При открытии объекта Recordset текущей записью становится первая запись, а свойства EOF и BOF получают значение
False.

Объект Recordset предусматривает два типа обновлений: немедленное и пакетное. В первом случае все изменения данных
немедленно записываются в базу после вызова метода Update(). Во втором случае (если тип блокировки для Recordset —
adLockBatchOptimistic(4), режим обновления будет пакетным) несколько обновлённых строк может помещаться в локальный
буфер, после чего реализуется одновременное обновление нескольких полей источника данных с помощью метода
UpdateBatch().

Свойства и методы объекта Recordset:

Описание
ActiveConnection Содержит объект Connection, к которому привязан данный Recordset, или строку параметров подключения
(ConnectionString).
ActiveCommand Содержит объект Command, который породил данный Recordset. Только чтение. Если объект Command не использовался,
пусто.
Source Содержит источник данных объекта Recordset. Это ссылка на объект Command, оператор SQL, имя таблицы или
хранимой процедуры. Свойству можно задать значение только при закрытом в данный момент объекте Recordset.
Filter Содержит фильтр данных. Может принимать значения трёх типов:

  • Строка, составленная из одного или более индивидуальных предложений с операторами AND или OR, например
    «LastName = ‘Smith’ AND FirstName = ‘John'».
  • Массив закладок — уникальных значений Bookmark.
  • Одно из значений перечисления FilterGroupEnum (подробнее — см. MSDN).

Используйте это свойство для выборочного сканирования объекта Recordset. Установка свойства переместит курсор на
первую запись, которая удовлетворяет фильтру.

CursorType Содержит тип курсора. Может быть изменено только до открытия объекта Recordset. Возможные значения — см.
описание аргумента CursorType события WillExecute объекта Connection.
LockType Содержит тип блокировки для объекта Recordset. Доступно для записи при закрытом объекте Recordset. Возможные
значения — см. описание аргумента LockType события WillExecute объекта Connection.
MaxRecords Используйте это свойство, чтобы ограничить количество записей, которые возвращает провайдер в результате
запроса к источнику данных. По умолчанию — 0, что означает, что провайдер возвращает все требуемые записи.
State Содержит состояние объекта. Возможные значения — см. описание свойства State объекта Command.
CacheSize Устанавливает количество записей объекта Recordset (обязательно больше 0), которые кэшируются (локально) в
памяти. Значение по умолчанию 1. Например, если CacheSize = 10, после открытия объекта Recordset провайдер помещает
первые 10 записей в локальную память. По мере того, как вы двигаетесь по записям объекта Recordset, провайдер
возвращает данные из локального буфера памяти. Как только вы минуете последнюю запись в кэше, провайдер помещает
следующие 10 записей из источника данных в кэш. Записи в кэше не отражают изменения, которые делают другие
пользователи. Чтобы вызвать модификацию всех кэшируемых данных, используйте метод Resync().
Open(Source, ActiveConnection, CursorType, LockType, Options) Открывает курсор. Все параметры необязательные. Параметры:

  • Source — может принимать следующие значения:
    • Ссылка на объект Command.
    • Строка с оператором SQL, именем таблицы или хранимой процедуры.
    • Имя файла с сохранённым набором записей.
  • ActiveConnection — ссылка на объект Connection или строка параметров подключения (ConnectionString).
  • CursorType — тип курсора. Возможные значения — см. описание аргумента CursorType события WillExecute объекта
    Connection.
  • LockType — тип блокировки записей. Возможные значения — см. описание аргумента LockType события WillExecute
    объекта Connection.
  • Options — целое число (long), определяющее тип команды. Возможные значения (значения можно суммировать):
    • adCmdText(1) — текстовое определение команды или хранимой процедуры.
    • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
    • adCmdStoredProc(4) — хранимая процедура.
    • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).
    • adAsyncExecute(16) — асинхронное выполнение команды. Нельзя сочетать с adCmdTableDirect(512).
    • adAsyncFetch(32) — строки, не находящиеся в кеше (размер кеша определяется свойством CacheSize), будут выбраны
      асинхронно.
    • adAsyncFetchNonBlocking(64) — никогда не осуществлять блокировки при поиске.
    • adCmdFile(256) — имя файла с сохранённым набором записей.
    • adCmdTableDirect(512) — создать SQL-запрос, который вернёт все строки указанной таблицы. Позволяет использовать
      метод Seek() в паре со свойством Index (в данной статье не рассматриваются), если используется курсор на стороне
      сервера.

По умолчанию Recordset будет открыт с курсором forward-only read-only на стороне сервера.

Close() Закрывает объект Recordset. Если вы закрываете объект Recordset в пакетном режиме модификации, все изменения
после последнего вызова UpdateBatch() будут потеряны.
RecordCount Содержит количество записей в объекте Recordset. Если провайдер или тип курсора не поддерживает данное свойство,
содержит -1.
Requery(Options) Обновляет данные в объекте Recordset путём повторного выполнения запроса. Эквивалентно вызову Close(), а затем
Open(). Возможные значения параметра Options — см. описание аргумента Options метода Open() объекта Recordset.
Resync(AffectRecords, ResyncValues) Обновляет данные в объекте Recordset. Не выполняет повторного запроса к базе данных, поэтому вновь добавленные
записи не будут видны. Если существующие записи были удалены из базы данных, произойдёт ошибка. Этот метод обычно
используют со статическим курсором или курсором типа Forward-only, чтобы видеть изменения, внесённые в базу
данных. Параметры (все параметры необязательные):

  • AffectRecords — определяет записи, на которые воздействует метод. Возможные значения:
    • adAffectCurrent(1) — обновляет только текущую запись.
    • adAffectGroup(2) — обновляет все записи, удовлетворяющие фильтру, заданному свойством Filter (например, если
      Filter — массив «закладок»).
    • adAffectAll(3) — по умолчанию. Обновляет все записи. Однако, если свойство Filter содержит строку типа
      «Author =’Smith'», то операция затронет только часть записей.
    • adAffectAllChapters(4) — обновляет все записи.
  • ResyncValues — определяет возможность перезаписи значений основной таблицы. Возможные значения:
    • adResyncAllValues(2) — по умолчанию. Осуществляет перезапись данных с отменой отложенных обновлений.
    • adResyncUnderlyingValues(1) — изменённые данные не перезаписываются и отложенные обновления не отменяются.
Save(FileName, PersistFormat) Сохраняет набор записей в файл или объект Stream (не рассматривается в данной статье). Может быть вызван только
для открытого набора записей. После вызова метода текущей становится первая строка набора записей. Параметры (все
параметры необязательные):

  • FileName — полное имя файла, в котором будет сохранён набор записей, или ссылка на объект Stream. По умолчанию
    используется свойство Source как имя файла. В принципе, сюда можно поместить ссылку на любой объект, который
    поддерживает OLE DB IStream интерфейс, например, MSXML DOM object («MSXML.DOMDocument»).
  • PersistFormat — формат, в котором будет сохранён набор записей. Возможные значения:
    • adPersistADTG(0) — по умолчанию. Формат Microsoft Advanced Data TableGram (ADTG).
    • adPersistXML(1) — специфический формат XML ADO в кодировке UTF-8.
    • adPersistProviderSpecific(2) — собственный формат провайдера.

Если установлено свойство Filter, будут сохранены только записи, удовлетворяющие фильтру.

Clone(LockType) Возвращает копию исходного объекта Recordset. Необязательный параметр LockType определяет тип блокировки:
как у оригинала или только для чтения. Допустимые значения — adLockUnspecified(-1) или adLockReadOnly(1).
Использование метода Clone() более эффективно, чем создание и открытие нового объекта Recordset с теми же
параметрами. Свойство Filter оригинала не будет применено к клону. Текущей записью только что созданного клона
будет первая. Изменения, которые вы делаете в оригинальном объекте Recordset, видимы во всех его клонах независимо
от типа курсора. Однако после того, как вы выполните метод Requery() на оригинале, клоны больше не будут
синхронизированы с оригиналом. Закрытие оригинала не закрывает копии. Значения закладок (Bookmark) взаимозаменяемы
для оригинала и клонов. Некоторые события объекта Recordset (объект Recordset имеет события — в данной статье они не
рассматриваются) будут происходить одновременно для всех клонов. Однако, поскольку текущая запись оригинала может
отличаться от текущей записи клона, события могут быть неверно обработаны для клона.
BOF
EOF
Если свойство BOF содержит True, текущая запись (курсор) находится перед первой записью в объекте Recordset.
Если свойство EOF содержит True, текущая запись (курсор) находится после последней записи в объекте Recordset. При
открытии пустого объекта Recordset оба этих свойства содержат True.
Move(NumRecords, Start) Передвигает позицию текущей записи в наборе записей. Параметры:

  • NumRecords — целое число (long), количество записей, на которое перемещается позиция. При использовании
    отрицательных значений позиция передвигается назад.
  • Start — необязательный. Может быть закладкой, с которой начинается отсчёт (см. свойство Bookmark). Другие
    возможные значения:

    • adBookmarkCurrent(0) — от текущей записи (по умолчанию).
    • adBookmarkFirst(1) — от первой записи.
    • adBookmarkLast(2) — от последней записи.

Вызов метода для пустого набора записей приведёт к ошибке.

MoveFirst()
MoveLast()
MoveNext()
MovePrevious()
Передвигают позицию текущей записи соответственно на первую, последнюю, следующую или предыдущую запись. Вызов
MoveFirst() в объекте Recordset типа forward-only может заставить провайдера заново выполнить команду, которая
сгенерировала этот Recordset.
AbsolutePosition При установке перемещает курсор на запись под данным номером. Доступно не для всех видов курсоров. Значение
в интервале с 1 по RecordCount. Свойство поддерживается не всеми провайдерами.
Bookmark Закладка в виде числа. Доступно не для всех видов курсоров. Никак не связана с номером записи. Можно при
проходе по таблице запомнить значение Bookmark во временной переменной, а затем вернуться обратно на данную
запись путём установки свойства из этой переменной. Закладка уникально идентифицирует запись. Тип данных закладки
определяется провайдером и воспринимается ADO как Variant.
PageSize Задаёт число записей на странице. По умолчанию — 10. Доступно не для всех видов курсоров.
PageCount Содержит количество страниц. Автоматически пересчитывается при изменении PageSize. Доступно не для всех видов
курсоров.
AbsolutePage При установке перемещает курсор на начало данной страницы. Доступно не для всех видов курсоров. Значение
в интервале с 1 по PageCount. Свойство поддерживается не всеми провайдерами.
Delete(AffectRecords) Удаляет текущую запись или группу записей. Если объект Recordset не допускает удаления записей, произойдёт
ошибка. Если вы находитесь в пакетном режиме модификации, фактическое удаление происходит при вызове UpdateBatch().
Вы можете отменить удаление вызовом CancelBatch(). Параметр AffectRecords (необязательный) может принимать
значения:

  • adAffectCurrent(1) — удаляется текущая запись (по умолчанию).
  • adAffectGroup(2) — удаляются все записи, удовлетворяющие фильтру, заданному свойством Filter.
AddNew(Fields, Values) Добавляет запись с указанными значениями полей в конец объекта Recordset и делает её текущей. Параметры (все
параметры необязательные):

  • Fields — имя поля или массив имён полей, для которых задаются значения.
  • Values — значение поля или массив значений полей.

Чтобы сохранить добавленную запись, необходимо вызвать метод Update(). При непосредственном режиме модификации,
если вы передаете параметры Fieldlist и Values, ADO немедленно отправляет новую запись в базу данных (вызов
Update() не нужен). В пакетном режиме модификации для сохранения записи в базе данных нужно вызвать метод
UpdateBatch().

Update(Fields, Values) Сохраняет любые изменения текущей записи объекта Recordset. Параметры (все параметры необязательные):

  • Fields — имя поля или массив имён полей, в которых следует сохранить изменения.
  • Values — значение поля или массив значений полей.

Если курсор перемещён с добавленной или изменённой записи, метод вызывается автоматически.

CancelUpdate() Отменяет любые изменения или добавления записей, проведённые до использования метода Update().
UpdateBatch(AffectRecords, PreserveStatus) Для пакетного режима модификации: записывает все изменения объекта Recordset в базу данных. Только для
курсоров Keyset или Static. Если вызов метода привёл к ошибкам из-за конфликта с основными данными (например,
запись была уже удалена другим пользователем), используйте коллекцию Errors и обрабатывайте ошибки времени
выполнения (run-time errors). Используйте свойства Filter и Status, чтобы определить местонахождение
записей с конфликтами. Чтобы отменить все ожидающие разрешения пакетные модификации, используйте метод
CancelBatch(). Порядок, в котором модификации выполняются на источнике данных, не обязательно тот же,
в котором эти модификации были выполнены в текущем объекте Recordset. Параметры (все параметры необязательные):

  • AffectRecords — указывает, какие записи затронет метод. Возможные значения — см. описание аргумента
    AffectRecords метода Resync().
  • PreserveStatus — если установлено в True, свойство Status каждой записи остаётся неизменным.
CancelBatch(AffectRecords) Отменяет любые ожидающие разрешения модификации в пакетном режиме модификации. Обработка ошибок аналогична
методу UpdateBatch(). Необязательный параметр AffectRecords указывает, какие записи затронет метод. Возможные
значения — см. описание аргумента AffectRecords метода Resync().
Status Содержит статус текущей записи относительно пакетных модификаций или других объёмных операций. Возможные
значения — см. в MSDN описание перечисления RecordStatusEnum.
SetAllRowStatus(recStatus) Устанавливает свойство Status всех записей к указанному значению. Единственное допустимое значение аргумента
recStatus — adRecNew(1) — указывает, что запись новая.
EditMode Содержит состояние редактирования текущей записи (был ли вызван метод Update() или UpdateBatch() для сохранения
изменений). Возможные значения:

  • adEditNone(0) — редактирование не проводилось.
  • adEditInProgress(1) — редактирование проводилось, но изменения не сохранены.
  • adEditAdd(2) — текущая запись добавлена с помощью метода AddNew(), но ещё не сохранена.
  • adEditDelete(4) — текущая запись была удалена.
Cancel() Отменяет последний асинхронный вызов Open(), если процесс ещё не завершён.
Fields Содержит коллекцию полей (объектов Field). Свойства и методы коллекции — см. раздел «Коллекция полей
Fields».
Properties Содержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические
свойства объектов». Доступно для открытого объекта Recordset.
CursorLocation Определяет расположение курсора (на сервере или на клиенте). Доступно для установки только до осуществления
подключения к источнику данных. Возможные значения:

  • adUseNone(1) — не использовать курсор (устарело; только ради совместимости).
  • adUseServer(2) — по умолчанию. Курсор на стороне сервера.
  • adUseClient(3) — курсор на стороне клиента. Может обеспечивать дополнительные возможности (например,
    сортировку).
Sort Строка, содержащая одно или более имен полей, по которым следует отсортировать Recordset, и порядок сортировки
(по возрастанию или по убыванию). Каждое имя поля отделяется запятой и произвольно сопровождается пробелом и
ключевым словом ASC, которое сортирует в возрастающем порядке, или DESC, которое сортирует по убыванию. По
умолчанию сортировка происходит в возрастающем порядке. Это свойство требует, чтобы свойство CursorLocation было
установлено в adUseClient(3). Это свойство имеет приоритет перед предложением ORDER BY, включенным в инструкцию
SQL. Установка свойства к пустой строке сбросит строки к их первоначальному порядку.
CompareBookmarks(Bookmark1, Bookmark2) Сравнивает относительную позицию двух закладок (см. свойство Bookmark) и возвращает результат сравнения.
Возвращаемые значения:

  • adCompareLessThan(0) — первая закладка перед второй.
  • adCompareEqual(1) — закладки равны.
  • adCompareGreaterThan(2) — первая закладка после второй.
  • adCompareNotEqual(3) — закладки не равны и не упорядочены.
  • adCompareNotComparable(4) — закладки не могут быть сравнены.

Закладки должны принадлежать одному и тому же объекту Recordset, или его клону.

NextRecordset(RecordsAffected) Используйте этот метод, чтобы получить результаты следующей команды в составной инструкции, которая возвращает
множественные результаты. Если вы открываете объект Recordset, основанный на составной инструкции (например,
«SELECT * FROM table1; SELECT * FROM table2»), использование метода Open() возвращает результаты только первой
команды. Если результатов следующей команды нет, Recordset будет установлен в Nothing. При непосредственном режиме
модификации перед использованием метода NextRecordset следует вызвать Update() или CancelUpdate(), т.к. модификации
должны быть завершены. Метод возвращает объект Recordset. В необязательном параметре RecordsAffected возвращается
число записей, затронутых операцией.
Supports(CursorOptions) Определяет, поддерживает ли текущий курсор Recordset специфический тип функциональных возможностей и возвращает
булево значение. Параметр CursorOptions состоит из одного или более значений:

  • adAddNew(0x1000400) — поддерживает метод AddNew() для добавления записей.
  • adApproxPosition(0x4000) — поддерживает свойства AbsolutePosition и AbsolutePage.
  • adBookmark(0x2000) — поддерживает свойство Bookmark.
  • adDelete(0x1000800) — поддерживает метод Delete() для удаления записей.
  • adFind(0x80000) — поддерживает метод Find() для определения местонахождения строки в Recordset.
  • adHoldRecords(0x100) — отыскивает записи или изменяет позицию, не передавая все ожидающие разрешения
    изменения.
  • adIndex(0x100000) — поддерживает свойство Index.
  • adMovePrevious(0x200) — поддерживает методы MoveFirst() и MovePrevious(), методы Move() и GetRows() для
    перемещения текущей позиции назад, не требуя закладок.
  • adNotify(0x40000) — указывает, что провайдер данных поддерживает события объекта Recordset (в данной статье
    события не рассматриваются).
  • adResync(0x20000) — поддерживает метод Resync.
  • adSeek(0x200000) — поддерживает метод Seek() для определения местонахождения строки в Recordset.
  • adUpdate(0x1008000) — поддерживает метод Update().
  • adUpdateBatch(0x10000) — поддерживает методы UpdateBatch() и CancelBatch().
Find(Criteria, SkipRows, SearchDirection, Start) Ищет в Recordset строку, которая удовлетворяет указанным критериям. Если строка найдена, она становится
текущей. Иначе, текущая позиция устанавливается на конец (или начало) Recordset. Перед вызовом метода текущая
позиция должна быть установлена. Параметры:

  • Criteria — строка, которая содержит инструкцию, определяющую имя столбца, оператор сравнения и значение. Может
    быть определено имя только единственного столбца. Оператором сравнения может быть <, >, =, <=, >=,
    <> или «like». Значение может быть строкой, числом с плавающей запятой или датой. Cтроки берутся в одинарные
    кавычки или # (знаки номера). Даты ограничиваются знаками номера и могут содержать часы, минуты и секунды, но не
    миллисекунды. Для оператора «like» значение строки может содержать звездочку (*). Звездочка может использоваться
    только в конце строки значения, или в начале и конце строки одновременно, и никак иначе. Пример: «start_date >
    #7/22/97#».
  • SkipRows — необязательный. Целое число (long), значение по умолчанию которого является нулевым, которое
    определяет смещение строки от текущей строки или закладки Start (см. ниже), чтобы начать поиск. По умолчанию, поиск
    начнётся с текущей строки.
  • SearchDirection — необязательный. Определяет направление поиска. Возможные значения:
    • adSearchBackward(-1) — Поиск назад. Если соответствие не найдено, указатель текущей записи будет установлен в
      BOF.
    • adSearchForward(1) — Поиск вперёд. Если соответствие не найдено, указатель текущей записи будет установлен в
      EOF.
  • Start — необязательный. Закладка (Bookmark), которая используется как начальная позиция для поиска.
GetRows(Rows, Start, Fields) Помещает записи объекта Recordset в массив. Возвращает двумерный массив. Параметры:

  • Rows — необязательный. Единственно возможное значение и значение по умолчанию — adGetRowsRest(-1). Отыскивает
    все записи Recordset от текущей позиции или от закладки, указанной параметром Start.
  • Start — необязательный. Закладка (Bookmark), которая используется как начальная позиция для поиска.
  • Fields — необязательный. Имя или порядковая позиция поля, либо массив имен или порядковых позиций полей. ADO
    возвращает только данные из этих полей.
GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr) Возвращает Recordset как строку. Параметры:

  • StringFormat — формат строки. Единственно возможное значение — adClipString(2) — разграничивает строки, столбцы
    и пустые значения с помощью параметров RowDelimiter, ColumnDelimiter и NullExpr.
  • NumRows — необязательный. Число строк, которые будут возвращены из Recordset. Если NumRows не определён или
    превышает общее количество строк в Recordset, будут возвращены все строки.
  • ColumnDelimiter — необязательный. Разделитель столбцов. Если не определено, cимвол табуляции.
  • RowDelimiter — необязательный. Разделитель строк. Если не определено, символ возврата каретки.
  • NullExpr — необязательный. Выражение, используемое вместо пустого значения (Null). Если не определено, пустая
    строка.

Коллекция полей Fields

Коллекция полей Fields является свойством объекта Recordset и поддерживает следующие свойства и методы:

Описание
Count Содержит количество объектов в коллекции.
Item(index) Возвращает элемент коллекции по имени или порядковому номеру.
Append(Name, Type, DefinedSize, Attrib) Создаёт и добавляет новый объект Field в коллекцию. Поля следует добавлять к закрытому Recordset’у. Параметры:

  • Name — уникальное имя поля.
  • Type — тип поля. Возможные значения — см. описание свойства «Type» объекта «Parameter».
  • DefinedSize — необязательный. Размер поля в символах или байтах.
  • Attrib — необязательный. Атрибуты поля. Возможные значения — см. в MSDN описание перечисления
    FieldAttributeEnum.
Delete(Field) Удаляет объект Field из коллекции, что соответствует удалению поля из набора записей. Параметр Field задаёт
имя объекта Field или его порядковый номер. Метод может использоваться только для закрытого набора записей.

Объект Field

Объект Field представляет собой столбец данных одного типа, т.е. поле набора записей. Кроме того, объект Field
может представлять собой поле единичной записи (объекта Record, который не рассматривается в данной статье).
Свойства объекта Field:

Описание
Name Содержит имя поля.
Value Содержит значение поля.
OriginalValue Содержит значение поля после последнего вызова Update() или UpdateBatch(). Это то значение, которое используют
методы CancelUpdate() и CancelBatch().
UnderlyingValue Содержит текущее значение поля из источника данных.
DefinedSize Содержит максимальный размер поля.
ActualSize Содержит размер фактического значения поля.
Type Содержит тип поля. Возможные значения — см. описание свойства «Type» объекта «Parameter».
Precision Содержит степень точности для числовых значений поля (максимальное количество цифр).
NumericScale Содержит масштаб числовых значений поля (количество десятичных знаков справа от запятой).
Properties Содержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические
свойства объектов».

Пример «независимого» использования объекта Recordset:

Set objRecordset = CreateObject(«ADODB.Recordset»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objRecordset.ActiveConnection = ConnectString

objRecordset.Source = «SELECT name, filename FROM sysdatabases»

objRecordset.Open

While Not objRecordset.EOF

strRes = vbNullString

For i=0 To objRecordset.Fields.Count-1

strRes = strRes & CStr(objRecordset.Fields(i).Value) & vbTab

Next

WScript.Echo Trim(strRes)

objRecordset.MoveNext

Wend

objRecordset.Close

Set objRecordset = Nothing

Сохранение данных Recordset в формате XML:

Set objRecordset = CreateObject(«ADODB.Recordset»)

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

UID = «sa» ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

ConnectString = «Provider=SQLOLEDB;» & _

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

«;UID=» & UID & «;PWD=» & PWD

objRecordset.Open «SELECT name, filename FROM sysdatabases», ConnectString

objRecordset.Save «C:test.xml», 1

objRecordset.Close

Set objRecordset = Nothing

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

замечания

Примеры, показанные в этом разделе, используют раннее связывание для ясности и требуют ссылки на библиотеку xx Library ActiveX Data ActiveX. Они могут быть преобразованы в позднее связывание, заменив строго типизированные ссылки на Object и заменяя создание объекта с помощью New с CreateObject где это необходимо.

Подключение к источнику данных

Первым шагом в доступе к источнику данных через ADO является создание объекта ADO Connection . Обычно это делается с использованием строки подключения для указания параметров источника данных, хотя также можно открыть соединение DSN, передав DSN, идентификатор пользователя и пароль в метод .Open .

Обратите внимание, что DSN не требуется для подключения к источнику данных через ADO — любой источник данных, у которого есть поставщик ODBC, может быть подключен к соответствующей строке соединения. Хотя конкретные строки подключения для разных поставщиков не входят в сферу применения этой темы, ConnectionStrings.com является отличной ссылкой для поиска соответствующей строки для вашего провайдера.

Const SomeDSN As String = "DSN=SomeDSN;Uid=UserName;Pwd=MyPassword;"

Public Sub Example()
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    If Not database Is Nothing Then
        '... Do work.
        database.Close          'Make sure to close all database connections.
    End If
End Sub

Public Function OpenDatabaseConnection(ConnString As String) As ADODB.Connection
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = New ADODB.Connection
    
    With database
        .ConnectionString = ConnString
        .ConnectionTimeout = 10             'Value is given in seconds.
        .Open
    End With
     
    OpenDatabaseConnection = database
     
    Exit Function
Handler:
    Debug.Print "Database connection failed. Check your connection string."
End Function

Обратите внимание, что пароль базы данных включен в строку соединения в приведенном выше примере только для ясности. Наилучшая практика будет диктовать не хранение паролей базы данных в коде. Это может быть выполнено путем ввода пароля через пользовательский ввод или с помощью проверки подлинности Windows.

Получение записей с запросом

Запросы могут выполняться двумя способами, оба из которых возвращают объект ADO Recordset который представляет собой набор возвращенных строк. Обратите внимание, что в обоих примерах ниже используется функция OpenDatabaseConnection из OpenDatabaseConnection « Создание соединения с источником данных» для краткости. Помните, что синтаксис SQL, переданный источнику данных, специфичен для провайдера.

Первый метод — передать инструкцию SQL непосредственно объекту Connection и является самым простым методом для выполнения простых запросов:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim records As ADODB.Recordset
        Set records = database.Execute("SELECT DISTINCT Item FROM Table")
        'Loop through the returned Recordset.
        Do While Not records.EOF      'EOF is false when there are more records.
            'Individual fields are indexed either by name or 0 based ordinal.
            'Note that this is using the default .Fields member of the Recordset.
            Debug.Print records("Item")
            'Move to the next record.
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Второй способ — создать объект Command ADO для запроса, который вы хотите выполнить. Для этого требуется немного больше кода, но это необходимо для использования параметризованных запросов:

Public Sub DisplayDistinctItems()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim query As ADODB.Command
        Set query = New ADODB.Command
        'Build the command to pass to the data source.
        With query
            .ActiveConnection = database
            .CommandText = "SELECT DISTINCT Item FROM Table"
            .CommandType = adCmdText
        End With
        Dim records As ADODB.Recordset
        'Execute the command to retrieve the recordset.
        Set records = query.Execute()

        Do While Not records.EOF
            Debug.Print records("Item")
            records.MoveNext
        Loop
    End If
CleanExit:
    If Not records Is Nothing Then records.Close
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Обратите внимание, что команды, отправленные источнику данных, уязвимы для SQL-инъекций , преднамеренных или непреднамеренных. В общем случае запросы не должны создаваться путем объединения пользовательского ввода любого типа. Вместо этого они должны быть параметризованы (см. Создание параметризованных команд ).

Выполнение нескалярных функций

Соединения ADO могут использоваться для выполнения практически любой функции базы данных, которую поставщик поддерживает через SQL. В этом случае не всегда необходимо использовать Recordset возвращаемый функцией Execute , хотя он может быть полезен для получения назначений ключей после операторов INSERT с помощью @@ Identity или аналогичных SQL-команд. Обратите внимание, что приведенный ниже пример использует функцию OpenDatabaseConnection из OpenDatabaseConnection « Создание соединения с источником данных» для краткости.

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = 42 WHERE Bar IS NULL"
            .CommandType = adCmdText
            .Execute        'We don't need the return from the DB, so ignore it.
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Обратите внимание, что команды, отправленные источнику данных, уязвимы для SQL-инъекций , преднамеренных или непреднамеренных. В общем случае SQL-запросы не должны создаваться путем объединения пользовательских данных любого типа. Вместо этого они должны быть параметризованы (см. Создание параметризованных команд ).

Создание параметризованных команд

Каждый раз, когда SQL, выполняемый через соединение ADO, должен содержать пользовательский ввод, считается оптимальной для его параметризации, чтобы минимизировать вероятность внедрения SQL. Этот метод также более читабельен, чем длинные конкатенации, и обеспечивает более надежный и поддерживаемый код (т. Е. С помощью функции, возвращающей массив Parameter ).

В стандартном синтаксисе ODBC задаются параметры ? «заполнители» в тексте запроса, а затем параметры добавляются к Command в том же порядке, что и в запросе.

Обратите внимание, что в приведенном ниже примере для краткости используется функция OpenDatabaseConnection из OpenDatabaseConnection « Создание соединения с источником данных» .

Public Sub UpdateTheFoos()
    On Error GoTo Handler
    Dim database As ADODB.Connection
    Set database = OpenDatabaseConnection(SomeDSN)
    
    If Not database Is Nothing Then
        Dim update As ADODB.Command
        Set update = New ADODB.Command
        'Build the command to pass to the data source.
        With update
            .ActiveConnection = database
            .CommandText = "UPDATE Table SET Foo = ? WHERE Bar = ?"
            .CommandType = adCmdText
            
            'Create the parameters.
            Dim fooValue As ADODB.Parameter
            Set fooValue = .CreateParameter("FooValue", adNumeric, adParamInput)
            fooValue.Value = 42
            
            Dim condition As ADODB.Parameter
            Set condition = .CreateParameter("Condition", adBSTR, adParamInput)
            condition.Value = "Bar"
            
            'Add the parameters to the Command
            .Parameters.Append fooValue
            .Parameters.Append condition
            .Execute
        End With
    End If
CleanExit:
    If Not database Is Nothing And database.State = adStateOpen Then
        database.Close
    End If
    Exit Sub
Handler:
    Debug.Print "Error " & Err.Number & ": " & Err.Description
    Resume CleanExit
End Sub

Примечание. В приведенном выше примере демонстрируется параметризованный оператор UPDATE, но любому оператору SQL могут быть заданы параметры.

Понравилась статья? Поделить с друзьями:
  • Vba excel address ячейки
  • Vba excel add form
  • Vba excel add filter
  • Vba excel activesheet свойства
  • Vba books excel 2013