In Part1 we saw the wizard method to use Database checkpoint. In Part2 we learned how to connect to a database using scripts in QTP. In this part we will see how we can retrieve data from database using scripts.
Similar to connection object, you can use ADODB.Recordset to get the recordset object.
Set MyRecordSet = CreateObject("ADODB.Recordset")
Before starting let us first understand the properties and methods of recordset object which will help further.
RecordSet Properties | Description |
---|---|
AbsolutePage | Page of current position |
AbsolutePosition | Current position |
ActiveConnection | Active Connection Object |
BOF | Beginning of File |
Bookmark | Bookmark of current position |
CacheSize | Number of records cached |
CursorLocation | Server or Client |
CursorType | Forward, Static, Dynamic, Keyset |
EOF | End of File |
EditMode | Whether or not an edit is in progress |
Filter | What kind of records to hide |
LockType | Record lock type for edits or updates |
MaxRecords | Maximum number of records to retrieve |
PageCount | Total number of pages |
PageSize | Number of records per page |
RecordCount | Total number of records |
Source | Source Command Object |
Status | Status of last action |
Recordset Methods | Description |
---|---|
AddNew | Add a new record to the RecordSet |
CancelBatch | Cancel pending batch updates |
CancelUpdate | Cancel pending update |
Clone | Copy the RecordSet |
Close | Close the RecordSet |
Delete | Delete current record |
GetRows | Retrieve multiple records |
Move | Move the record pointer to a specific record |
MoveNext | Move the record pointer to the next record |
MovePrevious | Move the record pointer to the previous record |
MoveFirst | Move the record pointer to the first record |
MoveLast | move the record pointer to the last record |
NextRecordSet | Load the next RecordSet in a multi-set query |
Open | Open the RecordSet (execute the query) |
Requery | Re-execute the last query executed |
Resync | Synchronize the data with the server |
Supports | Determine if a feature is supported by provider |
Update | Update the current record |
UpdateBatch | Update pending batched record updates |
Don’t worry if you feel this listing is too big, you may never use many of these, all this is for your reference in case you need. The most commonly used property and functions are:
- EOF – to identify no records returned. You run a query and need to determine the pointer is at last record or not or no records has been returned.
- Open – To retrieve the RecordSet we use open method which requires two arguments – connection object and command object
Syntax for this would be
<RecordSetName>.Open source, connection, cursor, lock, type
- Source – is actually the command object, it could be a sql statement
- Connection – is the connection object connecting the database
- Cursor – optional parameter to define recordset cursor type (default – Forward only)
- Lock – optional parameter to set the lock type property(default – Read Only)
- Type – optional parameter to define the command type (default unknown(8))
For example
Set oRecordSet = CreateObject("ADODB.Recordset") oRecordSet.Open “Select * from Orders”,oConnection, adOpenStatic
here oConnection is connection session to the database , we have used the static cursor which allows us to open the record in readonly mode, and not used a lock type – so it will use the default lock.
a generic function for retrieving the recordset would be like
Function 2
Function getRecordset(strSQL) Dim oConnection, oRecordSet Set oConnection = CreateObject("ADODB.Connection") Set oRecordSet = CreateObject("ADODB.Recordset") oConnection = getConnection() oRecordSet.Open strSQL,oConnection, adOpenStatic Set getRecordset = oRecordSet End Function
Let us now try this to retrieve data from Orders table of Flight application database.
To get the customer name from table Orders with Order Number 1 will need to execute the query –
S
Select * from Orders where Order_Number = 1
Example 2
Set MyRecordset = getRecordset("Select * from Orders where Order_Number = 1") If MyRecordset.EOF <> True Then msgbox MyRecordset.Fields("Customer_Name").Value End If
Result
In this example we are using the function 2 by passing the required query and we get the result recordset in the MyRecordset object. Then we are checking whether there is some records there or not using the EOF property.
In the same way we can use other methods as well for different operations
Move to next record – We have a method MoveNext which we can use in a loop until the max record in recordset. Below example illustrates the use of this method to get all the records from table
Example 3
Set MyRecordset = getRecordset("Select * from Orders") Do while MyRecordset.EOF <> True print MyRecordset.Fields("Customer_Name").Value MyRecordset.MoveNext Loop
Result
In the same way you can use other methods and properties of RecordSet object to achieve your task. I have listed her some example which you may encounter in your test.
Function 3 – Number of Records We can traverse through all the records in the recordset to get the
Function getRecordCount(ByRef RecordSet) Dim Rows Rows = 0 RecordSet.MoveFirst Do Until RecordSet.EOF Rows = Rows+1 RecordSet.MoveNext Loop getRecordCount = Rows End Function
Function 4 – Execute Query
If you need to update, insert or delete records from database, you can use this function. But if you are working on the database for application under test, you should not perform such actions until unless it is required or a database used for QTP.
Function ExecuteQuery(strSQL) On Error Resume Next Set oConnection = CreateObject("ADODB.Connection") oConnection = getConnection() oConnection.Execute strSQL If Err.Number <> 0 then ExecuteQuery = False Exit Function End If ExecuteQuery = True End Function
Example 4 – Retrieve the column names from a table
Set MyRecordset = getRecordset("Select * from Orders") nColumns = MyRecordset.Fields.Count For n = 0 to nColumns - 1 Print MyRecordset.Fields(n).Name Next
Example 5 – Import Database Table into Data table
‘ Get recordset Set MyRecordset = getRecordset("Select * from Orders") ‘Get number of columns in table nColumns = MyRecordset.Fields.Count ‘Add a sheet in your datatable Datatable.AddSheet ("DBImport") For n = 0 to nColumns – 1 ‘Get column name ParamName = MyRecordset.Fields(n).Name ‘Add DTParameter Datatable.GetSheet("DBImport").AddParameter ParamName,"" nRow = 1 MyRecordset.MoveFirst ‘Retrieve and place data in data table Do while MyRecordset.EOF <> True Datatable.SetCurrentRow(nRow) Datatable(ParamName,"DBImport") = MyRecordset.Fields(ParamName) nRow = nRow + 1 MyRecordset.MoveNext Loop Next
Apart from this, if you need to connect to a excel file using ADODB connection, you will have to specify a different connection string, which will be like
" DRIVER={Microsoft Excel Driver (*.xls)};DBQ= FileName ;Readonly=True"
With this Saket concludes the series on Database Checkpoint and QTP.
hi, I am trying to execute a union query which has a with statement using ADODB recordset. The recordset is fetching zero results and get a EOF file error. If I manually execute the with statement, it fetches results.
My code looks as below
Hi Ankur — I am working on simple automation script to compare two SQL output.
the challenge I am facing is, below code works [returns value] for one sql but it does not return anything for other SQL. Not sure, why it is behaving like this? Can you please suggest please?
Let me know if any additional details needed.
Is there a way to write to the DBTable properties? Change the Connection String and SQL on this object. Then tell UFT to either take a baseline db snapshot or do a compare?
When using the DB Checkpoints where is the datatable being stored? Is it in the Object Repository?
Extremely helpful content. Its great idea to have such a blog and maintain it so effectively.
Too good article and very helpful for Onjob learners like me. Thank you very much.
Thanks a lot ankur. I tried this out, this site, if you keep updating it will become a great repository for QTP for posterity ;-P
Thanks Ankur.I have one doubt.When I tried to connect Excel sheet using ” DRIVER={Microsoft Excel Driver (*.xls)};DBQ= FileName ;Readonly=True” ,getting error message ‘object cannot found’ .can you please look into .I have written below the whole code
Dim objCon, objRecordSet, strExlFile, colCount,strSQLStatement
Set objCon = CreateObject(“ADODB.Connection”)
Set objRecordSet = CreateObject(“ADODB.Recordset”)
strExlFile = “C:\Data\ExcelDB.xls”
objCon.Open “DRIVER={Microsoft Excel Driver (*.xls)};DBQ=” &strExlFile & “;Readonly=True”
strSQLStatement = “SELECT * FROM [Employee$]”
objRecordSet.Open strSQLStatement, objCon
colCount = objRecordSet.Fields.count
print colCount
am not sure who is owner of this site.In my earlier comment I mentioned Ankur.It’s written by mystake.
Thanks a lot to the blog owner!
Thanks Saju. The website is owned and managed by each single reader like you who provide their valuable encouraging comments and help us shaping things for the future.
Wonderful Information.Thanks a lot Ankur
Thanks a ton for a very nice article..
This is really very helpful yaar!!!!!!!!!
thanks a lot for ur post
Can someone help me, i’m getting the following error 800A0E7D.
am unable to pull the fields names in datatable “DBImport”
plz help me out
am gettin general run error
“datatable.getsheet(“DBImport”).addparameter ParamName,””
hi saket,
i have found this very helpful. but i am stuck at function 2 getrecordset(strsql)
the sql statement i am trying to pass to the funciton is
“select * from orders where order_number = “& ordrno
and i am getting error as wrong no.of variables.
Hi Saket,
Thank you for your posts
I have a question
I’m trying to retrieve data from record set. And it’s always failed 🙁
It looks like QTP is not recognize a recordset properties (ex: EOF, Movenext, etc). But you use such properties in your examples! Could you tell me what i have to do to make it working? Maybe i need to make references to ado recordset library, but i didn’t find how to do it in QTP. Please give me advice. I’m working with MySQL and QTP 11 (trial version). Thanks, Lora
Hello,
Indeed this a very good knowledge platform for begineers like me..
Thanks a lot.
Thanks,
Honey
Thanks Archana, I am glad – this is helpful.
Thanks for the valuable input. this is really helpful for people like me , who r getting to know more about database checkpoint.
Thanks for this.. this is really useful..
However, I would like to add.. some examples of using Recordset Methos/Properties would be more helpful.. I tried to find them in QTP help.. could not find them there as well..
Thanks sc0507, I am glad, you found this useful.
Vijayendra – The Count property is the number of items in the property collection. it returns a long value. You can use this value to loop through the collection.
The Item property is used to return a specific member of the Properties Collection.
Hi Saket,
During run time I could see two properties named “Item” and “Count” of oConnection and oRecordSet objects. Can you please let me know what and how are they used for?
what a great topic and lovely description. Thank you so much as I am trying to learn QTP descriptive programming on my own ..this article is like a step by step manual to get there
I was struggling with DB connections before..looks like I am getting good at it :-))))