Difference between revisions of "Remote Data Connectivity"
From Recital Documentation Wiki
Yvonnemilne (Talk | contribs) (→Navigating the Result Set) |
Yvonnemilne (Talk | contribs) (→Examples) |
||
(27 intermediate revisions by one user not shown) | |||
Line 1: | Line 1: | ||
==Remote Data Connectivity== | ==Remote Data Connectivity== | ||
===Overview of Remote Data Connectivity Functions=== | ===Overview of Remote Data Connectivity Functions=== | ||
− | + | Recital supports a collection of Visual FoxPro compatible remote data connectivity functions, which can be used to handle gateway connections to third party data sources. | |
− | + | ||
− | + | ====Connecting to a Data Source==== | |
* [[SQLCONNECT()|sqlconnect()]] - connect to a data source | * [[SQLCONNECT()|sqlconnect()]] - connect to a data source | ||
− | * [[SQLDISCONNECT()|sqldisconnect()]] - disconnect from a data source | + | |
+ | <pre> | ||
+ | numeric = sqlconnect(connection as numeric | serverdatasource as character) | ||
+ | numeric = sqlconnect(dsn as character [, user as character [, password as character [, shared as logical]]]) | ||
+ | </pre> | ||
+ | |||
+ | * [[SQLSTRINGCONNECT()|sqlstringconnect()]] - connect to a data source using a gateway connection string | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlconnect([shared as logical,] connectionstring as character [, shared as logical]) | ||
+ | </pre> | ||
+ | |||
+ | ====Disconnecting from a Data Source==== | ||
+ | * [[SQLDISCONNECT()|sqldisconnect()]] - disconnect from a data source | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqldisconnect(connection as numeric) | ||
+ | </pre> | ||
+ | |||
+ | ====Sending SQL Queries and Statements==== | ||
+ | * [[SQLPREPARE()|sqlprepare()]] - prepare an SQL statement that will be executed by the SQLEXEC() function | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlprepare(connection as numeric, sqlstatement as character [, cursor as character]) | ||
+ | </pre> | ||
+ | |||
* [[SQLEXEC()|sqlexec()]] - send an SQL statement to a data source | * [[SQLEXEC()|sqlexec()]] - send an SQL statement to a data source | ||
− | + | ||
− | * [[ | + | <pre> |
− | * [[ | + | numeric = sqlexec(connection as numeric [, sqlstatement as character [, cursor as character]]) |
+ | </pre> | ||
+ | |||
+ | * [[SQLCANCEL()|sqlcancel()]] - request that an executing SQL statement be cancelled | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlcancel(connection as numeric) | ||
+ | </pre> | ||
+ | |||
+ | ====SQL Transactions==== | ||
+ | * [[SQLCOMMIT()|sqlcommit()]] - commit a transaction | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlcommit(connection as numeric) | ||
+ | </pre> | ||
+ | |||
* [[SQLROLLBACK()|sqlrollback()]] - rollback a transaction | * [[SQLROLLBACK()|sqlrollback()]] - rollback a transaction | ||
− | * [[ | + | |
− | * [[ | + | <pre> |
+ | numeric = sqlrollback(connection as numeric) | ||
+ | </pre> | ||
+ | |||
+ | ====Processing Result Sets==== | ||
+ | * [[SQLMORERESULTS()|sqlmoreresult()]] - check if more results sets are available and if so, copy next results set to a cursor | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlmoreresults(connection as numeric) | ||
+ | </pre> | ||
+ | |||
+ | ====Getting and Setting Properties==== | ||
+ | * [[SQLGETPROP()|sqlgetprop()]] - query property settings for a connection or the environment | ||
+ | |||
+ | <pre> | ||
+ | expression = sqlgetprop(connection as numeric, setting as character) | ||
+ | </pre> | ||
+ | |||
+ | * [[SQLSETPROP()|sqlsetprop()]] - set property settings for a connection | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqlsetprop(connection as numeric, setting as character [, value as expression]) | ||
+ | </pre> | ||
+ | |||
+ | ====Getting Table and Field Information==== | ||
* [[SQLTABLES()|sqltables()]] - store data source table names to a table | * [[SQLTABLES()|sqltables()]] - store data source table names to a table | ||
+ | |||
+ | <pre> | ||
+ | numeric = sqltables(connection as numeric [, tabletypes as character] [, cursorname as character]) | ||
+ | </pre> | ||
+ | |||
+ | * [[SQLCOLUMNS()|sqlcolumns()]] - store column information to a cursor | ||
+ | |||
+ | <pre> | ||
+ | logical | numeric = sqlcolumns(connection as numeric, tablename as character [, format as character] [, cursorname as character]) | ||
+ | </pre> | ||
+ | |||
+ | ====Examples==== | ||
+ | <code lang="recital"> | ||
+ | // sqlstringconnect() - connect to a data source using a gateway connection string | ||
+ | nStatHand=sqlstringconnect("recital@localhost:user/password-southwind.tcpip",.T.) | ||
+ | if nStatHand < 1 | ||
+ | messagebox("Cannot make connection", 16, "SQL Connect Error") | ||
+ | else | ||
+ | messagebox("Connection made", 48, "SQL Connect Message") | ||
+ | store "00010" to myVar | ||
+ | // sqlprepare() - prepare an SQL statement that will be executed by the sqlexec() function | ||
+ | sqlprepare(nStatHand, "select * from example where account_no = ?myVar", "restab") | ||
+ | // sqlexec() - send an SQL statement | ||
+ | sqlexec(nStatHand) | ||
+ | display all | ||
+ | |||
+ | // sqlsetprop() - set property settings for a connection | ||
+ | nSetEnd = sqlsetprop(nStatHand,"Transactions",2) | ||
+ | if nSetEnd = 1 | ||
+ | messagebox("Manual Transactions enabled",0,"Transaction") | ||
+ | else | ||
+ | if messagebox("Unable to enable Manual Transactions, continue?",36,"Transaction") = 6 | ||
+ | // sqldisconnect() - disconnect from a data source | ||
+ | sqldisconnect(nStatHand) | ||
+ | return | ||
+ | endif | ||
+ | endif | ||
+ | // sqlexec() - send an SQL statement | ||
+ | nRet=sqlexec(nStatHand,"insert into example (account_no, title, last_name, first_name,; | ||
+ | initial, street, city, state, zip, limit, start_date) values ('00200', 'Mr', 'Doe',; | ||
+ | 'John', 'L', '1 High Street', 'Beverly', 'MA', '01916', 12000, {05/12/2010})") | ||
+ | // sqlgetprop() - query property settings for a connection | ||
+ | if sqlgetprop(nStatHand, "Transactions") = 2 | ||
+ | if messagebox("Commit Insert?",36,"Transaction") = 6 | ||
+ | // sqlcommit() - commit a transaction | ||
+ | messagebox("sqlcommit() returned " + etos(sqlcommit(nStatHand)),0,"Transaction") | ||
+ | else | ||
+ | // sqlrollback() - rollback a transaction | ||
+ | messagebox("sqlrollback() returned " + etos(sqlrollback(nStatHand)),0,"Transaction") | ||
+ | endif | ||
+ | endif | ||
+ | // sqlsetprop() - set property settings for a connection | ||
+ | nSetEnd = sqlsetprop(nStatHand, "Transactions",1) | ||
+ | if nSetEnd = 1 | ||
+ | messagebox("Automatic Transactions enabled",0,"Transaction") | ||
+ | else | ||
+ | messagebox("Unable to enable Automatic Transactions.",0,"Transaction") | ||
+ | endif | ||
+ | endif | ||
+ | // sqldisconnect() - disconnect from a data source | ||
+ | sqldisconnect(nStatHand) | ||
+ | </code> | ||
===Overview of Recital Data Objects (RDO)=== | ===Overview of Recital Data Objects (RDO)=== | ||
Line 114: | Line 240: | ||
<pre> | <pre> | ||
numeric = rdo_field_seek(resultset as object, column as numeric) | numeric = rdo_field_seek(resultset as object, column as numeric) | ||
+ | </pre> | ||
+ | |||
+ | * [[RDO_RESULT()|rdo_result()]] - return the value of a field in a result set | ||
+ | |||
+ | <pre> | ||
+ | string = rdo_result(resultset as object, row as numeric, column as string) | ||
</pre> | </pre> | ||
=====Result Set Information===== | =====Result Set Information===== | ||
* [[RDO_FETCH_FIELD()|rdo_fetch_field()]] - return an object containing information about a field from a result set | * [[RDO_FETCH_FIELD()|rdo_fetch_field()]] - return an object containing information about a field from a result set | ||
+ | |||
+ | <pre> | ||
+ | object = rdo_fetch_field(resultset as object, field as numeric) | ||
+ | </pre> | ||
+ | |||
* [[RDO_FETCH_LENGTHS()|rdo_fetch_lengths()]] - return the length of the contents of each field in a result set | * [[RDO_FETCH_LENGTHS()|rdo_fetch_lengths()]] - return the length of the contents of each field in a result set | ||
+ | |||
+ | <pre> | ||
+ | object = rdo_fetch_lengths(resultset as object) | ||
+ | </pre> | ||
+ | |||
* [[RDO_NUM_FIELDS()|rdo_num_fields()]] - return the number of fields in a result set | * [[RDO_NUM_FIELDS()|rdo_num_fields()]] - return the number of fields in a result set | ||
+ | |||
+ | <pre> | ||
+ | numeric = rdo_num_fields(resultset as object) | ||
+ | </pre> | ||
+ | |||
* [[RDO_NUM_ROWS()|rdo_num_rows()]] - return the number of rows in a result set | * [[RDO_NUM_ROWS()|rdo_num_rows()]] - return the number of rows in a result set | ||
+ | |||
+ | <pre> | ||
+ | numeric = rdo_num_rows(resultset as object) | ||
+ | </pre> | ||
=====Field Information===== | =====Field Information===== | ||
* [[RDO_FIELD_FLAGS()|rdo_field_flags()]] - return the flags of a field in a result set | * [[RDO_FIELD_FLAGS()|rdo_field_flags()]] - return the flags of a field in a result set | ||
+ | |||
+ | <pre> | ||
+ | string = rdo_field_flags(resultset as object, column as numeric) | ||
+ | </pre> | ||
+ | |||
* [[RDO_FIELD_LEN()|rdo_field_len()]] - return the length of a field in a result set | * [[RDO_FIELD_LEN()|rdo_field_len()]] - return the length of a field in a result set | ||
+ | |||
+ | <pre> | ||
+ | numeric = rdo_field_len(resultset as object, column as numeric) | ||
+ | </pre> | ||
+ | |||
* [[RDO_FIELD_NAME()|rdo_field_name()]] - return the name of a field in a result set | * [[RDO_FIELD_NAME()|rdo_field_name()]] - return the name of a field in a result set | ||
+ | |||
+ | <pre> | ||
+ | string = rdo_field_name(resultset as object, column as numeric) | ||
+ | </pre> | ||
+ | |||
* [[RDO_FIELD_TYPE()|rdo_field_type()]] - return the type of a field in a result set | * [[RDO_FIELD_TYPE()|rdo_field_type()]] - return the type of a field in a result set | ||
− | + | ||
+ | <pre> | ||
+ | string = rdo_field_type(resultset as object, column as numeric) | ||
+ | </pre> | ||
+ | |||
* [[RDO_FIELD_TABLE()|rdo_field_table()]] - return the name of the table where a specified field is located | * [[RDO_FIELD_TABLE()|rdo_field_table()]] - return the name of the table where a specified field is located | ||
+ | |||
+ | <pre> | ||
+ | string = rdo_field_table(resultset as object, column as numeric) | ||
+ | </pre> | ||
=====Freeing Memory===== | =====Freeing Memory===== | ||
Line 194: | Line 368: | ||
====Examples==== | ====Examples==== | ||
+ | <code lang="recital"> | ||
+ | // Error trapping routine | ||
+ | function errorfunc | ||
+ | parameter p_line | ||
+ | echo p_line, "\n" | ||
+ | // rdo_error() - return the error description of the last Recital error | ||
+ | echo "Error Message: " + rdo_error(), "\n" | ||
+ | // rdo_errno() - return the number of the last error | ||
+ | echo "Error Number : " + rdo_errno(), "\n" | ||
+ | endfunc | ||
+ | |||
+ | // rdo_connect() - connect to a data source | ||
+ | echo time() + " RDO_CONNECT() with database", "\n" | ||
+ | conn = rdo_connect("recital","?","?","?", "southwind") | ||
+ | if conn > -1 | ||
+ | // rdo_close() - close a data source opened with rdo_connect() | ||
+ | echo time() + " RDO_CLOSE()", "\n" | ||
+ | rdo_close(conn) | ||
+ | else | ||
+ | echo "rdo_connect failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | endif | ||
+ | |||
+ | echo time() + " RDO_CONNECT()", "\n" | ||
+ | conn = rdo_connect("recital","?","?","?") | ||
+ | if conn > -1 | ||
+ | // rdo_list_dbs() - list the available databases | ||
+ | echo time() + " RDO_LIST_DBS()", "\n" | ||
+ | dbs = rdo_list_dbs() | ||
+ | // rdo_select_db() - set the active database | ||
+ | echo time() + " RDO_SELECT_DB()", "\n" | ||
+ | foreach dbs as currdb | ||
+ | rdo_select_db(currdb, conn) | ||
+ | // rdo_query() - return a result set object for a SELECT query | ||
+ | echo time() + " RDO_QUERY()", "\n" | ||
+ | res = rdo_query("select database() as db from sysresultset") | ||
+ | // rdo_result() - return the value of a field in a result set | ||
+ | echo time() + " RDO_RESULT()", "\n" | ||
+ | echo "Current database: " + rdo_result(res,0,"db"), "\n" | ||
+ | endfor | ||
+ | rdo_close(conn) | ||
+ | else | ||
+ | echo "rdo_connect failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | endif | ||
+ | |||
+ | // rdo_connect() - connect to a data source | ||
+ | echo time() + " RDO_CONNECT() with database", "\n" | ||
+ | conn = rdo_connect("recital","?","?","?", "southwind") | ||
+ | if conn > -1 | ||
+ | // rdo_exec() - execute a non-SELECT statement | ||
+ | echo time() + " RDO_EXEC()", "\n" | ||
+ | if rdo_exec("copy database southwind to rdoreg if exists",conn) > 0 | ||
+ | echo "rdo_exec failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | rdo_close(conn) | ||
+ | return | ||
+ | else | ||
+ | // rdo_exec() - execute a non-SELECT statement | ||
+ | echo time() + " RDO_EXEC()", "\n" | ||
+ | if rdo_exec("update orders set employeeid = 2 where employeeid = 1") > 0 | ||
+ | echo "rdo_exec failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | endif | ||
+ | |||
+ | // rdo_affected_rows() - return the number of rows affected | ||
+ | echo time() + " RDO_AFFECTED_ROWS()", "\n" | ||
+ | echo "Affected rows: " + tostring(rdo_affected_rows()), "\n" | ||
+ | |||
+ | endif | ||
+ | rdo_close(conn) | ||
+ | else | ||
+ | echo "rdo_connect failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | return | ||
+ | endif | ||
+ | |||
+ | // rdo_connect() - connect to a data source | ||
+ | echo time() + " RDO_CONNECT() with database", "\n" | ||
+ | conn = rdo_connect("recital","?","?","?", "rdoreg") | ||
+ | if conn = -1 | ||
+ | echo "rdo_connect failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | return | ||
+ | else | ||
+ | |||
+ | // rdo_unbuffered_query() - return a result set for a SELECT query | ||
+ | echo time() + " RDO_UNBUFFERED_QUERY()", "\n" | ||
+ | res1 = rdo_unbuffered_query("select * from shippers") | ||
+ | |||
+ | // rdo_info() - return information about the last query | ||
+ | echo time() + "RDO_INFO()", "\n" | ||
+ | echo "Last Query: " + rdo_info(conn), "\n" | ||
+ | |||
+ | // rdo_fetch_array() - return the results of a query as an array | ||
+ | echo time() + " RDO_FETCH_ARRAY()", "\n" | ||
+ | // rdo_real_escape_string() - escape special characters | ||
+ | echo time() + " RDO_REAL_ESCAPE_STRING()", "\n" | ||
+ | res2 =rdo_fetch_array(rdo_real_escape_string("select * from customers")) | ||
+ | |||
+ | // rdo_num_rows() - return the number of rows in a result set | ||
+ | echo time() + " RDO_NUM_ROWS()", "\n" | ||
+ | echo "Number of rows: " + tostring(rdo_num_rows(res2)), "\n" | ||
+ | |||
+ | // rdo_fetch_row() - return the next row from a result set as an object | ||
+ | echo time() + " RDO_FETCH_ROW()", "\n" | ||
+ | for i = 0 to rdo_num_rows(res2)-1 | ||
+ | arr1 = rdo_fetch_row(res2) | ||
+ | echo "Customer ID: " + arr1.customerid, "\n" | ||
+ | next | ||
+ | |||
+ | // rdo_fetch_assoc() - return the results of a query as an array | ||
+ | echo time() + " RDO_ASSOC()", "\n" | ||
+ | res3 = rdo_unbuffered_query("select * from orders") | ||
+ | |||
+ | // rdo_num_rows() - return the number of rows in a result set | ||
+ | echo time() + " RDO_NUM_ROWS()", "\n" | ||
+ | echo "Number of rows: " + tostring(rdo_num_rows(res3)), "\n" | ||
+ | |||
+ | // rdo_fetch_object() - return the next row from a result set as an object | ||
+ | echo time() + " RDO_FETCH_OBJECT()", "\n" | ||
+ | for i = 0 to rdo_num_rows(res3)-1 | ||
+ | arr2 = rdo_fetch_object(res3) | ||
+ | echo "Order ID: " + arr2.orderid, "\n" | ||
+ | next | ||
+ | |||
+ | // rdo_data_seek() - move the internal row pointer | ||
+ | echo time() + " RDO_DATA_SEEK()", "\n" | ||
+ | rdo_data_seek(res3,1) | ||
+ | arr3 = rdo_fetch_object(res3) | ||
+ | echo "Order ID: " + arr3.orderid, "\n" | ||
+ | |||
+ | // rdo_num_fields() - return the number of fields in a result set | ||
+ | echo time() + " RDO_NUM_FIELDS()", "\n" | ||
+ | echo "Number of fields: " + tostring(rdo_num_fields(res3)), "\n" | ||
+ | |||
+ | // rdo_fetch_field() - return an object with field information | ||
+ | echo time() + " RDO_FETCH_FIELD()", "\n" | ||
+ | for i = 0 to rdo_num_fields(res3)-1 | ||
+ | arr4 = rdo_fetch_field(res3, i) | ||
+ | foreach arr4 as key => value | ||
+ | echo "key=" + key + " value=" + value, "\n" | ||
+ | endfor | ||
+ | next | ||
+ | |||
+ | // rdo_fetch_lengths() - return the length of the contents of each field | ||
+ | echo time() + " RDO_FETCH_LENGTHS()", "\n" | ||
+ | arr5 = rdo_fetch_lengths(res3) | ||
+ | foreach arr5 as field => length | ||
+ | echo "field=" + field + " length=" + length, "\n" | ||
+ | endfor | ||
+ | |||
+ | // rdo_field_seek() - jump to a specified field in a result set | ||
+ | echo time() + " RDO_FIELD_SEEK()", "\n" | ||
+ | rdo_field_seek(res3, 2) | ||
+ | |||
+ | // rdo_fetch_field() - return an object with field information | ||
+ | echo time() + " RDO_FETCH_FIELD()", "\n" | ||
+ | arr6 = rdo_fetch_field(res3) | ||
+ | foreach arr6 as key => value | ||
+ | echo "key=" + key + " value=" + value, "\n" | ||
+ | endfor | ||
+ | |||
+ | // rdo_field_name() - return the name of a field in a result set | ||
+ | echo time() + " RDO_FIELD_NAME()", "\n" | ||
+ | echo "Name: " + rdo_field_name(res3,2), "\n" | ||
+ | |||
+ | // rdo_field_type() - return the type of a field in a result set | ||
+ | echo time() + " RDO_FIELD_TYPE()", "\n" | ||
+ | echo "Type: " + rdo_field_type(res3,2), "\n" | ||
+ | |||
+ | // rdo_field_len() - return the length of a field in a result set | ||
+ | echo time() + " RDO_FIELD_LEN()", "\n" | ||
+ | echo "Length: " + tostring(rdo_field_len(res3,2)), "\n" | ||
+ | |||
+ | // rdo_field_flags() - return the flags of a field in a result set | ||
+ | echo time() + " RDO_FIELD_FLAGS()", "\n" | ||
+ | echo "Flags: " + rdo_field_flags(res3,2), "\n" | ||
+ | |||
+ | // rdo_field_table() - return the name of the table where a specified field is located | ||
+ | echo time() + " RDO_FIELD_TABLE()", "\n" | ||
+ | echo "Table: " + rdo_field_table(res3,2), "\n" | ||
+ | |||
+ | // rdo_free_object() - free memory used by a result set object | ||
+ | echo time() + " RDO_FREE_OBJECT()", "\n" | ||
+ | echo "Object "+iif(rdo_free_object(res1)=0,"released","could not be released"), "\n" | ||
+ | |||
+ | // rdo_free_result() - free memory used by a result set object | ||
+ | echo time() + " RDO_FREE_OBJECT()", "\n" | ||
+ | echo "Object "+iif(rdo_free_object(res2)=0,"released","could not be released"), "\n" | ||
+ | |||
+ | // rdo_get_client_info() - return information about the client | ||
+ | echo time() + " RDO_GET_CLIENT_INFO()", "\n" | ||
+ | echo "Client: " + rdo_get_client_info(), "\n" | ||
+ | |||
+ | // rdo_get_host_info() - return information about the connection | ||
+ | echo time() + " RDO_GET_HOST_INFO()", "\n" | ||
+ | echo "Host: " + rdo_get_host_info(conn), "\n" | ||
+ | |||
+ | // rdo_ping() - check whether a server connection is active | ||
+ | echo time() + " RDO_PING()", "\n" | ||
+ | echo "Connection "+iif(rdo_ping(conn),"is active","is not active"), "\n" | ||
+ | |||
+ | // rdo_stat() - return the current system status of Recital | ||
+ | echo time() + " RDO_STAT()", "\n" | ||
+ | echo "Connection "+iif(rdo_stat(conn)>0,"is active","is not active"), "\n" | ||
+ | |||
+ | // rdo_thread_id() - return the current thread ID | ||
+ | echo time() + " RDO_THREAD_ID()", "\n" | ||
+ | echo "Current thread ID: " + tostring(rdo_thread_id()), "\n" | ||
+ | |||
+ | // rdo_close() - close a data source opened with rdo_connect() | ||
+ | echo time() + " RDO_CLOSE()", "\n" | ||
+ | rdo_close(conn) | ||
+ | endif | ||
+ | // rdo_connect() - connect to a data source | ||
+ | echo time() + " RDO_CONNECT()", "\n" | ||
+ | conn = rdo_connect("recital","?","?","?") | ||
+ | if conn > -1 | ||
+ | // rdo_exec() - execute a non-SELECT statement | ||
+ | echo time() + " RDO_EXEC()", "\n" | ||
+ | if rdo_exec("drop database rdoreg",conn) > 0 | ||
+ | echo "rdo_exec failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | endif | ||
+ | |||
+ | // rdo_close() - close a data source opened with rdo_connect() | ||
+ | echo time() + " RDO_CLOSE()", "\n" | ||
+ | rdo_close(conn) | ||
+ | else | ||
+ | echo "rdo_connect failed", "\n" | ||
+ | errorfunc(message(1)) | ||
+ | endif | ||
+ | </code> | ||
===Using Recital Client/Server === | ===Using Recital Client/Server === | ||
Line 199: | Line 607: | ||
===Using Recital with PostgreSQL=== | ===Using Recital with PostgreSQL=== | ||
===Using Recital with Oracle=== | ===Using Recital with Oracle=== | ||
+ | Requirements: | ||
+ | * Make sure the Oracle environment (ORACLE_HOME, ORACLE_SID etc.) is set up before starting the Recital Server. If not, you will see the error ORA-01019. A call to the Oracle environment setup script can be added to the /etc/init.d/recital script if your Recital Server is set to run on startup. | ||
+ | * The Recital Oracle Gateway requires the Oracle libclntsh.so shared library. If this file is unknown to ld.so.conf, add it using the ldconfig command. | ||
+ | |||
===Using Recital with DB2=== | ===Using Recital with DB2=== |
Latest revision as of 15:19, 27 August 2010
Contents
- 1 Remote Data Connectivity
- 1.1 Overview of Remote Data Connectivity Functions
- 1.2 Overview of Recital Data Objects (RDO)
- 1.3 Using Recital Client/Server
- 1.4 Using Recital with MySQL
- 1.5 Using Recital with PostgreSQL
- 1.6 Using Recital with Oracle
- 1.7 Using Recital with DB2
Remote Data Connectivity
Overview of Remote Data Connectivity Functions
Recital supports a collection of Visual FoxPro compatible remote data connectivity functions, which can be used to handle gateway connections to third party data sources.
Connecting to a Data Source
- sqlconnect() - connect to a data source
numeric = sqlconnect(connection as numeric | serverdatasource as character) numeric = sqlconnect(dsn as character [, user as character [, password as character [, shared as logical]]])
- sqlstringconnect() - connect to a data source using a gateway connection string
numeric = sqlconnect([shared as logical,] connectionstring as character [, shared as logical])
Disconnecting from a Data Source
- sqldisconnect() - disconnect from a data source
numeric = sqldisconnect(connection as numeric)
Sending SQL Queries and Statements
- sqlprepare() - prepare an SQL statement that will be executed by the SQLEXEC() function
numeric = sqlprepare(connection as numeric, sqlstatement as character [, cursor as character])
- sqlexec() - send an SQL statement to a data source
numeric = sqlexec(connection as numeric [, sqlstatement as character [, cursor as character]])
- sqlcancel() - request that an executing SQL statement be cancelled
numeric = sqlcancel(connection as numeric)
SQL Transactions
- sqlcommit() - commit a transaction
numeric = sqlcommit(connection as numeric)
- sqlrollback() - rollback a transaction
numeric = sqlrollback(connection as numeric)
Processing Result Sets
- sqlmoreresult() - check if more results sets are available and if so, copy next results set to a cursor
numeric = sqlmoreresults(connection as numeric)
Getting and Setting Properties
- sqlgetprop() - query property settings for a connection or the environment
expression = sqlgetprop(connection as numeric, setting as character)
- sqlsetprop() - set property settings for a connection
numeric = sqlsetprop(connection as numeric, setting as character [, value as expression])
Getting Table and Field Information
- sqltables() - store data source table names to a table
numeric = sqltables(connection as numeric [, tabletypes as character] [, cursorname as character])
- sqlcolumns() - store column information to a cursor
logical | numeric = sqlcolumns(connection as numeric, tablename as character [, format as character] [, cursorname as character])
Examples
// sqlstringconnect() - connect to a data source using a gateway connection string nStatHand=sqlstringconnect("recital@localhost:user/password-southwind.tcpip",.T.) if nStatHand < 1 messagebox("Cannot make connection", 16, "SQL Connect Error") else messagebox("Connection made", 48, "SQL Connect Message") store "00010" to myVar // sqlprepare() - prepare an SQL statement that will be executed by the sqlexec() function sqlprepare(nStatHand, "select * from example where account_no = ?myVar", "restab") // sqlexec() - send an SQL statement sqlexec(nStatHand) display all // sqlsetprop() - set property settings for a connection nSetEnd = sqlsetprop(nStatHand,"Transactions",2) if nSetEnd = 1 messagebox("Manual Transactions enabled",0,"Transaction") else if messagebox("Unable to enable Manual Transactions, continue?",36,"Transaction") = 6 // sqldisconnect() - disconnect from a data source sqldisconnect(nStatHand) return endif endif // sqlexec() - send an SQL statement nRet=sqlexec(nStatHand,"insert into example (account_no, title, last_name, first_name,; initial, street, city, state, zip, limit, start_date) values ('00200', 'Mr', 'Doe',; 'John', 'L', '1 High Street', 'Beverly', 'MA', '01916', 12000, {05/12/2010})") // sqlgetprop() - query property settings for a connection if sqlgetprop(nStatHand, "Transactions") = 2 if messagebox("Commit Insert?",36,"Transaction") = 6 // sqlcommit() - commit a transaction messagebox("sqlcommit() returned " + etos(sqlcommit(nStatHand)),0,"Transaction") else // sqlrollback() - rollback a transaction messagebox("sqlrollback() returned " + etos(sqlrollback(nStatHand)),0,"Transaction") endif endif // sqlsetprop() - set property settings for a connection nSetEnd = sqlsetprop(nStatHand, "Transactions",1) if nSetEnd = 1 messagebox("Automatic Transactions enabled",0,"Transaction") else messagebox("Unable to enable Automatic Transactions.",0,"Transaction") endif endif // sqldisconnect() - disconnect from a data source sqldisconnect(nStatHand)
Overview of Recital Data Objects (RDO)
The RDO functions can be used for data access for both remote third-party/Recital and local Recital data sources. The functions allow a connection to be made to the data, SQL queries to be sent and the results to be loaded into a result set object for further processing.
Each MySQL compatible RDO function also has a MySQL-named equivalent for ease of use, e.g. rdo_connect() and mysql_connect() are synonyms.
Connecting to a Data Source
- rdo_connect() - connect to a data source
numeric = rdo_connect(servertype as character, hostname_or_ip as character, account as character, password as character [, database as character])
- rdo_select_db() - set the active database for a data source connection
numeric = rdo_select_db(database as character [, connection as numeric])
Disconnecting from a Data Source
- rdo_close() - close a data source opened with rdo_connect()
numeric = rdo_close(connection as numeric)
Sending SQL Queries and Statements
- rdo_exec() - execute a non-SELECT statement
numeric = rdo_exec(statement as string [, connection as numeric])
- rdo_query() - return a result set object for a SELECT query
object = rdo_query(query as string [, connection as numeric])
- rdo_unbuffered_query() - return a result set object for a SELECT query
object = rdo_unbuffered_query(query as string [, connection as numeric])
- rdo_fetch_array() - return the results of a query as an associative array
array = rdo_fetch_array(query as string)
- rdo_fetch_assoc() - return the results of a query as an associative array
array = rdo_fetch_assoc(query as string)
- rdo_real_escape_string() - escape special characters in a string for use in an SQL statement
string = rdo_real_escape_string(query as string [, connection as numeric])
- rdo_affected_rows() - return the number of rows affected by the last operation
numeric = rdo_affected_rows()
- rdo_info() - return information about the last query
string = rdo_info()
Processing Result Sets
- rdo_fetch_row() - return the next row from a result set as an object
object = rdo_fetch_row(resultset as object)
- rdo_fetch_object() - return the next row from a result set as an object
object = rdo_fetch_object(resultset as object)
- rdo_data_seek() - move the internal row pointer
numeric = rdo_data_seek(resultset as object, row as numeric)
- rdo_field_seek() - jump to a specified field in a result set
numeric = rdo_field_seek(resultset as object, column as numeric)
- rdo_result() - return the value of a field in a result set
string = rdo_result(resultset as object, row as numeric, column as string)
Result Set Information
- rdo_fetch_field() - return an object containing information about a field from a result set
object = rdo_fetch_field(resultset as object, field as numeric)
- rdo_fetch_lengths() - return the length of the contents of each field in a result set
object = rdo_fetch_lengths(resultset as object)
- rdo_num_fields() - return the number of fields in a result set
numeric = rdo_num_fields(resultset as object)
- rdo_num_rows() - return the number of rows in a result set
numeric = rdo_num_rows(resultset as object)
Field Information
- rdo_field_flags() - return the flags of a field in a result set
string = rdo_field_flags(resultset as object, column as numeric)
- rdo_field_len() - return the length of a field in a result set
numeric = rdo_field_len(resultset as object, column as numeric)
- rdo_field_name() - return the name of a field in a result set
string = rdo_field_name(resultset as object, column as numeric)
- rdo_field_type() - return the type of a field in a result set
string = rdo_field_type(resultset as object, column as numeric)
- rdo_field_table() - return the name of the table where a specified field is located
string = rdo_field_table(resultset as object, column as numeric)
Freeing Memory
- rdo_free_object() - free memory used by a result set object
numeric = rdo_free_object(resultset as object)
- rdo_free_result() - free memory used by a result set object
numeric = rdo_free_result(resultset as object)
Getting Error Information
- rdo_errno() - return the number of the last error
numeric = rdo_errno()
- rdo_error() - return the error description of the last Recital error
string = rdo_errno()
Getting Environment Information
- rdo_get_client_info() - return information about the client
string = rdo_get_client_info()
- rdo_get_host_info() - return information about the connection
string = rdo_get_host_info(connection as numeric)
- rdo_list_dbs() - list the available databases for the current or specified connection
object = rdo_list_dbs([connection as numeric])
- rdo_ping() - check whether a server connection is active
logical = rdo_ping(connection as numeric)
- rdo_stat() - return the current system status of Recital
numeric = rdo_stat(connection as numeric)
- rdo_thread_id() - return the current thread ID
numeric = rdo_thread_id([connection as numeric])
Examples
// Error trapping routine function errorfunc parameter p_line echo p_line, "\n" // rdo_error() - return the error description of the last Recital error echo "Error Message: " + rdo_error(), "\n" // rdo_errno() - return the number of the last error echo "Error Number : " + rdo_errno(), "\n" endfunc // rdo_connect() - connect to a data source echo time() + " RDO_CONNECT() with database", "\n" conn = rdo_connect("recital","?","?","?", "southwind") if conn > -1 // rdo_close() - close a data source opened with rdo_connect() echo time() + " RDO_CLOSE()", "\n" rdo_close(conn) else echo "rdo_connect failed", "\n" errorfunc(message(1)) endif echo time() + " RDO_CONNECT()", "\n" conn = rdo_connect("recital","?","?","?") if conn > -1 // rdo_list_dbs() - list the available databases echo time() + " RDO_LIST_DBS()", "\n" dbs = rdo_list_dbs() // rdo_select_db() - set the active database echo time() + " RDO_SELECT_DB()", "\n" foreach dbs as currdb rdo_select_db(currdb, conn) // rdo_query() - return a result set object for a SELECT query echo time() + " RDO_QUERY()", "\n" res = rdo_query("select database() as db from sysresultset") // rdo_result() - return the value of a field in a result set echo time() + " RDO_RESULT()", "\n" echo "Current database: " + rdo_result(res,0,"db"), "\n" endfor rdo_close(conn) else echo "rdo_connect failed", "\n" errorfunc(message(1)) endif // rdo_connect() - connect to a data source echo time() + " RDO_CONNECT() with database", "\n" conn = rdo_connect("recital","?","?","?", "southwind") if conn > -1 // rdo_exec() - execute a non-SELECT statement echo time() + " RDO_EXEC()", "\n" if rdo_exec("copy database southwind to rdoreg if exists",conn) > 0 echo "rdo_exec failed", "\n" errorfunc(message(1)) rdo_close(conn) return else // rdo_exec() - execute a non-SELECT statement echo time() + " RDO_EXEC()", "\n" if rdo_exec("update orders set employeeid = 2 where employeeid = 1") > 0 echo "rdo_exec failed", "\n" errorfunc(message(1)) endif // rdo_affected_rows() - return the number of rows affected echo time() + " RDO_AFFECTED_ROWS()", "\n" echo "Affected rows: " + tostring(rdo_affected_rows()), "\n" endif rdo_close(conn) else echo "rdo_connect failed", "\n" errorfunc(message(1)) return endif // rdo_connect() - connect to a data source echo time() + " RDO_CONNECT() with database", "\n" conn = rdo_connect("recital","?","?","?", "rdoreg") if conn = -1 echo "rdo_connect failed", "\n" errorfunc(message(1)) return else // rdo_unbuffered_query() - return a result set for a SELECT query echo time() + " RDO_UNBUFFERED_QUERY()", "\n" res1 = rdo_unbuffered_query("select * from shippers") // rdo_info() - return information about the last query echo time() + "RDO_INFO()", "\n" echo "Last Query: " + rdo_info(conn), "\n" // rdo_fetch_array() - return the results of a query as an array echo time() + " RDO_FETCH_ARRAY()", "\n" // rdo_real_escape_string() - escape special characters echo time() + " RDO_REAL_ESCAPE_STRING()", "\n" res2 =rdo_fetch_array(rdo_real_escape_string("select * from customers")) // rdo_num_rows() - return the number of rows in a result set echo time() + " RDO_NUM_ROWS()", "\n" echo "Number of rows: " + tostring(rdo_num_rows(res2)), "\n" // rdo_fetch_row() - return the next row from a result set as an object echo time() + " RDO_FETCH_ROW()", "\n" for i = 0 to rdo_num_rows(res2)-1 arr1 = rdo_fetch_row(res2) echo "Customer ID: " + arr1.customerid, "\n" next // rdo_fetch_assoc() - return the results of a query as an array echo time() + " RDO_ASSOC()", "\n" res3 = rdo_unbuffered_query("select * from orders") // rdo_num_rows() - return the number of rows in a result set echo time() + " RDO_NUM_ROWS()", "\n" echo "Number of rows: " + tostring(rdo_num_rows(res3)), "\n" // rdo_fetch_object() - return the next row from a result set as an object echo time() + " RDO_FETCH_OBJECT()", "\n" for i = 0 to rdo_num_rows(res3)-1 arr2 = rdo_fetch_object(res3) echo "Order ID: " + arr2.orderid, "\n" next // rdo_data_seek() - move the internal row pointer echo time() + " RDO_DATA_SEEK()", "\n" rdo_data_seek(res3,1) arr3 = rdo_fetch_object(res3) echo "Order ID: " + arr3.orderid, "\n" // rdo_num_fields() - return the number of fields in a result set echo time() + " RDO_NUM_FIELDS()", "\n" echo "Number of fields: " + tostring(rdo_num_fields(res3)), "\n" // rdo_fetch_field() - return an object with field information echo time() + " RDO_FETCH_FIELD()", "\n" for i = 0 to rdo_num_fields(res3)-1 arr4 = rdo_fetch_field(res3, i) foreach arr4 as key => value echo "key=" + key + " value=" + value, "\n" endfor next // rdo_fetch_lengths() - return the length of the contents of each field echo time() + " RDO_FETCH_LENGTHS()", "\n" arr5 = rdo_fetch_lengths(res3) foreach arr5 as field => length echo "field=" + field + " length=" + length, "\n" endfor // rdo_field_seek() - jump to a specified field in a result set echo time() + " RDO_FIELD_SEEK()", "\n" rdo_field_seek(res3, 2) // rdo_fetch_field() - return an object with field information echo time() + " RDO_FETCH_FIELD()", "\n" arr6 = rdo_fetch_field(res3) foreach arr6 as key => value echo "key=" + key + " value=" + value, "\n" endfor // rdo_field_name() - return the name of a field in a result set echo time() + " RDO_FIELD_NAME()", "\n" echo "Name: " + rdo_field_name(res3,2), "\n" // rdo_field_type() - return the type of a field in a result set echo time() + " RDO_FIELD_TYPE()", "\n" echo "Type: " + rdo_field_type(res3,2), "\n" // rdo_field_len() - return the length of a field in a result set echo time() + " RDO_FIELD_LEN()", "\n" echo "Length: " + tostring(rdo_field_len(res3,2)), "\n" // rdo_field_flags() - return the flags of a field in a result set echo time() + " RDO_FIELD_FLAGS()", "\n" echo "Flags: " + rdo_field_flags(res3,2), "\n" // rdo_field_table() - return the name of the table where a specified field is located echo time() + " RDO_FIELD_TABLE()", "\n" echo "Table: " + rdo_field_table(res3,2), "\n" // rdo_free_object() - free memory used by a result set object echo time() + " RDO_FREE_OBJECT()", "\n" echo "Object "+iif(rdo_free_object(res1)=0,"released","could not be released"), "\n" // rdo_free_result() - free memory used by a result set object echo time() + " RDO_FREE_OBJECT()", "\n" echo "Object "+iif(rdo_free_object(res2)=0,"released","could not be released"), "\n" // rdo_get_client_info() - return information about the client echo time() + " RDO_GET_CLIENT_INFO()", "\n" echo "Client: " + rdo_get_client_info(), "\n" // rdo_get_host_info() - return information about the connection echo time() + " RDO_GET_HOST_INFO()", "\n" echo "Host: " + rdo_get_host_info(conn), "\n" // rdo_ping() - check whether a server connection is active echo time() + " RDO_PING()", "\n" echo "Connection "+iif(rdo_ping(conn),"is active","is not active"), "\n" // rdo_stat() - return the current system status of Recital echo time() + " RDO_STAT()", "\n" echo "Connection "+iif(rdo_stat(conn)>0,"is active","is not active"), "\n" // rdo_thread_id() - return the current thread ID echo time() + " RDO_THREAD_ID()", "\n" echo "Current thread ID: " + tostring(rdo_thread_id()), "\n" // rdo_close() - close a data source opened with rdo_connect() echo time() + " RDO_CLOSE()", "\n" rdo_close(conn) endif // rdo_connect() - connect to a data source echo time() + " RDO_CONNECT()", "\n" conn = rdo_connect("recital","?","?","?") if conn > -1 // rdo_exec() - execute a non-SELECT statement echo time() + " RDO_EXEC()", "\n" if rdo_exec("drop database rdoreg",conn) > 0 echo "rdo_exec failed", "\n" errorfunc(message(1)) endif // rdo_close() - close a data source opened with rdo_connect() echo time() + " RDO_CLOSE()", "\n" rdo_close(conn) else echo "rdo_connect failed", "\n" errorfunc(message(1)) endif
Using Recital Client/Server
Using Recital with MySQL
Using Recital with PostgreSQL
Using Recital with Oracle
Requirements:
- Make sure the Oracle environment (ORACLE_HOME, ORACLE_SID etc.) is set up before starting the Recital Server. If not, you will see the error ORA-01019. A call to the Oracle environment setup script can be added to the /etc/init.d/recital script if your Recital Server is set to run on startup.
- The Recital Oracle Gateway requires the Oracle libclntsh.so shared library. If this file is unknown to ld.so.conf, add it using the ldconfig command.