标签归档:数据库

在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)

SQLite是一个完全独立的、不需要服务器、不要任何配置、支持SQL的、开源的文件数据库引擎。源代码和支持可以登录:http://www.sqlite.org/
本文主要介绍如何在C++中使用sqlite。 1、SQLite下载与安装
本文以3.7.4版本为例进行说明。在http://www.sqlite.org/ 下载windows平台的3.7.4版本的sqlite。
(1)下载sqlite3.dll和sqlite3.def文件,其下载地址为:http://www.sqlite.org/sqlite-dll-win32-x86-3070400.zip ,本文直接下载到桌面
下载后文件为:

在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)X

,解压后文件为:在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(2)下载.h/.cpp文件,其下载地址为:http://www.sqlite.org/sqlite-amalgamation-3070400.zip,本文直接下载到桌面,下载后文件为:在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍),解压后文件为:在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
2、代码编译,由于SQLite下载文件中只提供了def文件而没有提供lib文件。所以在正式使用sqlite之前需要先编译lib文件。下面给出编译lib文件的方法和步骤。
(1)打开V2008自带的命令行工具(本文以vs2008为例进行说明)
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(2)打开后的界面如下:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(3)在上面的命令行中输入(注意空格):(小技巧,输入lib /def:后可以将刚刚解压sqlite3.def直接拖到命令行界面中,然后加上/machine:ix86)
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(4)输入命令行回车:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
到此sqlite编译完成.
(5)编译完成后生成sqlite3.lib、sqlite3.exp文件,该文件路径在:C:Program FilesMicrosoft Visual Studio 9.0VC
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
3、sqlite使用工程建立
(1)打开vs2008,选择File→New→Project.在弹出的对话框中按如下进行选择,并在Name中输入工程名:TestSqlite,如下图所示
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(2)单击ok,如下图:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(3)单击Finsh完成工程建立,如下图:在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
4、sqlite配置
(1)将前面下载和编译期间的.h、.lib、.cpp、.def、.dll文件分别放在inc、lib文件夹下。如下图
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
其中inc文件内容为:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
lib文件内容为:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(2)在C/C++ General的Additional Include Directories中输入..inc 如下图:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(3)在Linker的Additional Library Directories中输入..lib 如下图:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(4)在Linker的Input的Additional Dependencies中输入:sqlite3.lib 如下图:
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
(5)单击确定,到此sqlite配置已经完成
5、测试代码。
本文给出sqlite使用的文件模式和内存模式测试代码。在TestSqlite.cpp中输入如下代码:
#include 'stdafx.h'
#include 'sqlite3.h'
int testdb(void);
int testdb2(void);
int testdb3(void);
//callback回调函数 _callback_exec的编写,其中notused为sqlite3_exec中的第四个参数,第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值
static int _callback_exec(void * notused,int argc, char ** argv, char ** aszColName)
{
int i;
for ( i=0; i<argc; i++ )
{
printf( '%s = %s/n', aszColName[i], argv[i] == 0 ? 'NUL' : argv[i] );
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
//文件模式
testdb();
testdb2();
testdb3();
return 0;
}
#include <cstdio>
#include <cstdlib>
#include 'sqlite3.h'
int testdb(void)
{
sqlite3 *db=NULL;
char *zErrMsg = 0;
int rc;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
rc = sqlite3_open('test1.db', &db);
if(rc)
{
fprintf(stderr, 'Can’t open database: %sn', sqlite3_errmsg(db));
sqlite3_close(db);
return (1);
}
else
printf('You have opened a sqlite3 database named test1.db successfully!n');
//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在zErrMsg 中
char *sql = ' CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);' ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
//插入数据
sql = 'INSERT INTO test VALUES(NULL , 1 , 1 , '201205151206', 117.9 );' ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
int nrow = 0, ncolumn = 0; //查询结果集的行数、列数
char **azResult; //二维数组存放结果
//查询数据
sql = 'SELECT * FROM test ';
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( 'row:%d column=%d n' , nrow , ncolumn );
printf( 'nThe result of querying is : n' );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
{
printf( 'azResult[%d] = %sn', i , azResult[i] );
}
//删除数据
sql = 'DELETE FROM test WHERE AGE = 1 ;' ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
//释放掉azResult 的内存空间
sqlite3_free_table( azResult );
sqlite3_close(db); //关闭数据库
int c=getchar();
return 0;
}
int testdb2(void)
{
const char * sSQL = 'select * from t1;';
char * pErrMsg = 0;
int ret = 0;
sqlite3 * db = 0;
ret = sqlite3_open('./test2.db', &db);
if ( ret != SQLITE_OK )
{
fprintf(stderr, 'Could not open database: %s', sqlite3_errmsg(db));
exit(1);
}
printf('Successfully connected to database/n');
sqlite3_exec( db, sSQL, _callback_exec, 0, &pErrMsg );
if ( ret != SQLITE_OK )
{
fprintf(stderr, 'SQL error: %s/n', pErrMsg);
sqlite3_free(pErrMsg);
}
sqlite3_close(db);
db = 0;
return 0;
}
int testdb3(void)
{
const char * sSQL = 'select * from t1;';
char * pErrMsg = 0;
int ret = 0;
sqlite3 * db = 0;
ret = sqlite3_open(':memory:', &db);
if ( ret != SQLITE_OK )
{
fprintf(stderr, 'Could not open database: %s', sqlite3_errmsg(db));
exit(1);
}
printf('Successfully connected to database/n');
char *zErrMsg = 0;
char *sql = ' CREATE TABLE test(ID INTEGER PRIMARY KEY,AGE INTEGER,LEVEL INTEGER,NAME VARCHAR(12),SALARY REAL);' ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
//插入数据
sql = 'INSERT INTO test VALUES(NULL , 1 , 1 , '201205151206', 20.9 );' ;
sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );
int nrow = 0, ncolumn = 0; //查询结果集的行数、列数
char **azResult; //二维数组存放结果
//查询数据
sql = 'SELECT * FROM test ';
sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
int i = 0 ;
printf( 'row:%d column=%d n' , nrow , ncolumn );
printf( 'nThe result of querying is : n' );
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
{
printf( 'azResult[%d] = %sn', i , azResult[i] );
}
//释放掉azResult 的内存空间
sqlite3_free_table( azResult );
sqlite3_close(db); //关闭数据库
return 0;
}
6、运行结果
在C++中使用sqlite的示例(从下载、编译、工程建立、配置、测试代码编写全方位介绍)
总结:到此sqlite的从下载、编译、工程建立、配置、测试代码编写、运行结果介绍已经完成。关于sqlite的更多的理论知识将在后续我将会继续给出。

