c语言游标获取到结构体变量,ESQL/C

ESQL/C

略微分了一下

|----------程序的编译

|----------变量的定义和使用

|----------RDSQL

|----------SQL通讯区(sqlca)与异常处理

|----------游标操作

|----------动态SQL

|----------SQL中复杂的数据类型

由于需要找了本Informix ESQL开发使用手册,花了三四天时间看了看,

由于用的不多,关于SQL中复杂的数据类型全部忽略过去了,基本的ESQL/C程序应该能够应付了,

记录下一些基本的东西,以备快速参考,至于特别的细节,参考一下手册,应该不是什么特别的难题了。

对于个人的知识体系来说也并不是核心的东西,至此ESQL/C专项学习就全部结束。

(一)ESQL/C 札记(1)__概述

1.C程序中使用SQL语句,需要加$,或者在前面加上EXEC SQL;

SQL语句结束后需要加上分号(;),分号是关键字,不能在定义类型,初始化时候随便使用

2.宿主变量:

(1)在可执行的SQL语句中的变量称为宿主变量

定义:

(2)宿主变量可以定义为简单类型,结构,数组类型中一种

(3)宿主变量区分大小写(因为esql预编译器区分大小写)

(4)宿主变量和SQL数据库对象(表名字段名等)可同名;当然宿主变量前需要加"$"或者":"

(5)定义宿主变量的时候,可以同时初始化$long sTemp[10]={0,0,0,0,0,0,0,0,0,0};

(6)宿主变量定义的两种方式:

a.将美元符号($)放在类型前做前缀,例如:$char sTemp[10];

b.将定义的变量放在

语句"EXEC SQL BEGIN DECLARE SECTION"和

语句"EXEC SQL END DECLARE SECTION"之间,

例如:

EXEC SQL BEGIN DECLARE SECTION;

char sTemp[5]={0,0,0,0,0};

char sTime[15];

EXEC SQL END DECLARE SECTION;

引用

(2)宿主变量可在C语言中使用,可以在C表达式中直接引用

(3)宿主变量在SQL语句中使用需要加入美元符号($)或者分号(:)

3.自定义宿主变量类型,可以定义简单类型,一维数组和结构体

不过不能定义多维数组或联合(union)成宿主变量类型,例如:

EXEC SQL typedef char dbname[51];

$tyepdef char dbname[51];

EXEC SQL BEGIN DECLARE SECTION;

dbname sTemp;

EXEC SQL END DECLARE SECTION;

4.结构体和数组作为主变量对象

a.

EXEC SQL BEGIN DECLARE SECTION;

struct stock_t

{

short StockNums;

Char ManuCodeC[4];

}stock_t1;

struct stock_t stock_t2;

EXEC SQL END DECLARE SECTION;

EXEC SQL insert into stock(stock_num, manu_code)

values($stock_t1);

==>

EXEC SQL insert into stock(stock_num, manu_code)

values($stock_t1.StockNumS,$stock_t1.ManuCodeC);

b.定义数组时要说明数组的大小

EXEC SQL char BufTmp[10];

在可执行SQL语句中,可以—

(1)引用数组的任何一个元素。

(2)对于CHAR类型的数组,可以仅引用数组名。

(3)对于其它类型的数组,不能仅引用数组名。

5.变量的作用域

(1)宿主变量是automatic(局部的),除非显式地定义为external或static。

(2)在一个函数中定义的宿主变量对于该函数来说是局部的。

(3)函数中的局部宿主变量使得定义在函数外部的同名的变量不可见。

(4)在同一个模块中不能多次定义同一个宿主变量。

为确保局部宿主变量对于它所定义的块(block)来说是局部的,

使用一对组合的符号 ${ 和 }$ 来开始和结束块。

ANSI标准不支持 ${ 和 }$ ,在5.0版中可以使用简单的括弧对,{ 和 }。

6.informix-esql/c头文件

见目录$informixdir/incl/esql/

blob.h

cdrapi.h

cdrerr.h

collct.h

datetime.h 处理datetime和interval类型数据

decimal.h 处理decimal类型数据

varchar.h 处理varchar类型数据

locator.h 处理byte和text类型数据

sqlda.h  处理动态定义的数据

gls.h

ifxgls.h

ifxtypes.h

int8.h

sqlca.h  决定sql语句执行后的返回码和其他信息

sqlhdr.h

sqliapi.h

sqlstype.h 处理动态SQL

