(c++代码版)数据库作业——通过ODBC在visual studio2022中调用所实现的后台存储过程

目录

一、通过ODBC、OLEDB、JDBC或任意其他的途径,在前端程序(C/S或B/S模式)中调用所实现的后台存储过程。 

(1)下载MySQL的ODBC驱动程序,在电脑的ODBC数据源中导入MySQL

(2)visual studio 2022链接数据库mysql

2022和别的版本不太一样,别去下载mysql for visual studio这个驱动,下载了的话就再点击那个安装包然后选remove就能卸载了!

1)链接

2)配置路径、依赖

3)测试连接

4)用ODBC中调用后台存储过程


一、通过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写的是我的名字,没办法给大家看了

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这里提供一个Python Flask框架调用MySQL存储过程的示例代码: ```python import pymysql from flask import Flask, jsonify app = Flask(__name__) # MySQL数据库连接配置 conn = pymysql.connect( host='localhost', user='root', password='password', db='testdb' ) # 定义Flask接口路由 @app.route('/api/get_data', methods=['GET']) def get_data(): try: # 调用MySQL存储过程 with conn.cursor() as cursor: cursor.callproc('test_proc', args=(1,)) result = cursor.fetchall() conn.commit() return jsonify({'data': result}) except Exception as e: return jsonify({'error': str(e)}) finally: cursor.close() conn.close() if __name__ == '__main__': app.run(debug=True) ``` 在上面的代码,我们使用pymysql库连接MySQL数据库,并定义了一个Flask接口路由。在该路由,我们通过`cursor.callproc()`方法调用MySQL存储过程,并将参数传递给它。然后,我们使用`cursor.fetchall()`方法获取存储过程的结果,并通过`jsonify()`方法将其转换为JSON格式响应返回给前端。最后,我们在`finally`块关闭游标和连接。 你可以将上面的代码放入你的Flask应用程序,然后在浏览器访问`http://127.0.0.1:5000/api/get_data`,即可调用MySQL存储过程并获取结果。 ### 回答2: 在前端程序调用后台存储过程可以通过使用Python的Flask框架结合ODBC、OLEDB、JDBC等方式进行实现。以下为通过ODBC方式调用后台存储过程代码示例: ```python import pyodbc from flask import Flask app = Flask(__name__) @app.route('/') def call_stored_procedure(): conn = pyodbc.connect("DRIVER={ODBC Driver};SERVER=your_server;DATABASE=your_database;UID=username;PWD=password") cursor = conn.cursor() # 调用存储过程 cursor.execute("{CALL your_stored_procedure_name()}") # 获取存储过程执行结果 result = cursor.fetchall() # 处理结果,例如返回到前端页面 return str(result) if __name__ == '__main__': app.run() ``` 请注意,代码的`your_server`、`your_database`、`username`、`password`、`your_stored_procedure_name()`需要根据实际情况进行替换。 ### 回答3: 在前端程序调用后台存储过程代码可以通过使用Python的Flask框架和PyODBC模块来实现。下面是一个示例代码: 1. 首先,需要安装Flask和PyODBC模块。可以使用以下命令安装依赖项: ```python pip install flask pyodbc ``` 2. 在Flask应用程序的主文件,导入所需的模块和库: ```python from flask import Flask, jsonify import pyodbc ``` 3. 创建Flask应用程序实例: ```python app = Flask(__name__) ``` 4. 创建数据库连接,使用pyodbc库连接到数据库,并编写执行存储过程的函数: ```python def execute_stored_procedure(): # 创建数据库连接 conn = pyodbc.connect('DRIVER={SQL Server};SERVER=数据库服务器名;DATABASE=数据库名;UID=用户名;PWD=密码') try: # 创建游标 cursor = conn.cursor() # 调用存储过程 cursor.execute("{CALL 存储过程名()}") # 获取存储过程的返回结果 result = cursor.fetchall() # 提交事务并关闭连接 conn.commit() cursor.close() conn.close() return result except Exception as e: # 发生异常时进行回滚,并关闭连接 conn.rollback() conn.close() # 返回错误信息 return str(e) ``` 5. 创建一个路由,用于在浏览器访问时调用存储过程: ```python @app.route('/execute_procedure', methods=['GET']) def call_stored_procedure(): result = execute_stored_procedure() # 使用JSON格式返回结果 return jsonify(result) ``` 6. 运行Flask应用程序: ```python if __name__ == '__main__': app.run() ``` 7. 通过浏览器或其他方式访问`http://127.0.0.1:5000/execute_procedure`,即可调用后台存储过程并返回结果。 以上代码示例了如何使用Flask和PyODBC库在前端程序调用后台存储过程,并将结果以JSON格式返回给客户端。根据实际情况,需要修改数据库连接参数和存储过程的名称。同时,还可以根据需求对代码进行扩展和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值