用phpMyadmin创建MySQL数据库及独立数据库帐号的图文教程

在一个服务器上一般来讲都不止一个站点,更不止一个MySQL(和PHP搭配之最佳组合)数据库。
为了防止安全隐患,我们一般针对每个数据库都设置了独立的数据库访问帐号,该帐号仅有访问该数据库的权限。下面就让我们来具体演示一下:

1、首先我们要登陆php(做为现在的主流开发语言)MyAdmin,不做演示。

2、创建一个数据库,如下图,在php(做为现在的主流开发语言)MyAdmin右边窗口中,填写数据库名称,点创建即可。 



例如我们这里创建一个名字为:cncmstest 的数据库

创建成功会有如下提示:

3、点击左上角的主页按钮,返回php(做为现在的主流开发语言)MyAdmin主界面:

4、在主界面的右边点击“权限”来创建数据库帐号。

5、在权限页面中,我们点击“添加新用户”

6、在该页面中,我们填写要创建的数据库用户名,该用户的访问范围,及密码。



如上图,我们填写了用户名为:cncmsuser,该数据库用户只允许本机访问,主机一项选择本地;密码我们使用自动生成的,点下面的“Generate”会生成一个随机密码,然后点“Copy”会自动填写到密码框中。

下面的框都不选,直接拉到页面最下面点执行即可创建一个新用户。

数据库用户创建成功,会返回如下页面:

7、最重要的一步,设置该用户的数据库访问权限

在数据库用户添加成功返回的页面中可以直接设置权限。这里我们选择按数据库指定权限:



如上图,在数据库列表中选择我们刚刚创建的cncmstest,即会自动进入该数据库的权限设置页面。



在上图的权限设置中,我们把“数据”、“结构”两列的权限全部选中,管理权限都不要选。点执行即可。

到这里,我们已经全部设置完毕了,创建了一个数据库:cncmstest,并创建了数据库用户cncmsuser,特别指定了该用户只对cncmstest的访问权限。如此,便达到了我们一开始所讲的目的:为每一个数据库指定独立的用户访问权限。

VC连接MySQL

一、MySQL的安装
注意选择“完全安装”(只有这样才会安装VC编译时需要的头文件等)。安装后期会进行服务器配置,你可以设置你的服务器登陆密码,也可以不设置密码。

二、VC6.0的设置

(1)打开VC6.0 工具栏Tools菜单下的Options选项,在Directories的标签页中右边的“Show directories for:”下拉列表中选中“Includefiles”,然后在中间列表框中添加你本地安装MySQL的include目录路径。(我的是D:\Program Files\MySQL\MySQL Server 5.0\include)。

(2)在上面说到的“Show directories for:”下拉列表中选中“Library files”,然后添加你本地安装MySQL的Lib目录路径。Lib目录下还有debug和opt两个目录,建议选debug。(我的是D:\Program Files\MySQL\MySQL Server 5.0\lib\debug)。

(3)在“Project settings->Link:Object/library modules”里面添加“libmysql.lib”。

(4)在stdafx.h里面添加如下的内容:

#include "mysql.h"
#include "winsock.h"   // 如果编译出错,则把该行放到#include "mysql.h"之前
#pragma comment(lib,"libmySQL.lib")   // 如果在附加依赖项里已增加,则就不要添加了
(5)建议将“libmySQL.lib、libmySQL.dll”拷到你所建的工程的目录下。

