概 述
本部分主要讲解下列内容:
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通信。
D B-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,
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。