sqltypes.h 处理C和SQL数据类型;多用于动态SQL的处理

sqlxtype.h x/Open模式时处理C和SQL数据类型

srvinfo.h

value.h

xa.h

头文件引用

EXEC SQL include sqlca;

$include sqlca;

7.ESQL编译

esql dblib.ec -c -o dblib.o

gcc test.c -c -o test.o

esql test.0 dblib.o -o test

其中dblib.ec为库文件,包含所有数据库的动作;test.c是测试主函数

(1)INFORMIX-ESQL/C 仅当源文件按具有.ec后缀时才转换,

不是.ec后缀的,即使程序中有EXEC SQL也不编译,

.C后缀的直接交给C编译器编译,.o后缀的直接交给链接程序

(2)编译结果存放到与源文件同名但后缀是".c"的文件中

(3)使用'$'或EXEC SQL给预编译器指明SQL语句的存在,

ESQL/C预编译器预处理源文件时把所标明的SQL语句转换成C的代码

(4)ESQL/C编译后交给C编译器编译后,

C编译器编译并生成了目标文件,它将链接所需要的标准库和INFORMIX-ESQL/C库。

8.SQL注释符号(--)

"--"那一行,"--"右边的都是注释,预编译器忽略双短横线右边的所有文本

9.引用"其他文件"

如果其他文件不含SQL语句,则可以C预编译语句#include,ESQL/C预编译器忽略#include语句。

如果其他文件有SQL语句,必须使用ESQL/C预编译语句$include filename;

10.ESQL/C预编译器支持条件编译

EXEC SQL define 把编译时的某个值赋予一个名字。

EXEC SQL undef  取消定义的名字。

EXEC SQL ifdef  检测名字是否存在,如果存在的话,处理后续的语句。

EXEC SQL ifndef 检测名字是否存在,如果不存在的话,处理后续的语句。

EXEC SQL elseif 进入EXEC SQL ifdef或EXEC SQL ifndef条件的else部分,并检测另一个EXEC SQL ifdef。

EXEC SQL else   进入EXEC SQL ifdef或EXEC SQL ifndef条件的else部分。

EXEC SQL endif  结束EXEC SQL ifdef或EXEC SQL ifndef条件。

注意:ESQL的条件编译以及include语句后都要有分号

11.esql一些命令

-e  仅预编译,不执行C编译和链接。

-o   ExecutableFileName 要产生的可执行文件的名字,省略该项则生成a.out。

-g   给每行编号

OtherCsource   具有.c后缀的C源代码,编译后与Source.ec的编译结果链接。

OtherCobject   具有.o后缀的目标代码,与Source.ec的编译结果链接。

-l YourLibrary   把用户自己提供的库链接进可执行代码。

-l SystemLibrary  把系统的库链接进可执行代码。

=================================

(二)ESQL札记(2)__RDSQL

1.打开数据库

EXEC SQL DATABASE :databasename

2.关闭数据库

EXEC SQL CLOSE DATABASE;

3.连接数据库

EXEC SQL connect to :databasename;

EXEC SQL connect to :databasename [[USER :username] using :password];

4.断开数据库连接

EXEC SQL disconnect current;

5.检索

SELECT [ UNIQUE | DISTINCT | ALL ] SelectList [ INTO … ]

FROM TableList

[ WHERE FilterJoin ]

[GROUP BY ColumnGroupList ]

[ HAVING GroupFilter ]

[ ORDER BY OrderFilter ]

[ INTO TEMPTable ]

6.插入

EXEC SQL INSERT INTO table_name [ ( ColumnList ) ]

VALUES( valuelist )

7.删除

EXEC SQL DELETE FROM table_name

[ WHERE {condition | CURRENT OF cursor_name } ]

8.更新

EXEC SQL UPDATE table_name

SET {column_name = expr [, … ] | {(column_list) | * } = (expr_list ) }

[ WHERE {condition | CURRENT TO cursor_name } ]

9.事务控制

BEGIN WORK

COMMIT WORK

ROLLBACK WORK

10.

=====================================

(三)ESQL札记(3)_SQLCA SQL通讯区与异常

1.SQLCA是一数据结构,在sqlca.h头文件中定义。

2.SQLCA五个主要的域—

long sqlcode         状态指示器

char sqlerrm[72]     错误消息参数(表字段或任何其它的对象),特定于错误消息

char sqlerrp[8]     目前未用

