本文共 5614 字,大约阅读时间需要 18 分钟。
概 述 本部分主要讲解下列内容: 1、SYBASE Open client描述 2、确定何时使用open client DB-LIBRARY,何时使用open client client-library 3、open client程序的作用 4、client如何找到server,怎样用isql连接到SQL Server (一) SYBASE Client/Server 的含义: 当两个程序合作执行时,一个程序处于监听状态而另一个程序同时处于讲话状态。 —client 端:发送请求给SERVER端。 —Server 端:响应client端的请求 —有一个请求/响应协议,Client端和Server端共同遵守 · Open dient/Open Server协议是TDS协议,即表格数据流协议(Tabular Data Stream),由它负责全部数据的传送细节。 client/server的示例 ·文件服务器:client端请求“给我下一个2K字节内容”Server端按此请求发送数据。 SQL Server:(client端请求,“更新这些行”Server端执行更新的动作 终端服务器:client端请求:“把我联到计算机主机上”,Server端执行连接。 TDS协议的特点: TDS是sybase传送规则表格数据的专用协议 ·与传送的语言无关 ·与传送的数据无关(长度,字节顺序) ·与具体的网络或硬件平台无关 ·是单一的协议 TDS协议的最大优点是,它负责处理所有数据传送细节。 SYBASE system 10 的Open client 使用open client 可以允许程序以一种标准的方法在client端和Server端传送信息,而不用考虑传送所用的网络和机器。 SYBASE System 10 Open client 结构 ·System 10 DB_library ·System 10 client_library ·CS_library (common libraries) ·Bulk_limary (Command libraries) ·Internal libraries ·Net libraries ·Debug libraries ·language/char files ·isql,bcp,defncopy ·Sample code ·manuals for products(产品手册) DB—library 和client -library 都提供编写client端应用的例程, Sybase支持版本兼容,所有的cliene端的应用必须使用client_library或DB-library来和SERVER通信。 DB-library 和client-library 的对比 DB-library client-library ·传统的API ·open client 的最新API ·新特征: ·新的SYSTEM 10支持。 -数字型,十进制数据类型 -Server端游标 -安全级别(B1,C2) -动态SQL -异步处理 ·支持client端游标 ·与open server完全集成和server library共享数据结构 ·4.6版的向前兼容 DB-library 和Ct-library的用处: ·DB-library用于: ·已存在应用的维护 ·不需要System 10 SQL Server特征的简单应用 ct-library用于: ·需要System 10 SQL Server功能的应用 ·和Open Server配对使用的网关应用 ·高级功能应用 (二) Client端如何找到Server端: ·必须有一个名称为interfaces的文件存在于client端的$SYBASE路径下 ·Interfaces 文件应包含服务器名字和网络地址 ·必须设定Client端机器上的下列环境变量 ·SYBASE指出包含interfaces 文件的路径 . SYBASE 指定希望联接的Server名称 .DSQUERY 指定希望联接的缺省SERVER名称 . interfaces 文件结构: OMS-SERV query tcp Sun-ether galaxy 2000 master tcp sun-ether galaxy 2000 ·指定在确定机器上的Server名及端口的映射 ·是一个ASCII文件 ·包含下列信息: -服务器名字 -OMS-SERV -SOCKET的用法 –Ouery Master -网络和硬件平台类型 tcp sun-ether -机器名或IP地址(Server运行机器)-galaxy -Sever监听的逻辑端口号 SYBASE环境变量 指出Sybase软件的根路径,以找出 ·头文件 ·库文件 ·SYBASE命令文件isql ·其它文件 QUERY变量: ·为多数的client程序指明缺省的联接Server ·指出interfaces文件中的入口如:OMS-SERV 如下图所示: (三) Open-client编程: 目标:·确认所有DB -library的关键文件,在开发环境中已配置 ·解释一个Db_library程序所用到的库文件,头文件和结构 ·编译一个最小的Db_library 程序,以建立一个到SQL server的联接 DB-library的头文件: ·头文件应在SYBASE/include中找到 ·sybdb.h包含: -DB-library标识,这些传递给SERVER -错误代码 -返回代码 ·Sybfront.h自动包含 -cstypes.h 包括一些核心定义如:’CS_SUCCEED’ ‘CS_TRUE’ 和一些数据类型定义 -csconfig.h包含后台平台定义和编译区分 ·Open client程序中应包含上述头文件 用法:在C程序开始 #include<sybdb.h> #include<sybfront.h> -sybdb.h -sybfront.h 的示例代码参见附页。 编译脚本: ·连结所的必要的库函数 ·指示头文件的位置 ·示例: #!/bin/sh set LIBLOC=$sybase/Lib; cc -g $1.c \ -I$SYBASE/include -L$LIBLOC -L Sybdb \ -lm -0 $1 脚本解释: ·使用的编译器,cc ·-g 标志允许运行debuge ·$1指示脚本第一句的内容 ·-I指示查找头文件(.h)文件的位置 ·-L指示连接库的位置 ·-l指示寻找一个文件,其前缀为“Lib”并且扩展名为“.a” ·控制结构: LONGREC: 保存用户名,应用程序名.口令,主机名 一旦该结构发送给Server并建立一个连接后,该结构体就不必存在 DBDROCESS: 保存Server的联接信息,命令缓冲,结果集或者状态调节client端和Server端的所有连接 分配LONGREC结构空间: .dblogin( ) LONGREC结构分配内存 .用法:LONGREC *longin; login=dblogin( ); dblogin( )也可以在环境变量中取缺省的用户名和主机名。 .设置用户名和口令: 方法:用预定义宏实现一例: DBSETLUSER (login-prt,“eme151”); DBSETLPWD (login-prt,“sybase”); 生成连接: 调用函数:dbopen( ) 函数功能:设置网络通信 登录到Server 保留内存空间给连接指针conn_ptr 用法: DBPROCESS *conn_ptr; LONGREC *login_ptr; Conn_ptr=dbopen (login_ptr,“sybase”); If ( conn_ptr==(DBPROCESS*)NULL) Œ; printf(“fail in dbopen”); exit(STDERR); ; 使用说明: conn_ptr=dbopen( login_ptr,server-name); conn_ptr 已经打开的server连接 login-ptr 指向LONGREC结构体的指针 server-name 所要连接的服务器名,若为NULL,则引用DSQUERY指定的服务器名 创建一个最小程序: 1、包括头文件 2、初始化DB-library函数库 3、关闭DB-library连接 目的在于验证程序的开发环境是否正确配置,包括头文件、库文件 程序清单: #include<stdio.h> #include<sybfront.h> #include<sybdb.h> main( ) Œ; dbinit( ); /*初始化函数库*/ dbexit( ); /*关闭DB_lib连接*/ ; dbinit( )功能:初始化函数库,必须在呼叫其它DB-lib 函数之前调用 dbexit( ) 关闭所存的Server连接。 创建一个联接到Server的程序 为了能够连结到Server,必须分配一个LONGREC结构,设定用户名和口令,生成一个Server连接。 dbopen的返回结果: dbopen如果返回一个有效的conn_ptr,则连接成功 如果conn_ptr为NULL,则一般原因如下: ·无效登录(用户口令) ·未知的机器名 ·Server关闭 ·interfaces文件中未找到指定的server名字 ·对interfaces文件无读权限。 ·SYBASE环境变量设置错误 ·网络故障 程序清单如下: #include(sedio.h> #include<sybfront.h> #include<sybdb.h> main( ) Œ; DBPROCESS *conn_ptr; LONGREC *login_ptr; dbinit( ); login_ptr=dblogin( ); DBSETLUSER(login_ptr,“eme151”); DBSETLPWD(login_ptr,“sybase”); Conn_ptr=dbopen(login_ptr,“TAZZ”); if (conn_ptr= (DBPROCESS*)NULL) Œ; printf(“lould not connected to server!\n”); exit(FAIL); ; dbexit( ); exit(SUCCEED); ; 设计较为复杂的open-client程序: 设计流程: dbcmd( )函数说明: 功能:填充命令缓冲区,提供一个指向命令缓冲区的指针 示例:DBCHAR,sqltext[1024]; strcpy(sqltext,“stlect * from titles”); dbcmd(conn_ptr,sqltext); 说明:conn_ptr 命令语句要发送到的联接 buffer 包含sql语句字符串缓冲区的地址 dbsqlexec( )函数说明: 功能:发送批处理到Server 用法:DBPROCESS *conn_ptr; dbsqlexec(conn_ptr); 注意:如果批处理命令中的一个包含语法错,则整个批的命令,全部取消 dbresults( )函数说明: 功能:确定缓冲区中每个命令的执行状态 完成和Server的握手,但不从Server获取数据 语法:RETCODE ret ret=dbresults(conn_ptr); 注意:在成功调用dbresults( ).后,在DBPROCESS结构体中关于数据的信息方可使用。 dbresults( )的返回值: .SUCCEED :结果集对进程而言可用 .NO_MORE_RESULTS -所有的结果集已经处理完成 -连接准备接收和下一个命令 .FAIL -dbresults( )失败 -一般由于权限问题引起 dbclose( )函数说明: 功能:发送登录信息给SQL SERVER并且关闭单个连接 示例:DBPROCESS *conn_ptr dbclose(conn_ptr); dbexit( )函数说明: 功能:关闭所有打开的联接,不需任何参数 dbbind( )函数说明: 功能:绑定Sybase表列到程序变量 语法:DBINT column_number; DBINT bindtype; DBINT target_length; BYTE *target_address dbbind(conn_ptr,column_number,bindtype, target_length,target_address) ·conn-ptr到server的联接名 ·column_number 列的序号(自1开始) ·bindtype 标识值,指明绑定类型 ·target_length 拷贝到目标位置的字节数 ·larget_address 接收数据的目标位置 示例: DBPROCESS *conn_ptr DBCHAR rowbuffer[255][255]; while((ret=dbresults(conn_ptr))!=NO_MORE_RESULTS) Œ; if (ret = =SUCCEED) Œ; for (i=0; i<dbnumcols(conn_ptr);i++) Œ; dbbind (conn_ptr,),NTSTRINGBIND,0, Rowbuffer[0]; | |
转载于:https://my.oschina.net/laopiao/blog/157997