三、数据库、表的创建
打开“开始->所有程序->MySQL->MySQL Server 5.0->MySQL Command Line Client.exe”,如果没有设置密码就直接按回车,会提示服务器启动成功。

mysql> SHOW DATABASES;//显示所有的数据库,注意一定要 敲“;”后再按回车
mysql> CREATE DATABASE mydb;//创建数据库mydb
mysql> USE mydb;//选择你所创建的数据库mydb
mysql> SHOW TABLES; //显示数据库中的表
mysql> CREATE TABLE mytable (username VARCHAR(100), visitelist VARCHAR(200),                                 remark VARCHAR(200));//创建一个表mytable: 用户名;访问列表;备注
mysql> DESCRIBE mytable;//显示表的结构
四、VC编程

MYSQL mysql; //数据库连接句柄
mysql_init (&mysql);
if(!mysql_real_connect(&mysql,"localhost","root",NULL,"mydb",3306,NULL,0))  {//mydb为你所创建的数据库,3306为端口号,可自行设定
AfxMessageBox("数据库连接失败");
return FALSE;
}
(1)实现添加 功能

CString strUsername,strList,strRemark,strSQL;
strSQL.Format("insert into mytable(username,visitelist,remark) values(\'%s\',\'%s\',\'%s\')",                                        strUsername,strList,strRemark);//注意一定要写在一行,而且必须要有\'\'
if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){
AfxMessageBox("增添失败");
}

(2)实现修改功能
CString strUsername,strList,strRemark,strSQL,str_PreName;//str_PreName用于记录想要修改的行,详情请看源代码
strSQL.Format("update mytable set username=\'%s\',visitelist=\'%s\',                              remark=\'%s\' where username=\'%s\'",strUsername,strList,strRemark,str_PreName);
if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){
AfxMessageBox("修改失败");
}
(3)实现删除功能

CString strSQL;
strSQL.Format("delete from mytable where username=\'%s\'",str_PreName);//必须要有\'\'
if(mysql_real_query(&mysql,(char*)(LPCTSTR)strSQL,(UINT)strSQL.GetLength())!=0){
AfxMessageBox("删除失败");
}
(4)读取表格内容到CListCtrl控件m_list

m_list.DeleteAllItems();
char *ch_query;
ch_query="select * from mytable";
if(mysql_real_query(&mysql,ch_query,(UINT)strlen(ch_query))!=0){
AfxMessageBox("数据库中表格出错");
}
CString str;
MYSQL_RES *result;
MYSQL_ROW row;
if(!(result=mysql_use_result(&mysql))){
AfxMessageBox("读取数据集失败");
}
int i=0;
while(row=mysql_fetch_row(result)){
str.Format("%s",row[0]);
m_list.InsertItem(i,str);
str.Format("%s",row[1]);
m_list.SetItemText(i,1,str);
str.Format("%s",row[2]);
m_list.SetItemText(i,2,str);
i++;
}
mysql_free_result(result);
(5)关闭数据库

mysql_close(&mysql);//最好写到OnDestroy()函数中

MySQL 备份还原数据库批处理

1、备份数据库(单个表备份) bk_table.bat

mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database1 table1>table1.sql
mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database2 table2>table2.sql
mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database2 table3>table3.sql
pause

2、还原数据库(单个表还原) restore.bat

mysql -h127.0.0.1 -P3306 -uroot -proot database1 < table1.sql
mysql -h127.0.0.1 -P3306 -uroot -proot database2 < table2.sql
mysql -h127.0.0.1 -P3306 -uroot -proot database2 < table3.sql
pause

3、备份数据库并自动打包压缩成.rar文件(单个表备份) bk_table.bat

mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database1 table1>table1.sql
mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database2 table2>table2.sql
mysqldump -h127.0.0.1 -P3306 -uroot -proot --default-character-set=gbk -t database2 table3>table3.sql
winrar a Db_Bak_%date:~0,10%.rar D:\DB_Backup\*.sql
DEL D:\DB_Backup\*.sql
pause

执行批处理后,你的备份数据脚本就会被压缩到你的电脑D:\DB_Backup 的 Db_Bak_日期.rar文件中。
如果出现“'WinRAR' 不是内部或外部命令,也不是可运行的程序或批处理文件。” 错误,在计算机->属性->高级->环境变量->在Path项添加你的WinRAR路径,如:C:\Program Files\WinRAR即可。
 
4、备份整个库的数据

mysqldump -h127.0.0.1 -P3306 -uroot -proot database1 > database1.sql
Pause

说明:
1、打开记事本->把以上脚本拷贝到记事本->另存为*.bat文件即可双击打开执行。
2、需要将你的MySql安装bin目录路径添加到计算机环境变量的Path里:
计算机->属性->高级->环境变量->在Path项添加 你的Mysql安装bin目录路径 如:C:\Program Files\MySQL\MySQL Server 5.0\bin或者将批处理文件拷贝到bin目录下C:\Program Files\MySQL\MySQL Server 5.0\bin执行。