long sqlerrd[6]     有关数据属性和性能的信息

struct sqlwarn        数据异常和其它警告

sqlca.h中是这样定义的

typedef struct sqlca_s

{

int4 sqlcode;

#ifdef DB2CLI

char sqlerrm[600]; /* error message parameters */

#else /* DB2CLI */

char sqlerrm[72]; /* error message parameters */

#endif /* DB2CLI */

char sqlerrp[8];

int4 sqlerrd[6];

/* 0 - estimated number of rows returned */

/* 1 - serial value after insert or  ISAM error code */

/* 2 - number of rows processed */

/* 3 - estimated cost */

/* 4 - offset of the error into the SQL statement */

/* 5 - rowid after insert  */

#ifdef _FGL_

char sqlawarn[8];

#else

struct sqlcaw_s

{

char sqlwarn0; /* = W if any of sqlwarn[1-7] = W */

char sqlwarn1; /* = W if any truncation occurred or

database has transactions or

no privileges revoked */

char sqlwarn2; /* = W if a null value returned or

ANSI database */

char sqlwarn3; /* = W if no. in select list != no. in into list or

turbo backend or no privileges granted */

char sqlwarn4; /* = W if no where clause on prepared update, delete or

incompatible float format */

char sqlwarn5; /* = W if non-ANSI statement */

char sqlwarn6; /* = W if server is in data replication secondary mode */

char sqlwarn7; /* = W if database locale is different from proc_locale

= W if backend XPS and if explain avoid_execute is set

(for select, insert, delete and update only)

*/

} sqlwarn;

#endif

} ifx_sqlca_t;

extern struct sqlca_s sqlca;

3.sqlcode: 整数,SQL语句执行后的状态

有一个全局变量SQLCODE可以使用,也可以使用sqlca.sqlcode

<0         发生错误

=0         执行成功,没有错误

=1:99    依赖于动态SQL语句中

=100    SQLNOTFOUND 语句执行正确,但没有找到记录;预定义的SQLNOTFOUND的值是100

4.sqlerrd[6]

sqlerrd[0]         估计的返回记录的数目,在动态SQL语句中使用。

sqlerrd[1]         执行insert操作后的一个序列值,或是ISAM错误代码。ISAM错误代码是所发生的错误的更详细的解释。

sqlerrd[2]     处理的记录的数目。

sqlerrd[3]         估计的代价,在动态SQL语句中使用。

sqlerrd[4]         SQL语句的错误偏移

sqlerrd[5]         insert操作之后的ROWID

5.sqlwarn

sqlwarn0     一个或多个其它域被设置。如果sqlwarn0的值是空,则不必检测其它域的值。

sqlwarn1     一个或多个值存放到字符宿主变量时被截断或打开有执行事务的数据库。

sqlwarn2     聚集函数(SUM、AVG、MAX、MIN)得到空值(null)或ANSI-模式的数据库(有执行事务)被打开。

sqlwarn3     所选择的字段列表中的项数同INTO子句的宿主变量的个数不一样或打开一个OnLine数据库。

sqlwarn4     准备了一条没有WHERE子句的UPDATE或DELETE语句或进行了浮点到decimal类型的转换。

sqlwarn5     操作由Informix扩展的

sqlwarn6     目前未用。

sqlwarn7     目前未用。

6.rgetmsg

rgetmst(msgnum,msgstr,lenmsgstr);

msgnum         错误消息号码

msgstr         消息串(输出缓冲区)

lenmsgstr     消息串的大小

rgetmsg函数把错误消息号码转换成对应的便于理解的消息内容

7.异常检测

(1) 异常的三种情况:

语句执行成功,但是没有找到记录        sqlcode=100

语句执行成功,但是产生警告信息        sqlcode<0

语句执行失败,发生错误。            sqlcode<0

(2)sqlcode指明是否发生了错误或没有找到记录,而sqlwarn指明是否有警告信息。

if      sqlcode<0有错误,那么检查错误信息

else     sqlcode=100,那么没有记录

esle     检查sqlwarn

网上是这样解释的:

SQLCODE in the SQLCA tells you if the SQL worked.

check it after every SQL statement

0     - worked OK, warnings possible

<0     - serious error meaning you probably should rollback and terminate or a potential error that you can handle in your program

>0     - worked OK, warnings given

(3)esql预编译器按下面的方式来解释三种情况的异常:

NOT FOUND      SQLCODE == 100

