海关二期gbase8a集群使用手册-8ampp cluster程序员odbc篇_第1页
海关二期gbase8a集群使用手册-8ampp cluster程序员odbc篇_第2页
海关二期gbase8a集群使用手册-8ampp cluster程序员odbc篇_第3页
海关二期gbase8a集群使用手册-8ampp cluster程序员odbc篇_第4页
海关二期gbase8a集群使用手册-8ampp cluster程序员odbc篇_第5页
免费预览已结束,剩余75页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

GBase8aMPPCluster程序员手册ODBC篇,南大通GBase©2004-2015,保留所利本文档所涉及的软件著作权、和知识已依法进行了相关、登记,由南大通用数识保护条例》和相关国际条约、法律、以及其它知识法律和条约的保护本文档包含的南大通用公司的信息由南大通用公司合法拥有,受法律的保护,南大通用华苑产业区海泰发展六道6号海泰绿色产业J座 是南大通用数据技术向中民国家商标局申请的注册商标,商标权由南大通用公司合法拥有,受法律保护。南大通用公司许可,任何单位及个人不得以任何方式或理由对该商标的进行使用、、修改、传播、抄录或与其它产品使用销售。凡南大通用公司商标权的,南大通用公司将依法目前 手册简 公 ODBC概 ODBC简 ODBC驱动管理 ODBC驱动管理器安 GBase8aMPPClusterODBC综 GBase8aMPPClusterODBC简 GBase8aMPPClusterODBC版 安装文 GBase8aMPPClusterODBC体系结 支持平 GBase8aMPPClusterODBC使 安装GBase8aMPPClusterODBC驱 windows平台上安装GBase8aMPPCluster linux平台上安装GBase8aMPPCluster 创建GBase8aMPPClusterODBC数据源 windows平台上创建数据 linux平台上创建数据 GBase8aMPPClusterODBC连接参 创建GBase8aMPPClusterODBC连接字符 GBase8aMPPClusterODBC高可用功 高可用性简 高可用性使用方 GBase8aMPPClusterODBC负载均衡功 负载均衡简 负载均衡的使用方 GBase8aMPPClusterODBC连接 南大通用数据技 IGBase8aMPPClusterODBC连接池简 GBase8aMPPClusterODBC连接池使用方 开启GBase8aMPPClusterODBC连接 设置连接池初始化大 设置获取连接超时时 设置获取连接时使用的负载均衡策 借还连接时测试连接可用 清理无效连 维持空闲连接 清理过期连 释放连接 GBase8aMPPClusterODBC应用开 GBase8aMPPClusterODBCAPI介 GBase8aMPPClusterODBC数据类 GBase8aMPPClusterODBC错误代 GBase8aMPPClusterODBC应用示 使用ODBCGBase数据 高可用性示 负载均衡示 连接池示 GBase8aMPPClusterODBC常见问 支持动态游 使用unixODBCGBase数据库时出现段错 多线程使用unixODBCGBase数据库的配 python语言调用GBase8aMPPClusterODBC驱 perl语言调用GBase8aMPPClusterODBC驱 php语言调用GBase8aMPPClusterODBC驱 前手册GBase8aMPPCluster程序员手册从程序员进行数据库开发的角度对GBase8aMPPCluster进行详细介绍。本手册介绍供客户端连接GBase8aMPPCluster服务器用的GBase8aMPPClusterODBC接口驱动程序。GBaseODBC3.X准提供支持。本部分告诉用户如何安装和使用GBase8aMPPClusterODBCODBC一起工作的程序的信息,并回答了一些最常见的关于ODBC的问题。公下面的文本约定用于本文约说加粗字表示文档标大写英文表示GBase8aMPPCluster等宽字表示代码示…表示被省略的内容ODBCODBCGroup说明书开发,并定义了一系列的函数调用,错误代码和数据类型,这些可ODBC是应用程序广泛使用的数据库接口。它是基于对数据库APIs的X/OpenISO/IEC(CLI)规范,并且使用结构化查询语信息,参考请参考微软公司的相关内容。ODBC驱动管ODBC驱动管理器是管ODBC和驱动程序之间的通信的库。它的主要功解析数据源名字装载和卸载驱动程处理ODBCWindows的ODBCODBCwindows操作系统已经集成了ODBC驱动管理器。通过“控制面板\管理工\数据源(ODBC64位windows6432的ODBC驱动管理器,64位客户端应用程序需要调用64位的ODBC驱动管理器,它位于“C:\WindowsSystem32\odbcad32.exe”;32SsO64obad2exlinux操作系统下需要unixODBCiODBC来使用GBase8aMPPClusterODBC驱动荐使用unixODBC驱动管理器unixODBC的安装包一般与GBase8aMPPClusterODBC的安装一同提供。您可以到unixODBC。然后使用#rpm-ivhunixODBC-2.2.14-#rpm-ivhunixODBC-devel-2.2.14-安装成功后您可以通过如下命令查看unixODBC的安装信#odbcinst-junixODBC2.2.14 SYSTEMDATASOURCES:FILEDATASOURCES..:/etc/ODBCDataSourcesUSERDATASOURCES..:/home/gbase/.odbc.iniSQLULENSize.......:8SQLLENSize........:SQLSETPOSIROWSize.:GBase8aMPPClusterODBCGBase8aMPPClusterODBCGBase8aMPPClusterODBCGBase数据库的ODBC程序,通过GBase8aMPPClusterODBC驱动可以所有GBase数据库。GBase8aMPPClusterODBCODBC3.5X一级规范(API+2。GBase8aMPPClusterODBCGBase8aMPPClusterODBC说支持集群的数据库连接支持集群高可用和负载均稳定安装我们提供的ODBC接口bin文件(linux版本GBaseODBC-<productversion>-<buildversion>-<osversionand例如GBaseODBC-8.3.81.53-build53.5-redhat6-x86_64.bin。我们提供的ODBC接口的bin文件(window版本)格式如下GBaseODBC-<productversion>-<buildversion>-<osversionandGBase8aMPPClusterODBCGBase8aMPPClusterODBC2-1GBase8aMPPClusterODBC应应调用OBCPI实现对Gase数据的用准的ODBC调用与驱动程序管理器通信。应用并不关心数据在哪里,如何的或何来只数(SN不管应用程序如何使用ODBC,它们有许多共同的选择GBase服务器并连提交SQL获得结果(如果有处理错执行或回滚包含在SQL语句中的事断开到GBase服务器的大多数的数据工作都是由SQL完成的,使用ODBC的应用主要任务就是提交SQL语句并获得由这些语句产生的结果。驱动管理驱动管理器是一个管理应用与驱动程序之间通信的库。它执行下面解析数据源名字驱动程序装载和卸处理ODBC函数调用或将它们传递给驱动程GBase8aMPPClusterODBCGBase8aMPPClusterODBCODBCAPI它处理ODBC函数调用,提交对GBase服务器的SQL请求,并返回结果给应用程便于使该请求符合GBase数据库支持的语法。ODBC.INI是ODBC配置文件,该文件了GBase8aMPPClusterODBC驱动程序连接服务器和数据库的相关信息。例如GBase8aMPPClusterODBCODBC.INIGBase8aMPPClusterODBC驱动程序基于相对应的DSN,系统使用它来连接参数。GBaseGBase服务器是数据源。它是一个关系数据库管理系统(RDBMS支持GBase8aMPPClusterODBCLinux操作系GBase8aMPPClusterODBC本节描述了GBase8aMPPClusterODBC驱动,创建GBase8aMPPClusterODBCGBase8aMPPClusterODBCGBase8aMPPClusterODBCwindowsGBase8aMPPCluster首先,执行安装包GBaseODBC_8.3.81.53_build53.11_W64.exe。其中,安装 执行Isal.at。图3-2命令行窗口下执行Install.batGBase8aMPPClusterODBC驱动信息,如下图所示。3-3GBase8aMPPClusterODBC64,64C:\Windows\System32\odbcad32.exe;32位的数据源管理器路径C:\Windows\SysWOW64\linux平台GBase8aMPPCluster获取ODBC安装包GBaseODBC_<productversion>_<buildversion>_<osversionandarchtecture>.bin到文件系统的某个 为ODBC安装包增加执行权限,使用root用户执行如下命令进行#安装完之后执行如下命令GBase8aMPPClusterODBC驱#gsodbc-installer-d-a-n"GBase8aMPPClusterODBC8.3-t"DRIVER=/usr/lib/libgsodbc8.so;或者用vim打开/etc/odbcinst.ini文件,增加如下[GBase8aMPPClusterODBC8.3Driver] UsageCount=1DontDLClose= =AIX上安GBase8aMPPCluster安装unixODBC数据源管理使用root用户执行unixODBC-2.3.0-AIX5.3.bin命令,执行后 下(/usr/bin,/usr/libunixODBC文件列表如 │libl.alibl.la安装GBaseODBC使用root命令,执行后会将GBaseODBC驱动安装到 下在/etc/odbcinst.ini文件中增加如下内容cat/etc/odbcinst.ini[GBaseODBC8.3Driver]UsageCount=DontDLClose= =GBase8aMPPClusterODBC息,GBase就知道在什么地方数据库和当开始时使用什么设置。数据源是数据的有效路径。它标识了一个运行的GBase服务器,以及windows建数在Windows中数据源信息可能存在于两个地方在Windows表中(Windows系统,或在一DSN文件中(对任何系统如果信息在SN(WnowsbDBC数据源管理器可以更新用户的数据源连接信息。当用户添加数据源时,ODBC数据源管理器为用户更新息。创建数据源的步骤如下所打开控制面OB)。这时出现OBC图3-4ODBC数据源管理如果用户数据源,选择“用户DSN”属性页;如果系统数据源,DSNDSN”属性页;在ODBC数据源管理器框中,单击添加。创建新数据源框出现GBaseODBC8.3DriverGBase8aMPPClusterODBC驱动程序-DSN配置框出现,如下所示图3-6GBase8aMPPClusterODBC驱动程序-DSN配置在描述框中,输入对DSN的描述在服务器名称框,输入用户要的GBase服务器主机的IP地址。缺省的,它是localhost。在用户框中,输入用户的GBase数据库用户名在框中,输入用户的在数据库框中,输入用户想作为缺省数据库使用的GBase数据库名字在连接选项中的端口框中,输入端 的缺省段5258点击确定来完成这个数据源的添注意当点击了确定,数据源管理框出现,ODBC管理器更新表信的连接值图3-7GBase8aMPPClusterODBC驱动程序测试成功框图3-8GBase8aMPPClusterODBC驱动程序测试失败可以点击“高级”选项,来进行一些高级设置,DSN配置框页有选项按钮。如果用户选择它,会出现下面的选项框,显示控制驱动程序行为。关于这图3-9GBase8aMPPClusterODBC驱动程序-DSN高级配置框在Windows中修改一个数据源;打开ODBC数据源管理器。单击适当的DSN选择用户想GBase数据点击配置出现GBase8aMPPClusterODBCDriver驱动程序-DSN配置框;修改适当的数据源域,然后点击确当用户在这个框中完成修改后,ODBC管理器会更新信息在linux上创建数据源有两种方式,一种是修改unixODBC的配置文odbc.inigsodbc-installerodbc.ini使用unixODBC提供令“odbcinst-j”可以查找到odbc.ini的路径。#odbcinst-j SYSTEMDATASOURCES:FILEDATASOURCES..:/etc/ODBCDataSourcesUSERDATASOURCES..:/root/.odbc.iniSQLULENSize.......:8SQLLENSize........:SQLSETPOSIROWSize.:Driver=GBase8aMPPClusterODBC8.3DriverDATABASE=testDESCRIPTION=GBase8aMPPClusterODBC8.3DriverSERVER=UID=rootPASSWORD=1gsodbc-installer使用gsodbc-installerGBase8aMPPCluster连接字符串。有关GBase8aMPPClusterODBC3.4小节。使用gsodbc-installer创建数据源令如#gsodbc-installer-s-a-c2-n"test"-t"DRIVER=GBase8aMPPClusterODBC8.3Driver;UID=gbase;PWD= ;创建GBaseODBCetc/odbc.iniDriver=GBaseODBC8.3Driver测试创建的数据源连接性,可执行如下#isqltest-++|||||sql-||help||||+|+GBase8aMPPClusterODBCODBC.INIDataSourceName]部分为GBase8aMPPClusterODBCSQLDriverConnect()调用中使用InConnectionString参数。参默认注GBase服务器的主机名或IP空连接GBase服务器的用PWD/空连接GBase服务器空数据库名连接GBase服务器的在Windows中,用户可以通过数据源配置界面中的高级选项选择复选框来配置GBase8aMPPClusterODBC。同时在通过连接字符串使GBase8aMPP配置。在linux平台下使用这些参数时,用户可以将如下参数写入odbc.ini文件中并设置该参数值为1来使用如下表列出的关键字进行GBase8aMPPClusterODBC配置。参默认注连0使用压缩协0启动自动重0允许多0使用集群高可用0使用集群负载均空集群ID节点检测间隔(秒连接字符空在连接到server时执行的语0连接时不产生提示信源数0将BIGINT列转换为INT类00SQLDescribeCol()返回含0不产 结游标/结果0使用动态游0强制使用前向游0SQL_AUTO_IS_NULL00不缓存结果(只用于前向01update/deletelimit语法。参默认注项为0。0端获取FETCH_SIZE行的数据调0允许将查询记录到其0安F0从配置文件设0不支持事连接0连接池初始化时缓存的连000000载均衡策略)0轮询,1最0从连接池中借出连接时参默认注测试连接是否可00启动连接池管理模块(理无效连接连接池空闲连0启动连接池空闲连接功0启动连接池清理过期连接清理过期连接运行周期,单位GBase8aMPPClusterODBC用户可以SQLDriverConnect使用连接字符串连接GBase服务器GBase8aMPPClusterODBC8.3ConnectionString="DRIVER={GBase8aMPPClusterODBC8.3\SERVER={192.168.111.96};UID=gbase;\如果用户的编程语言将空白后的反斜杠转换成空格,更好的方法是指明连接字符串为一个单一的长字符串,或者使用多个字符串的连接,那样不会在其ConnectionString="DRIVER={GBase8aMPPClusterODBC8.3GBase8aMPPClusterODBC高可用高可用性简GBase8aMPPCluster使用GBase8aMPPClusterODBCGBase8aMPPCluster种方式,分别是配置并使用数据源名称和使用连接字符串。在windows平台下配置数据源名称时,需要在“服务器名称”一栏中填写GBase8aMPPCluster数据库所有节IP地址,并使用“;”分割符将其分割ClusterODBC的集群IP动路由功能就会开启。除非数据库集群的所有节点都不可用,否则GBase8aMPPClusterODBC4-1GBase8aMPPClusterODBCIP在linux平台上配置数据源名称时,修改odbc.ini文件中“SERVER”变量的值为GBase8aMPPCluster据库所有IP地址,使用“;”分割符将IP_ROUTE=1GBase8aMPPClusterODBC[ODBCDatatest=GBase8aMPPCluster =GBase8aMPPClusterODBC8.3Driver =test =GBase8aMPPClusterODBC8.3Drivertest = =使用GBase8aMPPClusterODBC"DRIVER={GBase8aMPPClusterODBC8.3Driver};"linuxGBase8aMPPClusterODBC[GBase8aMPPClusterODBC8.3Driver]Description=GBase8aMPPClusterODBCDriver=/usr/lib/libgsodbc8.soSetup=FileUsageThreadingDontDLCloseGBase8aMPPClusterODBC负载均负载均衡简GBase8aMPPClusterODBC供的高可用负载均衡功能是指,GBase8aMPPClusterODBC会将客户端请求的数据库集群连接平均分摊到集群所有可用的节点负载均衡的使用方GBase8aMPPClusterODBC两种方式来使用高可用负载均衡。一种是windows平台下需要使用ODBC数据源管理器打开GBase8aMPPClusterODBC5-1GBase8aMPPClusterODBCIPIPI(秒”是使用高可用负载60Bse8aPPCuserDBCLinux台下则需要odbcinst.iniodbc.ini数据源配置文件t/dbistii和/t/ob.ii的文件尾部。在/etc/odbcinst.ini文件中[GBase8aMPPClusterODBC8.3=GBase8aMPPCluster==1=0=1Driver=GBase8aMPPClusterODBC8.3DriverDATABASE=testDESCRIPTION=GBase8aMPPClusterODBC8.3DriverDSNSERVER=192.168.111.96;192.168.5.212;192.168.7.174UID=gbasePASSWORD=gbaseCONNECTION_BALANCE=GCLUSTER_ID=gclusterCHECK_INTERVAL=90"DRIVER=GBase8aMPPClusterODBC 如果在linux下使用连接字符串,需要在/etc/odbcinst.ini加往下[GBase8aMPPClusterODBC8.3Driver]Description=GBase8aMPPClusterODBC =/usr/lib/libgsodbc8.so =1 =DontDLClose=GBase8aMPPClusterODBC连接GBase8aMPPClusterODBC接池简GBase8aMPPClusterODBCGBase8aMPPClusterGBase8aMPPClusterMPPCluster的各节点上。周期性的GBase8aMPPClusterODBC连接池中各连接的有的接清理过期的连接GBase8aMPPClusterODBC接池使用本节以连接字符串为例GBase8aMPPClusterODBC池的使用方样可以将这些关键字写入到odbc.ini中来使用GBase8aMPPClusterODBC接池功能。或者使用gsodbc-installersac2ntest上连接字符串来一个带连接池的数据源,如下所示#gsodbc-installer-s-a-c2-n"test"-t"DRIVER=GBase8aMPPClusterODBC8.3Driver;UID=gbase;PWD= ;GBase8aMPPClusterODBCGBase8aMPPClusterODBCGCLUSTER_ID的值,然后设置POOL_MAX_ACTIVE_SIZE,POOL_MAX_IDLE的值大于0,且POOL_MAX_ACTIVE_SIZE的值大于等于POOL_MAX_IDLE的值。如下所示"DRIVER=GBase8aMPPClusterODBC8.3Driver;UID=gbase;PWD=gbase;""GCLUSTER_ID=gcluster;设置连接池初始化大POOL_INIT_SIZE的值来实现。通常POOL_INIT_SIZE的值小于等于"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;"设置获取连接超时时500毫秒。如下"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;"设置获取连接时使用的负载均衡策GBase8aMPPClusterODBC池提供了两种负载均衡策略,分别是轮询和最小BUSY连接数优先。使用轮询策略时设置POOL_LBS=0,使用最BUSY接数优先策略时设置POOL_LBS=1。默认时使用轮询策略。如下所示"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;"借还连接时测试连从借对进保连,归进接PO_ES_ORO=POLTETREUN1"DRIVER=GBase8aMPPClusterODBC "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;""POOL_TEST_BORROW=1;POOL_TEST_RETURN=1;"清理无效连期检测GBase8aMPPCluster节点的状态。如GBase8aMPPCluster节点恢复可用,GBase8aMPPClusterODBC接池将会缓存连接到该节点的ODBC连接。同时通过设POOL_TEST_INVALID_CONN_PERIOD可以设置清理无效连接的周期。该周期默认值20。如下所示"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;""POOL_MANAGER=1;POOL_TEST_INVALID_CONN_PERIOD=30;"维持空闲连POLKEPIDE=1OLMI_DLEOL_I_ILE的值小于POLMA_DLEPO_INILE闲连接数大于等于POOL_MIN_IDLE的值。打开维持空闲连接数功能必须置POOL_MANAGER=1。如下所"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;""POOL_MANAGER=1;POOL_TEST_INVALID_CONN_PERIOD=30;""POOL_KEEP_IDLE=1;清理过期连GBase8aMPPClusterODBCPOOL_CLEAR_OVERDUE,POOL_USED_LIFE和POOL_IDLE_LIFE来打开。如果POOL_USED_LIFE的值为0,那么已借出的连接不会过期,POOL_USED_LIFE默认值为POOL_IDLE_LIFE的值为那么空闲连接不会过期,POOL_IDLE_LIFE默认值为0。打开清理过期连接功能必须同时设置POOL_MANAGER=1如下所示"DRIVER=GBase8aMPPClusterODBC8.3 "GCLUSTER_ID=gcluster;POOL_MAX_ACTIVE_SIZE=80;POOL_MAX_IDLE=60;""POOL_MANAGER=1;POOL_TEST_INVALID_CONN_PERIOD=30;""POOL_CLEAR_OVERDUE=1;POOL_USED_LIFE=360000;释放连释放连接池需要按照如下方式调研释放连接池的接rc=SQLDriverConnect(hdbc,NULL,connStr,SQL_NTS,NULL,0,if{}SQL_FREE_GBASE_POOL,NULL);SQL_ATTR_GBASE_POOL_FREE的值为SQL_FREE_GBASE_POOL,然后调SQLDisconnect归还ODBC归还连接的同时会释放掉该连接所在的GBase8aMPPClusterODBC应用开GBase8aMPPClusterODBCGBase配置GBase8aMPPClusterODBC连接到GBase初始化操执行SQL重新得到结执行事与服务器断开连7-1GBase8aMPPClusterODBCGBase8aMPPClusterODBCAPI本节总结了ODBC程序,按照功能对它们进行了分对于完整的ODBCAPI参考,请参考微软公司技术支持中“ODBC程序参考”相关内容SQGtIfoGae8aMPlutrODBC的一致信息。要获取关于在驱动中支持的特定函数的信息,应用程序可以调用SLGtucto。注意对于向后兼容的功能上,GBase8aMPPClusterODBCDriver支持所有不推荐的函数。下面按照功能分类列出常用的GBase8aMPPClusterODBCAPI函数。和连接到一个数据源,如下和函数一致目是ISO是ISO通过数据源名、用户ID连接到是是不推获得一个从驱动分配的环是不推获得接句柄获得关于驱动和数据源的信息,如下表函数一致目否ISO否是ISO返回指定驱动和数据源的信息是ISO返回支持的驱动函数是ISO返回支持的数据类型信息设置和获得驱动属性,如下表格所函数一致目是设接的属性是返接的属性值是不推设接选项是不推返接的选项值是设置环境属是返回环境属性的值是设置一个语句属性是返回语句属性的值是不推设置一个语句选项是不推返回一个语句选项的值预处理SQL请求,如下表所函数一致目是不推分配一个语句句柄是ISO为稍后的执行预处理一个SQL是是ISO返回连接到语句句柄的游标名是ISO指定一个游标名是设置控制游标行为的选项提交请求,如下表格所函数一致目是ISO执行一个预处理语句函数一致目是ISO执行一个语是返回一个由驱动翻译的SQL语句文本是返回一个语句中指定参数是ISO返回一个语句中的参数个是ISO是ISO接收结果和关于结果的信息,如下表格函数一致目是ISO是ISO返回结果集中的列数是ISO描述结果集中的一是ISO描述结果集中一个列的属是不推描述结果集中一个列的属是ISO返回多行结是ISO返回可卷动的结果行是不推返回可卷动的结果行是是返回错误或者诊断信息,如下表格函数一致目是不推返回额外错误或者状态信是ISO是ISO获得关于数据源系统表(分类函数)项函数一致目是不推提交或者回滚一个事务是ISO提交或者回滚一个事务执行事务,如下表所函数一致目是不推提交或者回滚一个事务是ISO提交或者回滚一个事务终止一个语句,如下表格所函数一致目是ISO外可选的释放所有和语句句柄相关的是ISO关闭一个在处理语句时打开的游标是ISO取消一个SQL语句终止接,如下表格所函数一致目是ISO关闭连接是ISO是不推释放连接句是不推释放一个环境句柄GBase8aMPPClusterODBC下表指明了驱动如何映射本地服务器数据类型到默认的SQL和C数据类本地SQLCtinyintbigintlonglong本地SQLCintegerintdoubleGBase8aMPPClusterODBC下表列出了驱动返回的来自服务器的错误代码本地代SQLSTATESQLSTATE错误信一般警字符串数据右截选项改没有行更新超过一行更预处理语句没有使用游无效的描述符索连接名正在使用连接不存无效游标状无效事务状未知事务状无效的游标一般驱动定义错内存分配错无效的列无效的应用程序缓冲类无效的SQL数据类无效的null函数顺序错现在不能设置属无效的事务操作代内存管理错无可用的游标无效的属性无效字符串或者缓冲长本地代SQLSTATESQLSTATE错误信无效描述符域的标识无效属性/选项标无效参数个函数类型超出范获取的类型超出范行值超出范无效的游标没有执行优化特0列数和值数不匹0整数约0语法错误或0没有找到基本表或者视0没有找到索0列已经存0没有找到0通信连接失GBase8aMPPClusterODBC使用ODBCGBase数据#ifdef#include<windows.h>#include<unistd.h>#include<stdio.h>#include<sql.h>#include<sqlext.h>#defineFAIL#definePRINT_TABLE/*connchar*connStr="DRIVER=GBase8aMPPClusterODBC8.3 char*table_name=char*sql_ddl ="createtablet_tttt(aint,bchar* ="insertintot_ttttvalueschar* ="select*fromchar*sql_delete ="deletefromt_ttttwherea=1";char*sql_update a=1";char*sql_create_proce="createproceduredemo_p(inavarchar(100),outbvarchar(100))"',a,'works!');

"begin"setb=char*sql_drop_proce ="dropproceduredemo_p";char*sql_call_proce ="CALLdemo_p(?,@out)";char*sql_select_out ="select@out";SQLHENVSQLHDBCconstchar*usage="%ss[D(DDL),d(delete),u(update),i(insert),p(proce),P(dropproce),c(callproce)]\n";intprint_select(SQLHSTMThstmt,char*voidprint_table(SQLHSTMThstmt,char*constchar*text,constchar*file,intline);#defineok_env(environ,call)\do{\SQLRETURNrc=(call);print_diag(rc,SQL_HANDLE_ENV,(environ),#call,LINE);\

FILEif(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO)returnFAIL;}while#defineok_con(con,call)\do{\SQLRETURNrc=(call);print_diag(rc,SQL_HANDLE_DBC,(con),#call,FILE,LINE\if(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO)returnFAIL;}while#defineok_sql(statement,query)\do{\SQLRETURNrc=SQLExecDirect((statement),(SQLCHAR*)(query),SQL_NTS);\print_diag(rc,SQL_HANDLE_STMT,(statement),SQL_NTS)",

"SQLExecDirect("#statement",\""queryFILE LINE);if(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO)returnFAIL;}while#defineok_stmt(statement,call)\do{\SQLRETURNrc=(call);print_diag(rc,SQL_HANDLE_STMT,(statement),#call,LINE);\

FILEif(rc!=SQL_SUCCESS&&rc!=SQL_SUCCESS_WITH_INFO)returnFAIL;}whileint{SQLHSTMTprintf("execsql:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));printf("selectresult:\n");return0;}int{SQLHSTMTprintf("execsql:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_delete,SQL_NTS));return0;}int{SQLHSTMTprintf("execsql:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_update,SQL_NTS));print_table(hstmt,table_name);return}int{SQLHSTMTprintf("execsql:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_insert,SQL_NTS));print_table(hstmt,table_name);return}int{SQLHSTMTprintf("createproc:\n\t%s\n",sql_create_proce);ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_create_proce,printf("createprocsuccess.\n");return0;}int{SQLHSTMTprintf("dropproc:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_drop_proce,SQL_NTS));printf("dropprocsuccess\n");return}int{SQLHSTMThstmt;char*str1="input";SQLINTEGERstr1_cb=charstr2[100]={'\0'};SQLINTEGERstr2_cb;printf("execproc:\n\t%s\n",ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,ok_stmt(hstmt,SQLPrepare(hstmt,sql_call_proce,SQL_NTS));ok_stmt(hstmt,SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_VARCHAR,100,0,str1,6,ok_stmt(hstmt,SQLExecute(hstmt));printf("procresult:\n");return0;}int{SQLHSTMThstmt;ok_con(hdbc,SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt));ok_stmt(hstmt,SQLExecDirect(hstmt,sql_ddl,SQL_NTS));return0;}intmain(intargc,char**{SQLRETURNrc=if(argc<{}ok_env(henv,SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc));ok_con(hdbc,SQLDriverConnect(hdbc,NULL,connStr,SQL_NTS,NULL,0,NULL,{casecasecasecasecasecasecasecaseprintf(usage,}ok_con(hdbc,ok_con(henv,SQLFreeHandle(SQL_HANDLE_DBC,hdbc));ok_env(henv,SQLFreeEnv(henv));return}intprint_select(SQLHSTMThstmt,char*{intnum_cols=0;inti=0;intbuff_len=1024;intval_len=0;SQLSMALLINTcol_type,tnum=unsignedchar*buff=(unsignedchar*)malloc(buff_len);SQLExecDirect(hstmt,sql,SQL_NTS);ok_stmt(hstmt,SQLNumResultCols(hstmt,&tnum));num_cols=tnum;for(i=1;i<=num_cols;{ok_stmt(hstmt,SQLDescribeCol(hstmt,i,buff,buff_len,NULL,NULL,NULL,NULL,NULL));printf("|%s\t",}for(i=1;i<=num_cols;{ }while(SQL_SUCCESS=={for(i=1;i<=num_cols;{col_type=memset(buff,0,val_len=ok_stmt(hstmt,SQLGetData(hstmt,i,SQL_C_CHAR,buff,buff_len,&val_len));printf("|%s\t",}}return0;}voidprint_table(SQLHSTMThstmt,char*{charsql_select[500]="select*from";inti=0;if(0=={}printf("printtable%s.\n",while(table_name[i]){sql_select[14+i]=table_name[i];i++;}sql_select[14+i]='\0';print_select(hstmt,}constchar*text,constchar*file,intline){if(rc!={ SQLINTEGERnative_error; /**@todomaprctoSQL_SUCCESS_WITH_INFO,etc*/printf("#%s=%d\n",text,rc);/**@todoHandlemultiplediagnosticrecords.*/drc=SQLGetDiagRec(htype,handle,1,sqlstate,&native_error,message,SQL_MAX_MESSAGE_LENGTH-1,ifprintf("#[%6s]%*sin%sonline%d\n",sqlstate,length,message,file,line);printf("#DidnotgetexpecteddiagnosticsfromSQLGetDiagRec()=%dinfile%sonline%d\n",drc,file,line);}}高可用性示#ifdefWIN32#defineisSuc(result)((result)==SQL_SUCCESS||(result)==charhosts[][100]={"192.168.5.64",int{charconn_format[200]="DRIVER={GBase8aMPPClusterODBC8.3charconn[200]={'\0'};inti=0;shortsret;//返回代码void*henv;//环境句柄void*hdbc;sret=/**设置环境属性,ODBC版本**/sret=if(!isSuc(sret))printf("ODBC版本出错\n");/**sret=if(!isSuc(sret))printf("申请连接句/**sret=SQLSetConnectAttr(hdb if(!isSuc(sret))printf("设置连接属{sprintf(conn,conn_format,/**sret=SQLDriverConnect(hdbc,NULL,(unsignedcharSQL_NTS,NULL,0,NULL,elseprintf("连接%s成功\n",hosts[i]);memset(conn,'\0',strlen(conn));}return}负载均衡示#ifdef#include<windows.h>#include<unistd.h>#include<stdio.h>#include<sql.h>#defineisSuc(result)((result)==SQL_SUCCESS||(result)==char*conn_str="DRIVER=GBase8aMPPClusterODBC8.3 int{shortsret;void*henv;void*charmessage[512];inti=0;sret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);{SQLGetDiagRec(SQL_HANDLE_ENV,henv,1,NULL,(SQLCHAR*)message,1023,return-1;}sret={SQLGetDiagRec(SQL_HANDLE_ENV,henv,1,NULL,(SQLCHAR*)message,1023,return-1;}sret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);{SQLGetDiagRec(SQL_HANDLE_ENV,henv,1,NULL,NULL,(SQLCHAR*)message,1023,NULL);return-1;}for(i=0;i<6;{sret=SQLDriverConnect(hdbc,NULL,(SQLCHAR*)conn_str,SQL_NTS,NULL,0,NULL,0);{SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,NULL,NULL,(SQLCHAR*)message,1023,NULL);return-1;}SQLGetInfo(hdbc,SQL_SERVER_NAME,hostinfo,200,printf(GBase8aMPPClusterODBCGBases.\n",sret=SQLDisconnect(hdbc);{SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,NULL,NULL,(SQLCHAR*)message,1023,NULL);return-1;}}sret=SQLFreeConnect(hdbc);{SQLGetDiagRec(SQL_HANDLE_DBC,hdbc,1,NULL,(SQLCHAR*)message,1023,return-1;}sret=SQLFreeEnv(henv);{SQLGetDiagRec(SQL_HANDLE_ENV,henv,1,NULL,(SQLCHAR*)message,1023,return-1;}return}连接池#ifdef#include#definesleep(x)Sleep(x*1000)#include<unistd.h>#include<stdio.h>#include<sql.h>#include<time.h>#defineisSuc(result)((result)==SQL_SUCCESS||(result)==#defineFOR_TIMES#defineCON_NUMSQLHANDLEintseg;CRITICAL_SECTIONthread_quit_lock;#defineTHREAD_ID()GetCurrentThreadId()pthread_mutex_tthread_quit_lock;#defineTHREAD_ID()pthread_self()voidgetError(SQLSMALLINTtype,SQLHANDLE{SQLINTEGERnumerror;SQLSMALLINTerrlen;SQLGetDiagRec(type,handle,1,sqlstate,&numerror,errormes,1024,&errlen);errormes,numerror);}char*connStr="DRIVER=GBase8aMPPClusterODBC8.3 =test;"POOL_KEEP_IDLE=1;POOL_MIN_IDLE=12;"#ifdefDWORDWINAPIthread_bf(LPVOIDarg)intthread_bf(void*arg){SQLHDBCSQLHANDLEintsret=0;inti=0;clock_tt1,t2;time_tt;intrc=while(i<{0,NULL,

t1=t2=clock();sret=SQLDriverConnect(hdbc,NULL,connStr,if{}{

getError(SQL_HANDLE_DBC,t2=clock();printf("threadid%u\t\tconnectsuccess!usemsec\t%s.\n",THREAD_ID(),(t2-t1),rc=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hsmt);if(rc==SQL_SUCCESS){}

SQLExecDirect(hsmt,"showdatabases",SQLFreeHandle(SQL_HANDLE_STMT,}#ifdef}void{

SQLHDBCintrc=0,i=#ifdefseg=CON_NUM;{}

#ifdefCreateThread(NULL,0,thread_bf,NULL,0,NULL);pthread_tthread;pthread_create(&thread,0,thread_bf,NULL);

while(seg>0)sleep(1);rc=SQLDriverConnect(hdbc,NULL,connStr,SQL_NTS,NULL,0,if{}SQL_FREE_GBASE_POOL,NULL);SQLFreeHandle(SQL_HANDLE_ENV,}GBase8aMPPClusterODBC支持动态游GBase8aMPPClusterODBC8.3了支持只向前和静态游标类型还支持动指明连接选项标识DYNAMIC_CURSOR=1DSN配置中选中使用动态游标选项来使用uni

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论