友情链接:
Inceptor 支持完整的 SQL 标准语法,可兼容Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍应用程序与 Inceptor 数据交互的通用流程:
您可以基于业务需求灵活调整上述流程,各步骤说明如下:
在开发应用程序前,您需要根据上一篇内容手动完成 Windows/Linux 平台下 ODBC 驱动安装和数据配置。
1. 建立连接
2. 初始化操作
3. 执行 SQL:准备 SQL 语句并执行。
4. 获取结果集:根据执行的 SQL 类型获取结果集:
5. 处理事务:提交或回滚事务,如无事务操作则无需此步骤。
6. 断开连接:断开连接,释放 Connection Handle 和 Environment Handle。
为帮助您更好地上手 Inceptor 相关应用程序的开发,本章节提供了多种语言的示例代码,演示如何操作 Inceptor 数据库。
本节介绍 C 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
1. 本段代码为头文件 common.h,包括必要的头文件、变量声明、函数声明。
// 本示例展示如何连接数据库、创建表、插入数据、查询并打印结果、删除表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32
#include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#ifdef WIN32
#define snprintf _snprintf
#endif
SQLHENV env;
SQLHDBC conn;
SQLCHAR str[1024];
HSTMT hstmt = SQL_NULL_HSTMT; //handle statement
char table_name[]="zzz";//your table_name. This program use $table_name as a sample
int rc;
//check execution statement
#define CHECK_STMT_RESULT(rc, msg, hstmt) \
if (!SQL_SUCCEEDED(rc)) \
{ \
print_diag(msg, SQL_HANDLE_STMT, hstmt); \
exit(1);\
}
//output info
void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle)
{
char sqlstate[32];
char message[1000];
SQLINTEGER nativeerror;
SQLSMALLINT textlen;
SQLRETURN ret;
if (msg)
printf("%s\n", msg);
ret = SQLGetDiagRec(htype, handle, 1, (SQLCHAR*)sqlstate, &nativeerror,
(SQLCHAR*)message, 256, &textlen);
if (ret == SQL_INVALID_HANDLE)
printf("Invalid handle\n");
else if (ret != SQL_ERROR)
printf("%s=%s\n", (CHAR *)sqlstate, (CHAR *)message);
}
void connect_database(); //connect to database.
void create_table();//create a table
void insert_into_table();//insert into table
void select_all();//select * from table and print result
void drop_table();//drop table
void disconnect();
2. 与 Inceptor 建立连接。
//connect to database.
void connect_database()
{
SQLCHAR dsn[1024]; //dsn name
SQLSMALLINT strl;
snprintf((char*)dsn,sizeof(dsn), "DSN=your_inceptor_odbc_data_source_name");
// Allocate an environment
rc =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate an environment failed", hstmt);
// Register this as an application that expects 3.x behavior
rc =SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
CHECK_STMT_RESULT(rc, "SQLExecDirectRegister this as an application failed", hstmt);
// Allocate a connection
rc =SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a connection failed", hstmt);
// Connect to the driver
rc =SQLDriverConnect(conn, NULL, dsn, SQL_NTS,
str, sizeof(str), &strl,
SQL_DRIVER_COMPLETE);
CHECK_STMT_RESULT(rc, "SQLExecDirect Connect to the driver failed", hstmt);
printf("Connected.\n");
}
3. 创建表 table_name。
//create a table
void create_table()
{
if(NULL == table_name) {
printf("WRONG! table_name can't be NULL\n");
exit(1);
}
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
//use odbc;
rc =SQLExecDirect(hstmt, (SQLCHAR *) "use odbc", SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
// Execute a sql
char create_table_sql[200];
snprintf(create_table_sql,sizeof(create_table_sql),"create table if not exists %s(i int, s string) stored as holodesk",table_name); //DSN=[your dsn description]
rc =SQLExecDirect(hstmt, (SQLCHAR *)create_table_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
// Free ODBC handles
rc =SQLFreeStmt(hstmt, SQL_CLOSE);
CHECK_STMT_RESULT(rc, "SQLExecDirect Free ODBC handles failed", hstmt);
printf("Table %s created.\n",table_name);
}
4. 向表中插入数据。
//insert into table
void insert_into_table()
{
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
char insert_sql1[100];
snprintf(insert_sql1,sizeof(insert_sql1),"insert into %s(i,s) values(1,'foo')",table_name);
char insert_sql2[100];
snprintf(insert_sql2,sizeof(insert_sql2),"insert into %s(i,s) values(2,'bar')",table_name);
/* insert values*/
rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql1, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql2, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
printf("Insert values into table %s done.\n",table_name);
}
5. 查询并打印结果集。
//select * from table and print result
void select_all()
{
SQLINTEGER longvalue;
SQLLEN indLongvalue;
char charvalue[100];
SQLLEN indCharvalue;
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
/* bind column1 */
rc = SQLBindCol(hstmt, 1, SQL_C_LONG, &longvalue, 0, &indLongvalue);
CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, &charvalue, sizeof(charvalue), &indCharvalue);
CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
char select_sql[100];
snprintf(select_sql,sizeof(select_sql),"select * from %s",table_name);
rc = SQLExecDirect(hstmt, (SQLCHAR *) select_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect select failed", hstmt);
printf("Result set:\n");
while(1)
{
rc = SQLFetch(hstmt);
if (rc == SQL_NO_DATA)
break;
if (rc == SQL_SUCCESS)
{
printf("%ld %s\n", (long) longvalue, charvalue);
}
else
{
print_diag("SQLFetch failed", SQL_HANDLE_STMT, hstmt);
//exit(1);//commented by yangyao
}
}
rc = SQLFreeStmt(hstmt, SQL_CLOSE);
CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt);
printf("\nSelect fropm table %s done.\n",table_name);
}
6. 删除表 table_name。
//drop table
void drop_table()
{
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
//drop sql statement
char drop_sql[100];
snprintf(drop_sql,sizeof(drop_sql),"drop table %s",table_name);
//execute drop_sql
rc = SQLExecDirect(hstmt, (SQLCHAR *) drop_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect drop failed", hstmt);
printf("Drop table %s done.\n",table_name);
}
程序所使用的 main 函数如下:
#include "common.h"
void main()
{
connect(); //connect to database.
create_table();//create a table
insert_into_table();//insert into table
select_all();//select * from table and print result
drop_table();//drop table
}
本节介绍 C# 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
namespace catt1{
class Program{
static void Main(string[] args){
try{
//connect odbc by specifying DSN name
OdbcConnection connection = new OdbcConnection("DSN=your_inceptor_odbc_data_source_name");
connection.Open();
//create table
string createTable = "create table tt(c1 int , c2 int) stored as holodesk";
OdbcCommand command = new OdbcCommand(createTable, connection);
command = new OdbcCommand(createTable, connection);
command.ExecuteNonQuery();
//insert data
string insertTable = "insert into tt(c1,c2) values(?,?)";
command = new OdbcCommand(insertTable, connection);
command.CommandType = System.Data.CommandType.Text;
command.Parameters.AddWithValue("@c1", 1);
command.Parameters.AddWithValue("@c2", 2);
command.ExecuteNonQuery();
//select data with DataReader
string selectTalbe = " select * from tt";
command = new OdbcCommand(selectTalbe, connection);
OdbcDataReader reader = command.ExecuteReader();
while (reader.Read()){
Console.Out.Write(reader[0].ToString() + "\t");
Console.Out.WriteLine(reader[1].ToString());
}
//select data with OdbcDataAdapter
OdbcDataAdapter da = new OdbcDataAdapter(selectTalbe, connection);
System.Data.DataSet ds = new System.Data.DataSet();
da.Fill(ds, "tt");
//drop table
string dropTable = "drop table if exists tt";
command = new OdbcCommand(dropTable, connection);
command.ExecuteNonQuery();
//close connection
connection.Close();
}catch (Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
本节介绍 Python 语言开发环境下,如何完成连接Inceptor/ArgoDB数据库、创建表、插入数据、查询数据和删除表的相关操作。
使用该代码前,请先安装 pyodbc 模块。
import pyodbc
#connect odbc
cnxn = pyodbc.connect("DSN=your_inceptor_odbc_data_source_name")
# Python 2.7, 避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(str, encoding='utf-8')
cnxn.setencoding(unicode, encoding='utf-8')
# Python 3.x,避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(encoding='utf-8')
cursor = cnxn.cursor()
#create table
cursor.execute("create table tt(c1 int , c2 int) stored as holodesk")
#insert data,INSERT INTO VALUES 语法只支持 Holodesk、TORC 等事务表,其余表只支持 INSERT INTO SELECT 插入。
cursor.execute("insert into tt values (?,?)", 1,1)
cursor.execute("insert into tt values (?,?)", 2,2)
#select data
row = cursor.execute("select * from tt").fetchone()
print row
#drop table
cursor.execute("drop table tt")
cnxn.close()
本节介绍 Perl 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
由于 Per 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 Inceptor,在执行示例代码前,您还需要编译安装这两个模块,以 CentOS 65 为例:
1. 安装 DBI
# 安装 DBI 所需的依赖包
yum install perl perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
# 下载并编译安装 DBI
wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBI/DBI-1.630.tar.gz
tar -xvzf DBI-1.630.tar.gz
cd DBI-1.630
perl Makefile.PL
make
make install
2. 安装 DBD::ODBC。
wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBD/DBD-ODBC-1.52.tar.gz
tar -xvzf DBD-ODBC-1.52.tar.gz
cd DBD-ODBC-1.52
perl Makefile.PL
make
make install
完成上述操作后,即可尝试运行下述 Perl 示例代码:
#!/usr/bin/perl
use strict;
use DBI;
my $data_source="DBI:ODBC:your_odbc_data_source_name";
my $dbh=DBI->connect($data_source,"","", {AutoCommit => 1,PrintError=>1,RaiseError=>1});
sub select_data(){
print "select data ...\n";
my $sth=$dbh->prepare("select * from tt");
$sth->execute();
my @row;
while (@row = $sth->fetchrow_array) { # retrieve one row
print join(", ", @row), "\n";
}
$sth->finish();
}
sub insert_data(){
print "insert data ...\n";
my $sth=$dbh->prepare("insert into tt values (?,1)");
my $p = (1,2,3);
$sth->execute($p);
$sth->finish();
}
sub create(){
$dbh->do("create table tt(c1 int , c2 int) stored as holodesk");
}
sub drop(){
$dbh->do("drop table tt");
}
sub main(){
drop();
create();
insert_data();
select_data();
drop();
$dbh->disconnect();
}
my $ret =main();
exit($ret);
本节介绍 Ruby 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
由于 Ruby 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 Inceptor,在执行示例代码前,您还需要编译安装这两个模块。
1. 安装 Ruby
yum install ruby ruby-dev -y
2. 前往 Ruby-ODBC 下载站点,下载 0.9994 版本并将其放至 CentOS 65 设备 中。
3. 解压并安装 Ruby-ODBC。
# 解压文件并进入解压后目录
tar -zxvf ruby-odbc-0.994.tar.gz && cd ruby-odbc-0.994
# 编译安装,--with-odbc-dir 必须指向odbc driver manager的位置
# 例如 driver manager 的库为 /usr/lib/x86_64-linux-gnu/libodbc.so.1,则该选项如下
ruby ext/extconf.rb --with-odbc-dir=/usr/lib/x86_64-linux-gnu
4. 安装 DBI 和 DBD::ODBC
sudo gem install dbi
sudo gem install dbd-odbc
1. 下载并安装 Ruby,推荐下载 3.1.4-1 版本。
2. 执行下述命令,安装 Ruby-ODBC。
gem install ruby-odbc
3. 执行下述命令,安装 DBI 和 DBD::ODBC。
gem install dbi
gem install dbd-odbc
完成上述操作后,即可尝试运行下述 Ruby 示例代码:
# inceptor_odbc.rb - simple Incepotr script using Ruby DBI module
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("dbi:ODBC:your_inceptor_data_source_name", "", "")
# create transaction table
dbh.do("create table rubytest(c1 int , c2 int) stored as holodesk")
#insert table
sth = dbh.prepare("INSERT INTO rubytest (c1,c2) VALUES(?,1)")
sth.execute(2);
sth.finish
#select data
sth = dbh.execute("SELECT * FROM rubytest")
sth.each do |row|
printf "c1: %d, c2: %d/n", row[0], row[1]
end
sth.finish
#drop table
dbh.do("drop table rubytest")
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
本节介绍 PHP 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PHP and ODBC: XHTML Example 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php
$conn = odbc_connect("transwarp-hs2-lda", "", ""); // dsn name, user, password
if (!($conn)) {
echo "<p>Connection to DB via ODBC failed: ";
echo odbc_errormsg ($conn );
echo "</p>\n";
}
$create_table="create table phptest(c1 int , c2 int) stored as holodesk";
$success = odbc_do($conn,"drop table if exists phptest");
$success = odbc_do($conn,$create_table);
$success = odbc_exec($conn,"insert into phptest values(1, 2)");
$rs = odbc_exec($conn,"select * from phptest");
echo "<table><tr>";
echo "<th>Test</th></tr>";
while (odbc_fetch_row($rs))
{
$result = odbc_result($rs,"c1");
echo "<tr><td>c1: $result</td></tr>";
}
odbc_do($conn,"drop table if exists phptest");
odbc_close($conn);
echo "</table>";
?>
</body>
</html>
Inceptor / ArgoDB 支持 3.x 版本的 ODBC API,本文介绍支持的 API 列表供您参考,详细的用法介绍和一致性级别说明,见 Microsoft ODBC API 参考。
API | 一致性级别 | 说明 |
---|---|---|
SQLAllocHandle | ISO 92 | 分配环境、连接、语句或描述符句柄。 |
SQLConnect | ISO 92 | 在驱动程序和数据源间建立连接,连接句柄引用与数据源的连接的所有信息的存储,包括状态、事务状态和错误信息。 |
SQLDriverConnect | ODBC | 可替代 SQLConnect,使用连接字符串或对话框连接到数据源。 |
SQLBrowseConnect | ODBC | 发现和枚举连接到数据源所需的特性和属性值。 |
SQLAllocEnv | 已弃用 | 由 SQLAllocHandle 取代。 |
SQLAllocConnect | 已弃用 | 由 SQLAllocHandle 取代。 |
SQLAllocStmt | 已弃用 | 由 SQLAllocHandle 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLDataSources | ISO 92 | 返回数据源的相关信息,由驱动程序管理器实现。 |
SQLDrivers | ODBC | 返回驱动程序说明和属性信息,由驱动程序管理器实现。 |
SQLGetInfo | ISO 92 | 返回特定驱动程序和数据源的信息。 |
SQLGetFunctions | ISO 92 | 返回相关驱动程序是否支持函数。 |
SQLGetTypeInfo | ISO 92 | 返回数据源支持的数据类型信息。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLSetConnectAttr | ISO 92 | 设置连接属性。 |
SQLGetConnectAttr | ISO 92 | 返回连接属性的设置。 |
SQLSetEnvAttr | ISO 92 | 设置环境属性。 |
SQLGetEnvAttr | ISO 92 | 返回环境属性的设置。 |
SQLSetStmtAttr | ISO 92 | 设置语句属性。 |
SQLGetStmtAttr | ISO 92 | 返回语句属性的设置。 |
SQLSetConnectOption | 已弃用 | 由 SQLSetConnectAttr 取代。 |
SQLGetConnectOption | 已弃用 | 由 SQLGetConnectAttr 取代。 |
SQLSetStmtOption | 已弃用 | 由 SQLSetStmtAttr 取代。 |
SQLGetStmtOption | 已弃用 | 由 SQLGetStmtAttr 取代。 |
SQLParamOptions | 已弃用 | 由 SQLSetStmtAttr 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLGetDescField | ISO 92 | 获取单个描述符字段的值。 |
SQLGetDescRec | ISO 92 | 获取多个描述符字段的值。 |
SQLSetDescField | ISO 92 | 设置单个描述符字段。 |
SQLSetDescRec | ISO 92 | 设置多个描述符字段。 |
SQLCopyDesc | ISO 92 | 将描述符信息从一个描述符句柄复制到另一个描述符句柄。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLPrepare | ISO 92 | 准备稍后执行的 SQL 语句。 |
SQLBindParameter | ODBC | 将缓冲区绑定到 SQL 语句中的参数标记。 |
SQLGetCursorName | ISO 92 | 返回与指定语句句柄关联的游标名。 |
SQLSetCursorName | ISO 92 | 设置游标名。 |
SQLSetScrollOptions | 已弃用 | 由 SQLGetInfo 和 SQLSetStmtAttr 取代。 |
SQLSetParam | 已弃用 | 由 SQLBindParameter 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLExecute | ISO 92 | 执行已准备的 SQL 语句。 |
SQLExecDirect | ISO 92 | 执行 SQL 语句。 |
SQLNativeSql | ODBC | 返回由驱动程序翻译的 SQL 语句文本。 |
SQLDescribeParam | ODBC | 返回语句中的参数信息,Connector/ODBC不支持,返回结果仅为参考。 |
SQLNumParams | ISO 92 | 返回 SQL 语句中参数的数量。 |
SQLParamData | ISO 92 | 与 SQLPutData 结合使用,在执行时提供参数数据。 |
SQLPutData | ISO 92 | 发送参数的部分或全部数据值。 |
SQLTransact | 已弃用 | 由 SQLEndTran 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLRowCount | ISO 92 | 返回受 INSERT、UPDATE、DELETE 请求语句所影响的行数。 |
SQLNumResultCols | ISO 92 | 返回结果集中列的数量。 |
SQLDescribeCol | ISO 92 | 返回结果集中列的信息。 |
SQLColAttribute | ISO 92 | 返回结果集中列的描述符信息。 |
SQLFetch | ISO 92 | 返回多行结果数据。 |
SQLFetchScroll | ISO 92 | 返回滚动的数据行。 |
SQLSetPos | ODBC | 设置行集中的游标位置,并允许应用程序刷新行集中的数据或更新/删除结果集中的数据。 |
SQLBulkOperations | ODBC | 执行批量插入和批量书签操作,包括通过书签进行更新、删除和提取。 |
SQLMoreResults | ODBC | 确定是否有更多结果集可用,如有则执行初始化以对结果集进行处理。 |
SQLGetDiagField | ISO 92 | 返回诊断记录的单个字段的当前值,包含错误、警告和状态信息。 |
SQLGetDiagRec | ISO 92 | 返回诊断记录的多个字段的当前值,包含错误、警告和状态信息。 |
SQLBindCol | ISO 92 | 将应用程序数据缓冲区绑定到结果集中的列。 |
SQLGetData | ISO 92 | 返回结果集一行的部分/全部数据列数据。 |
SQLError | 已弃用 | 由 SQLGetDiagRec 取代。 |
SQLColAttributes | 已弃用 | 由 SQLColAttribute 取代。 |
SQLExtendedFetch | 已弃用 | 由 SQLFetchScroll 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLColumnPrivileges | ODBC | 返回指定表的列和关联权限的列表。 |
SQLColumns | Open Group | 返回指定表的列名。 |
SQLForeignKeys | ODBC | 返回外键的列名。 |
SQLPrimaryKeys | ODBC | 返回主键的列名。 |
SQLSpecialColumns | Open Group | 返回指定表中列的信息,包含唯一标识表中行的最佳列集、事务更新行中的任何值时自动更新的列。 |
SQLStatistics | ISO 92 | 返回有关单个表的统计信息。 |
SQLTablePrivileges | ODBC | 返回表列表与每个表关联的特权信息。 |
SQLTables | Open Group | 返回指定数据源中的表名。 |
SQLProcedures | ODBC | 返回指定数据源中的过程名。 |
SQLProcedureColumns | ODBC | 返回过程的参数和结果集列。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLFreeStmt | ISO 92 | 结束语句处理,放弃挂起的结果,释放与语句句柄关联的所有资源。 |
SQLCloseCursor | ISO 92 | 关闭已在语句句柄上打开的游标,同时丢弃挂起的结果。 |
SQLCancel | ISO 92 | 取消语句的处理。 |
SQLCancelHandle | ODBC | 取消对连接或语句的处理。 |
SQLEndTran | ISO 92 | 提交或回滚事务。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLDisconnect | ISO 92 | 关闭连接。 |
SQLFreeHandle | ISO 92 | 释放与特定环境、连接、语句或描述符句柄关联的资源。 |
SQLFreeConnect | 已废弃 | 由 SQLFreeHandle 取代。 |
SQLFreeEnv | 已废弃 | 由 SQLFreeHandle 取代。 |
ArgoDB/Inceptor 目前采用的 ODBC 驱动为 3.x 版本,当用其调用 2.x 版本的应用程序时,会根据下表自动映射并转换。
ODBC 2.x | ODBC 3.x |
---|---|
SQLAllocConnect | SQLAllocHandle |
SQLAllocEnv ① | |
SQLAllocStmt | |
SQLBindParam | SQLBindParameter |
SQLColAttributes | SQLColAttribute |
SQLError | SQLGetDiagRec |
SQLFreeConnect | SQLFreeHandle |
SQLFreeEnv | |
SQLFreeStmt | |
SQLGetConnectOption | SQLGetConnectAttr |
SQLGetStmtOption | SQLGetStmtAttr |
SQLParamOptions | SQLSetStmtAttr |
SQLSetConnectOption | SQLSetConnectAttr |
SQLSetParam | SQLBindParameter |
SQLSetScrollOption | SQLSetStmtAttr |
SQLSetStmtOption | |
SQLTransact | SQLEndTran |
①:应用程序通过 ODBC 3.x 驱动调用该接口时,会自动调用 SQLSetEnvAttr 并将 SQL_ATTR_ODBC_VERSION 环境属性设置为 SQL_OV_ODBC2,再映射到 SQLAllocHandle。
Catelog API 字符串参数分为四种不同类型的:普通参数(OA)、模式值参数(PV)、标识符参数(ID)和值列表参数(VL),更多介绍,见Catelog API。下表列出了当前对 Catelog API 的支持情况:
函数 | 参数 | SQL_时键入 ATTR_METADATA_ID = SQL_FALSE | 是否支持 | SQL_时键入 ATTR_METADATA_ID = SQL_TRUE | 是否支持 |
---|---|---|---|---|---|
SQLColumnPrivileges | CatalogName SchemaName TableName ColumnName | OA OA OA PV | ❌ | ID ID ID ID | ❌ |
SQLColumns | CatalogName SchemaName TableName ColumnName | OA PV PV PV | ✅ | ID ID ID ID | ❌ |
SQLForeignKeys | PKCatalogName PKSchemaName PKTableName FKCatalogName FKSchemaName FKTableName | OA OA OA OA OA OA | ❌ | ID ID ID ID ID ID | ❌ |
SQLPrimaryKeys | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLProcedureColumns | CatalogName SchemaName ProcName ColumnName | OA PV PV PV | ❌ | ID ID ID ID | ❌ |
SQLProcedures | CatalogName SchemaName ProcName | OA PV PV | ❌ | ID ID ID | ❌ |
SQLSpecialColumns | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLStatistics | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLTablePrivileges | CatalogName SchemaName TableName | OA PV PV | ❌ | ID ID ID | ❌ |
SQLTables | CatalogName SchemaName TableName TableType | PV PV PV VL | ✅ | ID ID ID VL | ❌ |
如果上述内容对您有提供帮助,欢迎多多点赞支持~😎
友情链接:
Inceptor 支持完整的 SQL 标准语法,可兼容Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍应用程序与 Inceptor 数据交互的通用流程:
您可以基于业务需求灵活调整上述流程,各步骤说明如下:
在开发应用程序前,您需要根据上一篇内容手动完成 Windows/Linux 平台下 ODBC 驱动安装和数据配置。
1. 建立连接
2. 初始化操作
3. 执行 SQL:准备 SQL 语句并执行。
4. 获取结果集:根据执行的 SQL 类型获取结果集:
5. 处理事务:提交或回滚事务,如无事务操作则无需此步骤。
6. 断开连接:断开连接,释放 Connection Handle 和 Environment Handle。
为帮助您更好地上手 Inceptor 相关应用程序的开发,本章节提供了多种语言的示例代码,演示如何操作 Inceptor 数据库。
本节介绍 C 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
1. 本段代码为头文件 common.h,包括必要的头文件、变量声明、函数声明。
// 本示例展示如何连接数据库、创建表、插入数据、查询并打印结果、删除表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32
#include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#ifdef WIN32
#define snprintf _snprintf
#endif
SQLHENV env;
SQLHDBC conn;
SQLCHAR str[1024];
HSTMT hstmt = SQL_NULL_HSTMT; //handle statement
char table_name[]="zzz";//your table_name. This program use $table_name as a sample
int rc;
//check execution statement
#define CHECK_STMT_RESULT(rc, msg, hstmt) \
if (!SQL_SUCCEEDED(rc)) \
{ \
print_diag(msg, SQL_HANDLE_STMT, hstmt); \
exit(1);\
}
//output info
void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle)
{
char sqlstate[32];
char message[1000];
SQLINTEGER nativeerror;
SQLSMALLINT textlen;
SQLRETURN ret;
if (msg)
printf("%s\n", msg);
ret = SQLGetDiagRec(htype, handle, 1, (SQLCHAR*)sqlstate, &nativeerror,
(SQLCHAR*)message, 256, &textlen);
if (ret == SQL_INVALID_HANDLE)
printf("Invalid handle\n");
else if (ret != SQL_ERROR)
printf("%s=%s\n", (CHAR *)sqlstate, (CHAR *)message);
}
void connect_database(); //connect to database.
void create_table();//create a table
void insert_into_table();//insert into table
void select_all();//select * from table and print result
void drop_table();//drop table
void disconnect();
2. 与 Inceptor 建立连接。
//connect to database.
void connect_database()
{
SQLCHAR dsn[1024]; //dsn name
SQLSMALLINT strl;
snprintf((char*)dsn,sizeof(dsn), "DSN=your_inceptor_odbc_data_source_name");
// Allocate an environment
rc =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate an environment failed", hstmt);
// Register this as an application that expects 3.x behavior
rc =SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
CHECK_STMT_RESULT(rc, "SQLExecDirectRegister this as an application failed", hstmt);
// Allocate a connection
rc =SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a connection failed", hstmt);
// Connect to the driver
rc =SQLDriverConnect(conn, NULL, dsn, SQL_NTS,
str, sizeof(str), &strl,
SQL_DRIVER_COMPLETE);
CHECK_STMT_RESULT(rc, "SQLExecDirect Connect to the driver failed", hstmt);
printf("Connected.\n");
}
3. 创建表 table_name。
//create a table
void create_table()
{
if(NULL == table_name) {
printf("WRONG! table_name can't be NULL\n");
exit(1);
}
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
//use odbc;
rc =SQLExecDirect(hstmt, (SQLCHAR *) "use odbc", SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
// Execute a sql
char create_table_sql[200];
snprintf(create_table_sql,sizeof(create_table_sql),"create table if not exists %s(i int, s string) stored as holodesk",table_name); //DSN=[your dsn description]
rc =SQLExecDirect(hstmt, (SQLCHAR *)create_table_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
// Free ODBC handles
rc =SQLFreeStmt(hstmt, SQL_CLOSE);
CHECK_STMT_RESULT(rc, "SQLExecDirect Free ODBC handles failed", hstmt);
printf("Table %s created.\n",table_name);
}
4. 向表中插入数据。
//insert into table
void insert_into_table()
{
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
char insert_sql1[100];
snprintf(insert_sql1,sizeof(insert_sql1),"insert into %s(i,s) values(1,'foo')",table_name);
char insert_sql2[100];
snprintf(insert_sql2,sizeof(insert_sql2),"insert into %s(i,s) values(2,'bar')",table_name);
/* insert values*/
rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql1, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql2, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
printf("Insert values into table %s done.\n",table_name);
}
5. 查询并打印结果集。
//select * from table and print result
void select_all()
{
SQLINTEGER longvalue;
SQLLEN indLongvalue;
char charvalue[100];
SQLLEN indCharvalue;
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
/* bind column1 */
rc = SQLBindCol(hstmt, 1, SQL_C_LONG, &longvalue, 0, &indLongvalue);
CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, &charvalue, sizeof(charvalue), &indCharvalue);
CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
char select_sql[100];
snprintf(select_sql,sizeof(select_sql),"select * from %s",table_name);
rc = SQLExecDirect(hstmt, (SQLCHAR *) select_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect select failed", hstmt);
printf("Result set:\n");
while(1)
{
rc = SQLFetch(hstmt);
if (rc == SQL_NO_DATA)
break;
if (rc == SQL_SUCCESS)
{
printf("%ld %s\n", (long) longvalue, charvalue);
}
else
{
print_diag("SQLFetch failed", SQL_HANDLE_STMT, hstmt);
//exit(1);//commented by yangyao
}
}
rc = SQLFreeStmt(hstmt, SQL_CLOSE);
CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt);
printf("\nSelect fropm table %s done.\n",table_name);
}
6. 删除表 table_name。
//drop table
void drop_table()
{
// Allocate a statement
rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a statement failed", hstmt);
//drop sql statement
char drop_sql[100];
snprintf(drop_sql,sizeof(drop_sql),"drop table %s",table_name);
//execute drop_sql
rc = SQLExecDirect(hstmt, (SQLCHAR *) drop_sql, SQL_NTS);
CHECK_STMT_RESULT(rc, "SQLExecDirect drop failed", hstmt);
printf("Drop table %s done.\n",table_name);
}
程序所使用的 main 函数如下:
#include "common.h"
void main()
{
connect(); //connect to database.
create_table();//create a table
insert_into_table();//insert into table
select_all();//select * from table and print result
drop_table();//drop table
}
本节介绍 C# 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
namespace catt1{
class Program{
static void Main(string[] args){
try{
//connect odbc by specifying DSN name
OdbcConnection connection = new OdbcConnection("DSN=your_inceptor_odbc_data_source_name");
connection.Open();
//create table
string createTable = "create table tt(c1 int , c2 int) stored as holodesk";
OdbcCommand command = new OdbcCommand(createTable, connection);
command = new OdbcCommand(createTable, connection);
command.ExecuteNonQuery();
//insert data
string insertTable = "insert into tt(c1,c2) values(?,?)";
command = new OdbcCommand(insertTable, connection);
command.CommandType = System.Data.CommandType.Text;
command.Parameters.AddWithValue("@c1", 1);
command.Parameters.AddWithValue("@c2", 2);
command.ExecuteNonQuery();
//select data with DataReader
string selectTalbe = " select * from tt";
command = new OdbcCommand(selectTalbe, connection);
OdbcDataReader reader = command.ExecuteReader();
while (reader.Read()){
Console.Out.Write(reader[0].ToString() + "\t");
Console.Out.WriteLine(reader[1].ToString());
}
//select data with OdbcDataAdapter
OdbcDataAdapter da = new OdbcDataAdapter(selectTalbe, connection);
System.Data.DataSet ds = new System.Data.DataSet();
da.Fill(ds, "tt");
//drop table
string dropTable = "drop table if exists tt";
command = new OdbcCommand(dropTable, connection);
command.ExecuteNonQuery();
//close connection
connection.Close();
}catch (Exception ex){
Console.WriteLine(ex.Message);
}
}
}
}
本节介绍 Python 语言开发环境下,如何完成连接Inceptor/ArgoDB数据库、创建表、插入数据、查询数据和删除表的相关操作。
使用该代码前,请先安装 pyodbc 模块。
import pyodbc
#connect odbc
cnxn = pyodbc.connect("DSN=your_inceptor_odbc_data_source_name")
# Python 2.7, 避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(str, encoding='utf-8')
cnxn.setencoding(unicode, encoding='utf-8')
# Python 3.x,避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(encoding='utf-8')
cursor = cnxn.cursor()
#create table
cursor.execute("create table tt(c1 int , c2 int) stored as holodesk")
#insert data,INSERT INTO VALUES 语法只支持 Holodesk、TORC 等事务表,其余表只支持 INSERT INTO SELECT 插入。
cursor.execute("insert into tt values (?,?)", 1,1)
cursor.execute("insert into tt values (?,?)", 2,2)
#select data
row = cursor.execute("select * from tt").fetchone()
print row
#drop table
cursor.execute("drop table tt")
cnxn.close()
本节介绍 Perl 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
由于 Per 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 Inceptor,在执行示例代码前,您还需要编译安装这两个模块,以 CentOS 65 为例:
1. 安装 DBI
# 安装 DBI 所需的依赖包
yum install perl perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
# 下载并编译安装 DBI
wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBI/DBI-1.630.tar.gz
tar -xvzf DBI-1.630.tar.gz
cd DBI-1.630
perl Makefile.PL
make
make install
2. 安装 DBD::ODBC。
wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBD/DBD-ODBC-1.52.tar.gz
tar -xvzf DBD-ODBC-1.52.tar.gz
cd DBD-ODBC-1.52
perl Makefile.PL
make
make install
完成上述操作后,即可尝试运行下述 Perl 示例代码:
#!/usr/bin/perl
use strict;
use DBI;
my $data_source="DBI:ODBC:your_odbc_data_source_name";
my $dbh=DBI->connect($data_source,"","", {AutoCommit => 1,PrintError=>1,RaiseError=>1});
sub select_data(){
print "select data ...\n";
my $sth=$dbh->prepare("select * from tt");
$sth->execute();
my @row;
while (@row = $sth->fetchrow_array) { # retrieve one row
print join(", ", @row), "\n";
}
$sth->finish();
}
sub insert_data(){
print "insert data ...\n";
my $sth=$dbh->prepare("insert into tt values (?,1)");
my $p = (1,2,3);
$sth->execute($p);
$sth->finish();
}
sub create(){
$dbh->do("create table tt(c1 int , c2 int) stored as holodesk");
}
sub drop(){
$dbh->do("drop table tt");
}
sub main(){
drop();
create();
insert_data();
select_data();
drop();
$dbh->disconnect();
}
my $ret =main();
exit($ret);
本节介绍 Ruby 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
由于 Ruby 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 Inceptor,在执行示例代码前,您还需要编译安装这两个模块。
1. 安装 Ruby
yum install ruby ruby-dev -y
2. 前往 Ruby-ODBC 下载站点,下载 0.9994 版本并将其放至 CentOS 65 设备 中。
3. 解压并安装 Ruby-ODBC。
# 解压文件并进入解压后目录
tar -zxvf ruby-odbc-0.994.tar.gz && cd ruby-odbc-0.994
# 编译安装,--with-odbc-dir 必须指向odbc driver manager的位置
# 例如 driver manager 的库为 /usr/lib/x86_64-linux-gnu/libodbc.so.1,则该选项如下
ruby ext/extconf.rb --with-odbc-dir=/usr/lib/x86_64-linux-gnu
4. 安装 DBI 和 DBD::ODBC
sudo gem install dbi
sudo gem install dbd-odbc
1. 下载并安装 Ruby,推荐下载 3.1.4-1 版本。
2. 执行下述命令,安装 Ruby-ODBC。
gem install ruby-odbc
3. 执行下述命令,安装 DBI 和 DBD::ODBC。
gem install dbi
gem install dbd-odbc
完成上述操作后,即可尝试运行下述 Ruby 示例代码:
# inceptor_odbc.rb - simple Incepotr script using Ruby DBI module
require "dbi"
begin
# connect to the MySQL server
dbh = DBI.connect("dbi:ODBC:your_inceptor_data_source_name", "", "")
# create transaction table
dbh.do("create table rubytest(c1 int , c2 int) stored as holodesk")
#insert table
sth = dbh.prepare("INSERT INTO rubytest (c1,c2) VALUES(?,1)")
sth.execute(2);
sth.finish
#select data
sth = dbh.execute("SELECT * FROM rubytest")
sth.each do |row|
printf "c1: %d, c2: %d/n", row[0], row[1]
end
sth.finish
#drop table
dbh.do("drop table rubytest")
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
# disconnect from server
dbh.disconnect if dbh
end
本节介绍 PHP 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PHP and ODBC: XHTML Example 1</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<?php
$conn = odbc_connect("transwarp-hs2-lda", "", ""); // dsn name, user, password
if (!($conn)) {
echo "<p>Connection to DB via ODBC failed: ";
echo odbc_errormsg ($conn );
echo "</p>\n";
}
$create_table="create table phptest(c1 int , c2 int) stored as holodesk";
$success = odbc_do($conn,"drop table if exists phptest");
$success = odbc_do($conn,$create_table);
$success = odbc_exec($conn,"insert into phptest values(1, 2)");
$rs = odbc_exec($conn,"select * from phptest");
echo "<table><tr>";
echo "<th>Test</th></tr>";
while (odbc_fetch_row($rs))
{
$result = odbc_result($rs,"c1");
echo "<tr><td>c1: $result</td></tr>";
}
odbc_do($conn,"drop table if exists phptest");
odbc_close($conn);
echo "</table>";
?>
</body>
</html>
Inceptor / ArgoDB 支持 3.x 版本的 ODBC API,本文介绍支持的 API 列表供您参考,详细的用法介绍和一致性级别说明,见 Microsoft ODBC API 参考。
API | 一致性级别 | 说明 |
---|---|---|
SQLAllocHandle | ISO 92 | 分配环境、连接、语句或描述符句柄。 |
SQLConnect | ISO 92 | 在驱动程序和数据源间建立连接,连接句柄引用与数据源的连接的所有信息的存储,包括状态、事务状态和错误信息。 |
SQLDriverConnect | ODBC | 可替代 SQLConnect,使用连接字符串或对话框连接到数据源。 |
SQLBrowseConnect | ODBC | 发现和枚举连接到数据源所需的特性和属性值。 |
SQLAllocEnv | 已弃用 | 由 SQLAllocHandle 取代。 |
SQLAllocConnect | 已弃用 | 由 SQLAllocHandle 取代。 |
SQLAllocStmt | 已弃用 | 由 SQLAllocHandle 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLDataSources | ISO 92 | 返回数据源的相关信息,由驱动程序管理器实现。 |
SQLDrivers | ODBC | 返回驱动程序说明和属性信息,由驱动程序管理器实现。 |
SQLGetInfo | ISO 92 | 返回特定驱动程序和数据源的信息。 |
SQLGetFunctions | ISO 92 | 返回相关驱动程序是否支持函数。 |
SQLGetTypeInfo | ISO 92 | 返回数据源支持的数据类型信息。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLSetConnectAttr | ISO 92 | 设置连接属性。 |
SQLGetConnectAttr | ISO 92 | 返回连接属性的设置。 |
SQLSetEnvAttr | ISO 92 | 设置环境属性。 |
SQLGetEnvAttr | ISO 92 | 返回环境属性的设置。 |
SQLSetStmtAttr | ISO 92 | 设置语句属性。 |
SQLGetStmtAttr | ISO 92 | 返回语句属性的设置。 |
SQLSetConnectOption | 已弃用 | 由 SQLSetConnectAttr 取代。 |
SQLGetConnectOption | 已弃用 | 由 SQLGetConnectAttr 取代。 |
SQLSetStmtOption | 已弃用 | 由 SQLSetStmtAttr 取代。 |
SQLGetStmtOption | 已弃用 | 由 SQLGetStmtAttr 取代。 |
SQLParamOptions | 已弃用 | 由 SQLSetStmtAttr 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLGetDescField | ISO 92 | 获取单个描述符字段的值。 |
SQLGetDescRec | ISO 92 | 获取多个描述符字段的值。 |
SQLSetDescField | ISO 92 | 设置单个描述符字段。 |
SQLSetDescRec | ISO 92 | 设置多个描述符字段。 |
SQLCopyDesc | ISO 92 | 将描述符信息从一个描述符句柄复制到另一个描述符句柄。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLPrepare | ISO 92 | 准备稍后执行的 SQL 语句。 |
SQLBindParameter | ODBC | 将缓冲区绑定到 SQL 语句中的参数标记。 |
SQLGetCursorName | ISO 92 | 返回与指定语句句柄关联的游标名。 |
SQLSetCursorName | ISO 92 | 设置游标名。 |
SQLSetScrollOptions | 已弃用 | 由 SQLGetInfo 和 SQLSetStmtAttr 取代。 |
SQLSetParam | 已弃用 | 由 SQLBindParameter 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLExecute | ISO 92 | 执行已准备的 SQL 语句。 |
SQLExecDirect | ISO 92 | 执行 SQL 语句。 |
SQLNativeSql | ODBC | 返回由驱动程序翻译的 SQL 语句文本。 |
SQLDescribeParam | ODBC | 返回语句中的参数信息,Connector/ODBC不支持,返回结果仅为参考。 |
SQLNumParams | ISO 92 | 返回 SQL 语句中参数的数量。 |
SQLParamData | ISO 92 | 与 SQLPutData 结合使用,在执行时提供参数数据。 |
SQLPutData | ISO 92 | 发送参数的部分或全部数据值。 |
SQLTransact | 已弃用 | 由 SQLEndTran 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLRowCount | ISO 92 | 返回受 INSERT、UPDATE、DELETE 请求语句所影响的行数。 |
SQLNumResultCols | ISO 92 | 返回结果集中列的数量。 |
SQLDescribeCol | ISO 92 | 返回结果集中列的信息。 |
SQLColAttribute | ISO 92 | 返回结果集中列的描述符信息。 |
SQLFetch | ISO 92 | 返回多行结果数据。 |
SQLFetchScroll | ISO 92 | 返回滚动的数据行。 |
SQLSetPos | ODBC | 设置行集中的游标位置,并允许应用程序刷新行集中的数据或更新/删除结果集中的数据。 |
SQLBulkOperations | ODBC | 执行批量插入和批量书签操作,包括通过书签进行更新、删除和提取。 |
SQLMoreResults | ODBC | 确定是否有更多结果集可用,如有则执行初始化以对结果集进行处理。 |
SQLGetDiagField | ISO 92 | 返回诊断记录的单个字段的当前值,包含错误、警告和状态信息。 |
SQLGetDiagRec | ISO 92 | 返回诊断记录的多个字段的当前值,包含错误、警告和状态信息。 |
SQLBindCol | ISO 92 | 将应用程序数据缓冲区绑定到结果集中的列。 |
SQLGetData | ISO 92 | 返回结果集一行的部分/全部数据列数据。 |
SQLError | 已弃用 | 由 SQLGetDiagRec 取代。 |
SQLColAttributes | 已弃用 | 由 SQLColAttribute 取代。 |
SQLExtendedFetch | 已弃用 | 由 SQLFetchScroll 取代。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLColumnPrivileges | ODBC | 返回指定表的列和关联权限的列表。 |
SQLColumns | Open Group | 返回指定表的列名。 |
SQLForeignKeys | ODBC | 返回外键的列名。 |
SQLPrimaryKeys | ODBC | 返回主键的列名。 |
SQLSpecialColumns | Open Group | 返回指定表中列的信息,包含唯一标识表中行的最佳列集、事务更新行中的任何值时自动更新的列。 |
SQLStatistics | ISO 92 | 返回有关单个表的统计信息。 |
SQLTablePrivileges | ODBC | 返回表列表与每个表关联的特权信息。 |
SQLTables | Open Group | 返回指定数据源中的表名。 |
SQLProcedures | ODBC | 返回指定数据源中的过程名。 |
SQLProcedureColumns | ODBC | 返回过程的参数和结果集列。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLFreeStmt | ISO 92 | 结束语句处理,放弃挂起的结果,释放与语句句柄关联的所有资源。 |
SQLCloseCursor | ISO 92 | 关闭已在语句句柄上打开的游标,同时丢弃挂起的结果。 |
SQLCancel | ISO 92 | 取消语句的处理。 |
SQLCancelHandle | ODBC | 取消对连接或语句的处理。 |
SQLEndTran | ISO 92 | 提交或回滚事务。 |
API | 一致性级别 | 说明 |
---|---|---|
SQLDisconnect | ISO 92 | 关闭连接。 |
SQLFreeHandle | ISO 92 | 释放与特定环境、连接、语句或描述符句柄关联的资源。 |
SQLFreeConnect | 已废弃 | 由 SQLFreeHandle 取代。 |
SQLFreeEnv | 已废弃 | 由 SQLFreeHandle 取代。 |
ArgoDB/Inceptor 目前采用的 ODBC 驱动为 3.x 版本,当用其调用 2.x 版本的应用程序时,会根据下表自动映射并转换。
ODBC 2.x | ODBC 3.x |
---|---|
SQLAllocConnect | SQLAllocHandle |
SQLAllocEnv ① | |
SQLAllocStmt | |
SQLBindParam | SQLBindParameter |
SQLColAttributes | SQLColAttribute |
SQLError | SQLGetDiagRec |
SQLFreeConnect | SQLFreeHandle |
SQLFreeEnv | |
SQLFreeStmt | |
SQLGetConnectOption | SQLGetConnectAttr |
SQLGetStmtOption | SQLGetStmtAttr |
SQLParamOptions | SQLSetStmtAttr |
SQLSetConnectOption | SQLSetConnectAttr |
SQLSetParam | SQLBindParameter |
SQLSetScrollOption | SQLSetStmtAttr |
SQLSetStmtOption | |
SQLTransact | SQLEndTran |
①:应用程序通过 ODBC 3.x 驱动调用该接口时,会自动调用 SQLSetEnvAttr 并将 SQL_ATTR_ODBC_VERSION 环境属性设置为 SQL_OV_ODBC2,再映射到 SQLAllocHandle。
Catelog API 字符串参数分为四种不同类型的:普通参数(OA)、模式值参数(PV)、标识符参数(ID)和值列表参数(VL),更多介绍,见Catelog API。下表列出了当前对 Catelog API 的支持情况:
函数 | 参数 | SQL_时键入 ATTR_METADATA_ID = SQL_FALSE | 是否支持 | SQL_时键入 ATTR_METADATA_ID = SQL_TRUE | 是否支持 |
---|---|---|---|---|---|
SQLColumnPrivileges | CatalogName SchemaName TableName ColumnName | OA OA OA PV | ❌ | ID ID ID ID | ❌ |
SQLColumns | CatalogName SchemaName TableName ColumnName | OA PV PV PV | ✅ | ID ID ID ID | ❌ |
SQLForeignKeys | PKCatalogName PKSchemaName PKTableName FKCatalogName FKSchemaName FKTableName | OA OA OA OA OA OA | ❌ | ID ID ID ID ID ID | ❌ |
SQLPrimaryKeys | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLProcedureColumns | CatalogName SchemaName ProcName ColumnName | OA PV PV PV | ❌ | ID ID ID ID | ❌ |
SQLProcedures | CatalogName SchemaName ProcName | OA PV PV | ❌ | ID ID ID | ❌ |
SQLSpecialColumns | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLStatistics | CatalogName SchemaName TableName | OA OA OA | ❌ | ID ID ID | ❌ |
SQLTablePrivileges | CatalogName SchemaName TableName | OA PV PV | ❌ | ID ID ID | ❌ |
SQLTables | CatalogName SchemaName TableName TableType | PV PV PV VL | ✅ | ID ID ID VL | ❌ |
如果上述内容对您有提供帮助,欢迎多多点赞支持~😎