数据库基础(SYBASE)

概    述

本部分主要讲解下列内容:
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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