freebsd mysql性能_基于FreeBSD+MySQL高性能数据库开发

三、MySQL客户端应用的开发   MySQL提供了丰富的数据接口API,包括C、C++、Perl、PHP、Python、TCL等API和 JDBC,ODBC接口。出于性能考虑,我们采用了MySQL的CAPI进行开发。现以VisualC++ 环境为例,作一简单介绍。   新建一Win32ConsoleApplication的Project,把“c:\mysql\include”添加到编译选项的包含路径中(在ProjectOptions中加入/I"d:\mysql\include")。新建一m ain.c文件,主体如下:   #include   #include   #include   #include   intmain(intargc,char*argv[])   {   charszTargetDSN[]="test";   charszSqlText[500]="";   charaszFlds[25][25];   MYSQL*myData;   MYSQL_RES*res;   MYSQL_FIELD*fd;   MYSQL_ROWrow;   inti,j,k;   BOOLbCreate=TRUE;   if((myData=mysql_init((MYSQL*)0))   //初始化数据结构   &&mysql_real_connect(myData,NULL,   //连接数据库   "root","your_password",szTargetDSN,   MYSQL_PORT,NULL,0))   {   if(bCreate)   {   sprintf(szSqlText,//构造SQL语句   "createtablemytable"   //新建一张表   "(timedatetime,s1char(6),"   "s2char(11),s3int,s4int)");   if(mysql_query(myData,szSqlText))   //执行SQL语句   {//执行SQL语句出错   ErrLog("Can'tcreatetable");   mysql_close(myData);   returnFALSE;   }   }   sprintf(szSqlText,   "insertintomytable"   //向表中插入数据   "values('2000-3-1021:01:30',"   //注意时间的格式   "'Test','MySQLTest',2000,3)");   if(mysql_query(myData,szSqlText))   {//执行SQL语句出错   ErrLog("Can'tinsertdatatotable");   mysql_close(myData);   returnFALSE;   }   sprintf(szSqlText,"select*frommytable");   if(mysql_query(myData,szSqlText))   //进行数据检索   {   //执行SQL语句出错   mysql_close(myData);   returnFALSE;   }   else   {   res=mysql_store_result(myData);   //取得查询结果   i=(int)mysql_num_rows(res);   //取得有效记录数   printf("Query:%s\n%ldrecordsfound:   \n",szSqlText,i);   for(i=0;fd=mysql_fetch_field(res);   i++)   strcpy(aszFlds[i],fd->name);   //取得各字段名   for(i=1;row=mysql_fetch_row(res);)   //依次读取各条记录   {j=mysql_num_fields(res);   //取得记录中的字段数   printf("Record#%ld:-\n",i++);   for(k=0;k //输出各字段的值   printf("Fld#%d(%s):%s\n",k+1,aszFlds[k],   (((row[k]==NULL)||   (!strlen(row[k])))?"NULL":row[k]));   puts("==============================\n");   }   mysql_free_result(res);   }   }   else   {//连接数据库出错   ErrLog("Can'tconnecttothemysqlserver");   mysql_close(myData);   returnFALSE;   }   mysql_close(myData);   returnTRUE;   }   对其中几个函数作简单说明,详细说明,可参考MySQL文档:   1.MYSQL*mysql_init(MYSQL*mysql)   初始化一个类型为MYSQL的数据结构,为执行mysql_real_connect()做准备。参数 mysql为指向该结构的指针,如果mysql为NULL,则新建并初始化一个MYSQL的数据结构。新建的结构将在mysql_close()中释放。   若成功,返回初始化的MYSQL数据结构的指针,否则返回NULL。   2.MYSQL*mysql_real_connect(MYSQL*mysql,constchar*host,   constchar*user,constchar*passwd,constchar*db,   unsignedintport,constchar*unix_socket,unsignedintclient_flag)   与MySQL数据库引擎建立连接。在执行进一步的数据操作之前,必须保证mysql_re al_connect()成功返回。   参数mysql是mysql_init()的返回值;   参数host是运行MySQL数据库引擎的机器的TCP/IP主机名,如为NULL则默认为“lo calhost”;   参数user和passwd是MySQL数据库的合法用户和口令;   参数db是连接的数据库名;   参数port,unix_socket和client_flag一般取默认值。   3.intmysql_query(MYSQL*mysql,constchar*query)   执行query字符串中的SQL语句,query必须以0结尾。如果成功,返回0。   4.MYSQL_RES*mysql_store_result(MYSQL*mysql)   返回SELECT,SHOW,DESCRIBE,EXPLAIN等语句执行的结果。函数新建一个MYSQL_ RES的数据结构,把结果存储在该结构中。如果查询没有匹配的结果,则返回空数据集。处理完结果集后,必须调用mysql_free_result()。   如果出错,返回NULL,否则返回MYSQL_RES结构的指针。   5.MYSQL_ROWmysql_fetch_row(MYSQL_RES*result)   取回结果集中的下一条记录,如果没有记录或出错,返回NULL。一条记录中的字段数可以用mysql_num_fields(result)获得,各字段的值可以用row[0]到row[mysql_nu m_fields(result)-1]的数组来访问。   在工程的链接选项中,加入c:\mysql\lib\libmysql.lib的接口库,把libmysql.d ll复制到操作系统的system目录下(c:\winnt\system32),就可以编译运行了。   到这里,一个简单的数据库应用就开发完成了。当然,MySQL有一套功能丰富的AP I,大家可以查看文档。另外,如果需要跨平台的移植性,可以考虑用MySQL的ODBC接口。可以自己配置MySQL的ODBC连接属性,也可以下载myodbc-2.50.29-nt.zip工具包来配置。

// shujukuDlg.cpp : implementation file // #include "stdafx.h" #include "shujuku.h" #include "shujukuDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CShujukuDlg dialog CShujukuDlg::CShujukuDlg(CWnd* pParent /*=NULL*/) : CDialog(CShujukuDlg::IDD, pParent) { //{{AFX_DATA_INIT(CShujukuDlg) m_shuju = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CShujukuDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CShujukuDlg) DDX_Text(pDX, IDC_EDIT1, m_shuju); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CShujukuDlg, CDialog) //{{AFX_MSG_MAP(CShujukuDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CShujukuDlg message handlers BOOL CShujukuDlg::OnInitDialog() { CDial
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值