数据库基础(SYBASE)

日期: 2008-06-26 来源:TechTarget中国

  概    述


  本部分主要讲解下列内容:


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语句字符串缓冲区的地址
dbsql&#101xec(  )函数说明:
功能:发送批处理到Server
用法:DBPROCESS  *conn_ptr;
      dbsql&#101xec(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

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