SQLWARNING     SQLCA.SQLWARN.SQLWARN0 == 'W'

SQLERROR       SQLCODE < 0

(4)自动异常检测:

默认情况是continue

WHENEVER exception action

exception: NOT FOUND, SQLWARNING, or SQLERROR

action: {GO TO | GOTO} label, CALL func, STOP or CONTINUE

===================

(四)ESQL札记(4)游标

1.定义:游标可以理解为指针,指向某特定记录集合的某行,多用于程序需要从数据库中获取多行的情况。

2.种类:

a.|------select-cursor:将数据记录集合移进程序空间,--选择游标

|------insert-cursor:将数据记录集合移出程序空间,--插入游标

b.选择游标的种类

|-------scrolling    大多情形用于偶尔的浏览,记录可以前后移动

|-------sequential    大多情形用于报表的一次性生成,记录只能向后移动

|-------update        大多情形用于对数据的修改,记录只能向后移动,加锁

3.选择游标相关联的语句:

DECLARE:     DECLARE CursorIdSpec SCROLL CURSOR [WITH HOLD] FOR SelectStmt

OPEN:        OPEN CursorIdSpec

FETCH:        FETCH [Position] CursorIdSpec [INTO HostVarList]

CLOSE:        CLOSE CursorIdSpec

FREE:        FREE CursorIdSpec

4.同插入游标相关联的语句有五个:

DECLARE:    DECLARE cursor_name CURSOR FOR insert_statement

OPEN:        OPEN cursor_name

PUT:        PUT cursor_name        PUT语句把一个记录存放到INSERT缓冲区

FLUSH:        FLUSH cursor_name      FLUSH语句将缓冲区记录插入数据库而不关闭游标

CLOSE:        CLOSE cursor_name    CLOSE把缓冲区记录插入数据库,并使INSERT游标和INSERT缓冲区失效--释放。

FREE:        FREE cursor_name    FREE语句释放游标结构

=====================

(五)ESQL札记(5)动态SQL

1.处理动态SQL步骤

a.装配SQL语句文本

b.用PREPARE准备语句

c.用EXECUTE--OPEN或FETECH执行语句

d.用FREE释放资源

2.PREPARE

PREPARE  statement_id[variable]  FROM  quoted-string/variable-name

statement_id是语句标识符;quoted-string是要准备的语句,可以是宿主变量

3.EXECUTE

EXECUTE { IMMEDIATE sql_string

| statement_id

[ USING  { variable_list

| SQL DESCRIPTOR descriptor

| DESCRIPTOR sqlda_pointer } ] }

4.FETCH

FETCH [ position ] cursor_name

[ { INTO host_varlist

| USING SQL DESCRIPTOR descriptor

| USING DESCRIPTOR sqlda_pointer } ]

5.FREE

FREE { cursor_id

| cursor_variable

| statement_id

| statement_id variable }

6.动态SQL的两种管理方法

方法对比

---------------------------------------------

系统描述区                 SQLDA

语言独立性                 依赖语言

与X/OPEN标准一致         与X/OPEN标准一致

内部仍然分配SQLDA         向后兼容

---------------------------------------------

内存分配对比

---------------------------------------------

系统描述区                 SQLDA

ALLOCATE DESCRIPTOR     Malloc

DEALLOCATE DESCRIPTOR     Free

DESCRIBE                 DESCRIBE

GET DESCRIPTOR

SET DESCRIPTOR

---------------------------------------------

7.

a.ALLOCATE DESCRIPTOR: 分配描述符

ALLOCATE DESCRIPTOR descriptor [ WITH MAX occurrence ]

b.DEALLOCATE DESCRIPTOR: 释放描述符

DEALLOCATE DESCRIPTOR descriptor

c.DESCRIBE: 返回准备的语句的类型/查询字段的部分信息

DESCRIBE statement_id

{ USING SQL DESCRIPTOR descriptr | INTO sqlda_pointer }

d.GET DESCRIPTOR: 获取描述符信息

GET DESCRIPTOR descriptor

{ host_variabe = COUNT

| VALUE item_number host_variabe = item_info [, host_variable = item_info ] … }

e.SET DESCRIPTOR: 设置描述符信息

SET DESCRIPTOR descriptor

{ COUNT = value

| VALUE item_number item_info = value [, item_info = value ] … }

8.动态SQL语句类型

a.select:

无WHERE子句的动态SELECT语句-----------------------------非参数化的SELECT语句

