ODBC开发流程详解、示例以及API支持说明__ODBC开发指南(下)

友情链接:


ODBC 开发流程

Inceptor 支持完整的 SQL 标准语法,可兼容Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍应用程序与 Inceptor 数据交互的通用流程:

image.png

您可以基于业务需求灵活调整上述流程,各步骤说明如下:

在开发应用程序前,您需要根据上一篇内容手动完成 Windows/Linux 平台下 ODBC 驱动安装和数据配置

1. 建立连接

  • 分配 Environment Handle 和 Connection Handle
  • 设置 ODBC 版本并连接到 Inceptor
  • 设置可选的 Connection Attribute

2. 初始化操作

  • 分配 Statement Handle
  • 设置可选的 Statement Attribute

3. 执行 SQL:准备 SQL 语句并执行。

4. 获取结果集:根据执行的 SQL 类型获取结果集:

  • SELECT/SHOW/Catalog API:获取列信息、行信息等,将数据加入缓存
  • DELETE/UPDATE/INSERT:获取受影响的行数

5. 处理事务:提交或回滚事务,如无事务操作则无需此步骤。

6. 断开连接:断开连接,释放 Connection Handle 和 Environment Handle。


示例代码

为帮助您更好地上手 Inceptor 相关应用程序的开发,本章节提供了多种语言的示例代码,演示如何操作 Inceptor 数据库。

  • C 示例代码
  • C# 示例代码
  • Python 示例代码
  • Perl 示例代码
  • Ruby 示例代码
  • PHP 示例代码


C 示例代码

本节介绍 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# 示例代码

本节介绍 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 示例代码

本节介绍 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 示例代码

本节介绍 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 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

环境准备

由于 Ruby 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 Inceptor,在执行示例代码前,您还需要编译安装这两个模块。

CentOS 平台

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

Windows 平台

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 示例代码

本节介绍 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>


ODBC API 支持

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 将描述符信息从一个描述符句柄复制到另一个描述符句柄。

准备 SQL 请求

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 取代。


API 映射关系说明

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 支持说明

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




如果上述内容对您有提供帮助,欢迎多多点赞支持~😎

点赞.png下箭头,指向下箭头.png

评论
登录后可评论
发布者
星小环分享号
文章
180
问答
205
关注者
27
banner
关注星环科技
获取最新活动资讯

加入TDH社区版技术交流群

获取更多技术支持 ->

扫描二维码,立即加入