`
阿尔萨斯
  • 浏览: 4171718 次
社区版块
存档分类
最新评论

如何用YC++操作数据库

 
阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

如何用YC++操作数据库

在YC++中,可以用多种方式操作数据库。这里列举了一个采用ODBC规范进行数据库编程的例子。
ODBC提供了很多API函数, 这些函数及其使用到的结构、宏等的声明都在头文件sqlucode.h中, 这些函数
的二进制代码则在odbc32.dll库中。
在vc++中, 若要使用ODBC的API函数, 则需要包含sqlucode.h,并指定链接文件odbc32.lib。
在yc++中, 编译器默认包含了头文件: YC01/include/yca.h, 查看后可发现yca.h又包头文件sqlucode.h,
由于YC++会自动链接yca.h中声明的所有库函数, 因此在yc++中,不必再包含yca.h中的头文件,也不需要再指定DLL库。

/*****************************************************************************************************************/
例子:
/*****************************************************************************************************************/
运行该例需将YC++的下列几个文件拷入你的源程序所在目录:

YC01/yxbapi.dll C/C++编译器, 浏览器内核库
YC01/yxbimg.dll 图象, 动画解码库
YC01/yxbext.dll 浏览器内核交互代码库

YC01/examples/y.mdb 数据库文件, 它是用MS Access创建的, 其中只有一个表: me

/*****************************************************************************************************************/
将下列代码存入名字任取的文件, 如: blog4a.cpp
在yc++中, 用调入blog4a.cpp, 再用 运行blog4a.cpp
或在dos中, 用 ycc blog4a.cpp 生成 blog4a.exe, 再运行blog4a.exe
在vc++中, 用 cl blog4a.cpp 生成 blog4a.exe, 再运行blog4a.exe

/*****************************************************************************************************************/

#ifndef YCC //yc++的头文件ycansi.h中定义了YCC标识符, 而其它编译器没有定义它
#include <windows.h><br>#include <stdio.h><br>#include <sqlucode.h><br>//#include <sqltypes.h><br>//#include <sqlext.h><br>//#include <sql.h></sql.h></sqlext.h></sqltypes.h></sqlucode.h></stdio.h></windows.h>

#pragma comment(lib, "user32.lib")
#pragma comment(lib, "odbc32.lib")
#endif

#define MAX_DB_FILEDS 100 //最大字段数
#define MAX_DB_STRLEN 1024 //字段的最大长度

struct DBObject
{
UDWORD fieldlen[MAX_DB_FILEDS];
SWORD fSqlType[MAX_DB_FILEDS];
SQLCHAR FieldStr[MAX_DB_FILEDS][MAX_DB_STRLEN];
SQLSMALLINT fieldnum;
SQLHENV hEnv;
SQLHDBC hDBC;
SQLHSTMT hstmt;
SQLCHAR colName[MAX_DB_FILEDS][256];
};

void main()
{
char mdb_name[] = "y.mdb"; //要被操作的数据库文件名
char table_name[] = "me"; //要被操作的数据库表名字

DBObject rdb;
if(SQLAllocEnv(&rdb.hEnv) != SQL_SUCCESS) return; //分配ODBC环境
if(SQLAllocConnect(rdb.hEnv,&rdb.hDBC) != SQL_SUCCESS) //分配连接用内存
{
SQLFreeEnv(rdb.hEnv);
return;
}

SQLCHAR szConnStr[1024],constr[MAX_PATH+128];
sprintf((char*)constr,"DBQ=%s;DRIVER={Microsoft Access Driver (*.mdb)}", mdb_name);

//加载驱动程序,连接源
if(SQLDriverConnect(rdb.hDBC,NULL,constr,strlen((char*)constr),szConnStr,sizeof(szConnStr),NULL,SQL_DRIVER_NOPROMPT) != SQL_SUCCESS)
{
SQLFreeConnect(rdb.hDBC);
SQLFreeEnv(rdb.hEnv);
return;
}

if(SQLAllocStmt(rdb.hDBC,&rdb.hstmt) != SQL_SUCCESS) //为SQL语句分配内存
{
SQLDisconnect(rdb.hDBC);
SQLFreeConnect(rdb.hDBC);
SQLFreeEnv(rdb.hEnv);
return;
}

//设置SQL语句
SQLCHAR szStmt[255];
strcpy((char*)szStmt,"SELECT * FROM ");
strcat((char*)szStmt, table_name);
SQLExecDirect(rdb.hstmt, szStmt, SQL_NTS); //执行ODBC语句

SQLNumResultCols(rdb.hstmt,&rdb.fieldnum);
rdb.fieldnum = min(rdb.fieldnum, MAX_DB_FILEDS);

for(int ii=0; ii<rdb.fieldnum ii></rdb.fieldnum> {
SQLDescribeCol(rdb.hstmt,ii+1, rdb.colName[ii], sizeof rdb.colName[ii], NULL, &rdb.fSqlType[ii], &rdb.fieldlen[ii], NULL, NULL);
SQLBindCol(rdb.hstmt, ii+1, SQL_C_DEFAULT, rdb.FieldStr[ii], MAX_DB_STRLEN, NULL);
}

//print
void print_db(DBObject *pRdb);
print_db(&rdb);

//exit
SQLCloseCursor(rdb.hstmt);
SQLFreeStmt(rdb.hstmt,SQL_CLOSE);
SQLDisconnect(rdb.hDBC);
SQLFreeConnect(rdb.hDBC);
SQLFreeEnv(rdb.hEnv);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void BinToChar(char *outstr, char *instr, SDWORD count)
{
char *ostr=outstr;
while(count--)
{
UCHAR uletter = (*instr & 0xF0) >> 4;
if(uletter else *ostr++ = 'A' + (uletter - 10);
uletter = *instr++ & 0x0F;
if(uletter else *ostr++ = 'A' + (uletter - 10);
}
*ostr = '/0';
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void get_db_field_text(DBObject *pRdb,int Col,char *outbuff)
{
static char szdate[] = "%02u/%02u/%02u";
static char sztime[] = "%02u:%02u:%02u";
static char sztimestmp[] = "%02u/%02u/%02u %02u:%02u:%02u.%lu";

char *inbuff = (char*)pRdb->FieldStr[Col];
*outbuff = '/0';

switch(pRdb->fSqlType[Col])
{
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
strcpy(outbuff,inbuff);
break;
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
strcpy(outbuff, "0x");
BinToChar(outbuff+2, (char*)inbuff, pRdb->fieldlen[Col]);
break;
case SQL_TINYINT:
case SQL_SMALLINT:
SWORD FAR *tmpsword;
tmpsword = (SWORD FAR *)inbuff;
wsprintf(outbuff, "%d", *tmpsword);
break;
case SQL_BIT:
tmpsword = (SWORD FAR *)inbuff;
strcpy(outbuff, (*tmpsword) ? "1" : "0");
break;
case SQL_INTEGER:
case SQL_BIGINT:
SDWORD FAR *tmpsdword;
tmpsdword = (SDWORD FAR *)inbuff;
wsprintf(outbuff, "%ld", *tmpsdword);
break;
case SQL_FLOAT:
case SQL_DOUBLE:
SDOUBLE FAR *tmpsdouble;
tmpsdouble = (SDOUBLE FAR *)inbuff;
sprintf(outbuff, "%Fg", *tmpsdouble);
break;
case SQL_REAL:
SFLOAT FAR *tmpsfloat;
tmpsfloat = (SFLOAT FAR *)inbuff;
sprintf(outbuff, "%Fg", *tmpsfloat);
break;
case SQL_DECIMAL:
case SQL_NUMERIC:
strcpy(outbuff, inbuff);
break;
case SQL_DATE:
DATE_STRUCT FAR *tmpdate;
tmpdate = (DATE_STRUCT FAR *)inbuff;
wsprintf(outbuff, szdate, tmpdate->month, tmpdate->day, tmpdate->year);
break;
case SQL_TIME:
TIME_STRUCT FAR *tmptime;
tmptime= (TIME_STRUCT FAR *)inbuff;
wsprintf(outbuff, sztime, tmptime->hour, tmptime->minute, tmptime->second);
break;
case SQL_TIMESTAMP:
TIMESTAMP_STRUCT FAR *tmptimestmp;
tmptimestmp = (TIMESTAMP_STRUCT FAR *)inbuff;
wsprintf(outbuff, sztimestmp, tmptimestmp->year, tmptimestmp->month, tmptimestmp->day, tmptimestmp->hour, tmptimestmp->minute,tmptimestmp->second, tmptimestmp->fraction);
break;
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////
void print_db(DBObject *pRdb)
{
printf("/n");
for(int col=0; col<prdb->fieldnum; col++)<br> {<br>printf((char*)pRdb-&gt;colName[col]);<br>printf("/t");<br> }<br> for(;;)<br> {<br>if(SQLFetch(pRdb-&gt;hstmt) != SQL_SUCCESS) break;</prdb->

printf("/n");
for(int col=0; col<prdb->fieldnum; col++)<br> {<br> char des_buf[MAX_DB_STRLEN];<br> get_db_field_text(pRdb,col,des_buf);<br> printf(des_buf);<br> printf("/t");<br> }<br> }<br> printf("/n");<br>}</prdb->




分享到:
评论

相关推荐

    YC++编译器--多语言程序设计

    *YCOS操作系统源代码(ycos.cpp、ycboot.cpp、ychead.cpp、ycker.cpp …) *HTML解析器源代码(ychtml.cpp、ycrend.cpp、ycjs.cpp、ycsock.cpp …) *数据库Javascript接口的定义及其实现源代码(ycdb.cpp) *Web管理...

    YC++编译器网页浏览器

    使用YC可以开发各种应用软件,例如,图形图像软件、财务管理软件、通信软件、网页生成软件、中间件软件、数据库软件等等,总之几乎所有的软件,YC都能开发。YC不但比其它工具容易使用,而且还具有许多其它工具...

    ycdatabase:最轻巧的用C语言编写的php数据库框架,内置php扩展名,适用于mysql

    快速:ycdb是用c编写的mysql数据库ORM,内置php扩展,众所周知,数据库ORM是非常耗时的操作,特别是对于PHP等解释性语言,对于项目而言,ORM所占的比例很高,因此在这里我将用C语言实现MySQL ORM操作,并使用C语言的...

    基于QT学生信息管理系统 (mysql数据库-增删改查分页功能)QT版本5.14

    .Q数库简个Qt只是作为媒个去操作数居库,本身不具备数据库的功能,因此除了以外,还需要在计算机中安装对应的数车软性,但是由于SQLie教括库比较轻巧,因此Qt集成了SQLite数据库,此数据库是嵌入式中

    基于Java Web的图书销售管理系统(源代码+课程设计报告)

    包含分类的登录用户(用户与管理员权限与界面不一),功能,登录与未登录有相应的权限设置,正常用户的图书检索与添加购物车、购买等操作。管理员可管理后台的各种信息。数据库中包含触发器用于图表的更新。作为平时...

    MySQL中文参考手册CHM版

    MySQL数据库, MySQL中文帮助手册合集, MySQL中文文档, DOS命令大全, HTML5中文帮助手册, CHM版本, 数据库优化总结,

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三 个斜杠(///)来说明注释掉代码的理由。 D .不要在视图模板中加入任何复杂的逻辑。 多选 4.关于分页查询,下列哪些说法符合《阿里...

    PHP中Memcache操作类及用法实例

    class Yc_Memcache{   private $memcache=null;     public function __construct(){   }   /**   * 连接数据库   *   * @param mixed $host   * @param mixed $port   * @param mixed $timeout...

    PHPvod视频点播系统 2.6 for php5.3.x utf-8.rar

    如果具备相应权限,用户可以于前台发布与上传影片,提交评论等操作,管理员后台进行审核(也可以不审核直接显示),从根本上避免网络资源的同质化,从而解决搜索引擎不收录网页等问题,保持网站的持久繁荣。...

    流浪人网络网站

    ☆操作系统:Windows2000/XP/XP2(推荐) ☆文件系统:FAT32(NTFS不推荐,若使用这个文件系统,要执行写入权限) 软件下载功能! 会员管理功能,站内短信,站内留言讨论和个栏目评论功能! 留言讨论功能,满足了会员...

    开源C++应用服务器:CWSS 0.8.0

    CWSS(C++ Web Service Server)是用于开发、集成、部署和管理大型分布式应用、网络应用和数据库应用的C/C++应用服务器。将C/C++的高效稳定和各种通讯标准(UDP/TCP/HTTP/SOAP等)引入大型网络应用的开发、集成、部署和...

Global site tag (gtag.js) - Google Analytics