运行时需要为WHERE子句提供信息的动态SELECT语句-----------参数化的SELECT语句

b.非select:

没有WHERE子句的动态非SELECT语句-------------------------非参数化的非SELECT语句

运行时有输入的非SELECT语句------------------------------参数化的非SELECT语句

9.SQLDA

4.SQLDA结构

struct sqlvar_struct

{

short sqltype;     /* variable type        */

short sqllen;      /* length in bytes        */

char *sqldata;     /* pointer to data        */

short *sqlind;     /* pointer to indicator    */

char  *sqlname;    /* variable name        */

char  *sqlformat;  /* reserved for future use     */

short sqlitype;    /* ind variable type        */

short sqlilen;     /* ind length in bytes        */

char *sqlidata;    /* ind data pointer        */

};

struct sqlda

{

short sqld;

struct sqlvar_struct *sqlvar;

};

sqld:表示SELECT语句返回值的字段数目或带参数的动态SQL语句中的参数数目。也就是sqlvar指向结构的数目。

sqlvar:指向sqlvar_struct结构的指针。sqlvar_struct结构链描述了各字段或参数的必要信息,下标从0开始。

sqltype:传送数据的类型。

sqllen:字符数组(CHAR和VARCHAR)的字节大小;DATETIME和INTERVAL类型的编码修饰符的字节大小。

sqldata:指向字符数据的指针。

sqlind:指向短整型指示变量的指针。

sqlname:指向字符数组的指针,数组中存放字段名或传送的显示标签。

sqlformat:保留。

sqlitype:指示变量的类型。

sqlilen:指示变量的字节长度。

sqlidata:指向字符指示数据的指针。

=====================

(六)ESQL札记(6)没完成的一点实践

//================

//file: Makefile

main:    main.o dblib.o

esql main.o dblib.o -o main

main.o:    main.c

gcc main.c -c

dblib.o:    dblib.h    dblib.ec

esql -c dblib.ec

clean:

rm *.o *.gch dblib.c main

//====================================================

//file: dblib.h

EXEC SQL ifndef _DBLIB_H;

EXEC SQL define _DBLIB_H;

#include

#include

EXEC SQL include sqlca;

EXEC SQL BEGIN DECLARE SECTION;

struct CMidInfo{

char id[15];

char name[20];

char address[15];

char linkman[10];

char telphone[15];

char fax[15];

char postcode[20];

char account_bank[20];

char account_no[35];

char main_key[32];

char mac_key[32];

char settle_time[14];

char remark[20];

};

struct CMidInfo midinfo;

EXEC SQL END DECLARE SECTION;

int DBOpen(char *sDBName);

int DBClose(char *sDBName);

int DBConnect(char *sDBName);

int DBConnectOnUser(char* sDBName,char* sUserName,char* sPassword);

int DBDisconnect(char * sDBName);

int DBBeginWork();

int DBCommitWork();

int DBRollbackWork();

int DBInsertMidInfo(struct CMidInfo *pMidInfo);

int DBGetSettleDate(unsigned char *pInMidNo,unsigned char *pusRetDate);

EXEC SQL endif;

//================================================

//file: dblib.ec

EXEC SQL include dblib.h;

int DBOpen(char *sDBName)

