目录
一、通过ODBC、OLEDB、JDBC或任意其他的途径,在前端程序(C/S或B/S模式)中调用所实现的后台存储过程。
(1)下载MySQL的ODBC驱动程序,在电脑的ODBC数据源中导入MySQL
(2)visual studio 2022链接数据库mysql
2022和别的版本不太一样,别去下载mysql for visual studio这个驱动,下载了的话就再点击那个安装包然后选remove就能卸载了!
一、通过ODBC、OLEDB、JDBC或任意其他的途径,在前端程序(C/S或B/S模式)中调用所实现的后台存储过程。
(1)下载MySQL的ODBC驱动程序,在电脑的ODBC数据源中导入MySQL
只看文章里的第二部分:配置ODBC数据源
参考文章:ODBC连接MySQL_odbc是连接mysql吗?-CSDN博客
(2)visual studio 2022链接数据库mysql
2022和别的版本不太一样,别去下载mysql for visual studio这个驱动,下载了的话就再点击那个安装包然后选remove就能卸载了!
2022和别的版本不太一样,别去下载mysql for visual studio这个驱动,下载了的话就再点击那个安装包然后选remove就能卸载了!
2022和别的版本不太一样,别去下载mysql for visual studio这个驱动,下载了的话就再点击那个安装包然后选remove就能卸载了!
1)链接
点击【视图】——【服务器资源管理器】
右键【数据连接】点击【添加连接】
选microsoft ODBC数据源,点击继续
添加信息,这里指定数据源选你的数据源,用户密码填在mysql设置的用户密码
这样就是连接成功了
2)配置路径、依赖
但此时代码还不能运行,会报错,要进行以下操作:
找到mysql安装路径下include文件和lib文件还有一个libmysql.dll(在lib里),直接拷贝到项目中跟debug同级的文件,还有他的上一级
拷贝include文件和lib文件还有一个libmysql.dll(在lib里)
拷贝到项目中和debug同级的文件
拷贝到上一级
把libmysql.dll和libmysql.lib(都在lib目录下)拷贝到debug目录里面!!!
把libmysql.dll和libmysql.lib(都在lib目录下)拷贝到debug目录里面!!!
把libmysql.dll和libmysql.lib(都在lib目录下)拷贝到debug目录里面!!!
接着在项目中添加包含路径和使用到的附加依赖项
vs2022里点击【项目】——【属性】
跟着图解进行配置:网上其他资源都把自己的路径马赛克了,但我都给大家看❤️
别打错字了
3)测试连接
接着用测试代码测试一下连接,前面用户密码改成自己的
#include <stdio.h>
#include <WinSock.h>
#include <Windows.h>
#include <mysql.h>
#include<iostream>
using namespace std;
MYSQL mysql; //mysql连接
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row; //char** 二维数组,存放一条条记录
const char DataBase_UserName[] = "root"; //数据库用户名username
const char DataBase_Password[] = "xxxxxxxx"; //数据库密码,填自己的密码
const char DataBase_Host[] = "localhost"; //数据库连接地址
//注意有时候使用主机ip会报错,此时可以将ip改为localhost
const char DataBase_Name[] = "xxxxx"; //database name数据库的名字
unsigned int DataBase_Port = 3306; //server port
bool ConnectDatabase(); //函数申明
void FreeConnect(); //释放资源
void main()
{
ConnectDatabase(); //连接数据库
//查询数据
//选择该数据库中的一个表的所有数据 sheet8 是一个数据表
mysql_query(&mysql, "SELECT * from sheet8");
//获取结果集
res = mysql_store_result(&mysql);
//显示数据
//给ROW赋值,判断ROW是否为空,不为空就打印数据。
while (row = mysql_fetch_row(res))
{
printf("%s ", row[0]);//打印ID
printf("%s ", row[1]);//打印ID
cout << endl;
}
getchar();
}
bool ConnectDatabase()
{
//初始化mysql
mysql_init(&mysql); //连接mysql,数据库
if (!(mysql_real_connect(&mysql, DataBase_Host, DataBase_UserName, DataBase_Password, DataBase_Name, DataBase_Port, NULL, 0))) //中间分别是主机,用户名,密码,数据库名,端口号(可以写默认0或者3306等),可以先写成参数再传进去
{
printf("Error connecting to database:%s\n", mysql_error(&mysql));
return false;
}
else
{
MessageBoxA(NULL, "连接MYSQL数据成功!", "消息", MB_OK);
printf("Connected...\n");
return true;
}
}
//释放资源
void FreeConnect()
{
//释放资源
//mysql_free_result(res);
mysql_close(&mysql);
}
成功
4)用ODBC中调用后台存储过程
这是我的表,有四个数据
CREATE TABLE `user` (
`user_id` int NOT NULL AUTO_INCREMENT,
`user_name` varchar(45) NOT NULL COMMENT '用户名',
`time` time NOT NULL COMMENT '用户注册时间',
`follow` int NOT NULL COMMENT '关注数',
`fan` int NOT NULL COMMENT '粉丝数',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='用户表';
这是我的s2过程,查id从a到b的所有数据
CREATE DEFINER=`root`@`localhost` PROCEDURE `s2`(in a int, in b int)
begin
select * from user
where user_id >= a and user_id <= b;
end
实现c++代码如下:
#include <windows.h>
#include <iostream>
#include <sqlext.h>
#include <sqltypes.h>
#include <sql.h>
using namespace std;
int main() {
SQLHENV env;
SQLHDBC dbc;
SQLHSTMT stmt;
SQLRETURN ret;
SQLWCHAR userName[100];
SQLINTEGER userId, follow, fans;
SQLLEN lenUserId, lenUserName, lenFollow, lenFans;
// 分配环境句柄
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 分配连接句柄
SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
// 连接数据库(注意字符串现在使用宽字符)
SQLConnect(dbc, (SQLWCHAR*)L"db", SQL_NTS, (SQLWCHAR*)L"root", SQL_NTS, (SQLWCHAR*)L"123456", SQL_NTS);
// 分配语句句柄
SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
// 调用存储过程(注意 SQL 语句现在使用宽字符)
SQLWCHAR sql[] = L"CALL s2(1, 30)";
SQLExecDirect(stmt, sql, SQL_NTS);
// 绑定列
SQLBindCol(stmt, 1, SQL_C_SLONG, &userId, 0, &lenUserId);
SQLBindCol(stmt, 2, SQL_C_WCHAR, &userName, sizeof(userName) / sizeof(wchar_t), &lenUserName);
SQLBindCol(stmt, 3, SQL_C_SLONG, &follow, 0, &lenFollow);
SQLBindCol(stmt, 4, SQL_C_SLONG, &fans, 0, &lenFans);
// 设置宽字符流以显示Unicode
setlocale(LC_ALL, "");
// 读取数据
while (SQLFetch(stmt) != SQL_NO_DATA) {
wcout << L"user_id: " << userId << L" user_name: " << userName
<< L" follow: " << follow << L" fans: " << fans << endl;
}
// 清理资源
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(dbc);
SQLFreeHandle(SQL_HANDLE_DBC, dbc);
SQLFreeHandle(SQL_HANDLE_ENV, env);
system("pause");
return 0;
}
运行结果:
真不好意思,这里的user_name写的是我的名字,没办法给大家看了