{

EXEC SQL BEGIN DECLARE SECTION;

char dbname[51];

EXEC SQL END DECLARE SECTION;

memset(dbname,0,sizeof(dbname));

strncpy(dbname,sDBName,50);

EXEC SQL DATABASE :dbname;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBClose(char *sDBName)

{

EXEC SQL CLOSE DATABASE;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBConnect(char *sDBName)

{

EXEC SQL typedef char db[51]; --定义字符数据类型db

EXEC SQL BEGIN DECLARE SECTION;

db dbname;

EXEC SQL END DECLARE SECTION;

memset(dbname,0,sizeof(dbname));

strncpy(dbname,sDBName,50);

EXEC SQL connect to :dbname;

if(sqlca.sqlcode!=0)

return sqlca.sqlcode;

else

return 0;

}

int DBConnectOnUser(char* sDBName,char* sUserName,char* sPassword)

{

EXEC SQL BEGIN DECLARE SECTION;

char dbname[51];

char username[20];

char password[20];

EXEC SQL END DECLARE SECTION;

memset(dbname,0,sizeof(dbname));

memset(username,0,sizeof(username));

memset(password,0,sizeof(password));

sprintf( dbname,"%s",sDBName);

sprintf( username,"%s",sUserName);

sprintf( password,"%s",sPassword);

EXEC SQL connect to :dbname USER :username using :password;

if(sqlca.sqlcode!=0)

return sqlca.sqlcode;

else

return 0;

}

int DBDisconnect(char * sDBName)

{

EXEC SQL disconnect current;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBBeginWork()

{

EXEC SQL BEGIN WORK;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBCommitWork()

{

EXEC SQL COMMIT WORK;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBRollbackWork()

{

EXEC SQL ROLLBACK WORK;

if(SQLCODE!=0)

return SQLCODE;

else

return 0;

}

int DBInsertMidInfo(struct CMidInfo *pMidInfo)

{

char errmsg[512];

EXEC SQL BEGIN DECLARE SECTION;

struct CMidInfo oMidInfo;

EXEC SQL END DECLARE SECTION;

memset(&oMidInfo,0,sizeof(oMidInfo));

memcpy(&oMidInfo,pMidInfo,sizeof(oMidInfo));

EXEC SQL INSERT INTO mid_info VALUES(:oMidInfo);

if(SQLCODE!=0)

{

rgetmsg(sqlca.sqlerrd[1],errmsg,sizeof(errmsg));

printf("\nISAM error: %d\n%s\n",sqlca.sqlerrd[1],errmsg);

return SQLCODE;

}

else

return 0;

}

int DBGetSettleDate(unsigned char *pInMidNo,unsigned char *pusRetDate)

{

EXEC SQL BEGIN DECLARE SECTION;

char   sMidNo[16];

char   sSettleDate[15];

EXEC SQL END DECLARE SECTION;

struct tm otm;

struct timeval otv;

char sTEMP1[20];

char sTEMP2[20];

memset(&otm,0,sizeof(otm));

memset(&otv,0,sizeof(otv));

memset(sTEMP1,0,sizeof(sTEMP1));

memset(sTEMP2,0,sizeof(sTEMP2));

memset(sMidNo,0,sizeof(sMidNo));

memset(sSettleDate,0,sizeof(sSettleDate));

memcpy(sMidNo,pInMidNo,15);

EXEC SQL SELECT settle_time INTO :sSettleDate FROM mid_info WHERE id = :sMidNo;

if(SQLCODE < 0)

return SQLCODE;

else if(SQLCODE == SQLNOTFOUND)

{

if(gettimeofday(&otv,0) <0)

return -1;

memcpy(&otm,localtime(&otv.tv_sec),sizeof(struct tm));

sprintf(sTEMP1,"%04d%02d%02d",otm.tm_year+1900,otm.tm_mon+1, otm.tm_mday);

sprintf(sTEMP2,"%02d%02d%02d",otm.tm_hour,otm.tm_min,otm.tm_sec);

sprintf(sSettleDate,"%8.8s%6.6s",sTEMP1,sTEMP2);

}

memcpy(pusRetDate,sSettleDate,14);

return 0;

}

//==========================================================

file: main.c

struct CMidInfo{

char id[15];

char name[20];

char address[15];

char linkman[10];

char telphone[15];

char fax[15];

char postcode[20];

char account_bank[20];

char account_no[35];

char main_key[32];

char mac_key[32];

char settle_time[14];

char remark[20];

};

int main(int argc,char **argv)

{

struct CMidInfo oMidInfo;

char sTemp[50];

int iRet=-1;

memset(&oMidInfo,0,sizeof(oMidInfo));

memset(sTemp,0,sizeof(sTemp));

iRet=DBConnect("test");

if(iRet!=0)

printf("Connect database Error: %d\n",iRet);

else

printf("Connect database Success.\n");

strncpy(oMidInfo.id,"000000000002008",15);

strncpy(oMidInfo.name,"i am test",9);

iRet=DBInsertMidInfo(&oMidInfo);

if(iRet!=0)

printf("DBInsertInto mid_info Error: %d\n",iRet);

else

printf("DBInsertInto mid_info Success.\n");

iRet=DBGetSettleDate("000000000002008",sTemp);

if(iRet<0)

printf("DBGetSettleData Error: %d\n",iRet);

else

printf("SettleData: %s\n",sTemp);

return 0;

}

发表于 @2008年03月03日 14:24:00|评论(0 )|编辑

旧一篇: DES加密算法(Data Encryption Standard)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值