c++将txt数据批量导入mysql数据库的例子

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: ////包括多线程的使用,数据库的操作和打开文件对话框的使用。 #include "stdafx.h"#include #include #include "resource.

////包括多线程的使用,数据库的操作和打开文件对话框的使用。


#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include <SQL.H>//连接库:odbc32.lib odbccp32.lib
#include <SQLEXT.H>//数据库头文件
#include <SQLTYPES.H>//数据库头文件
#include <COMMDLG.H>//OPENFILENAME 头文件
#include<STRING.H>
#define LOGIN_TIMEOUT 30
#define MAXBUFLEN 255
///#define CHECKDBSTMTERROR(hwnd,result,hstmt) 
char szFile[MAX_PATH];
BOOL ImportStatus = FALSE; //导入状态标志
SQLHENV henv = NULL;
SQLHDBC hdbc = NULL;
SQLHSTMT hstmt = NULL;
SQLRETURN result;
SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=123456;DATABASE=Test;CharSet=gbk;";
SQLCHAR ConnStrOut[MAXBUFLEN];

void ShowDBError(HWND hwnd,SQLSMALLINT type,SQLHANDLE sqlHandle)
{
    char pStatus[10], pMsg[101];
    SQLSMALLINT SQLmsglen;
    char error[200] = {0};
    SQLINTEGER SQLerr;
    long erg2 = SQLGetDiagRec(type, sqlHandle,1,
		(SQLCHAR *)pStatus,&SQLerr,(SQLCHAR *)pMsg,100,&SQLmsglen);
    wsprintf(error,"%s (%d)\n",pMsg,(int)SQLerr);
    MessageBox(hwnd,error,TEXT("数据库执行错误"),MB_ICONERROR|MB_OK);
}
void ShowDBConnError(HWND hwnd,SQLHDBC hdbc)
{
	ShowDBError(hwnd,SQL_HANDLE_DBC,hdbc);
}
void ShowDBStmtError(HWND hwnd,SQLHSTMT hstmt)
{
	ShowDBError(hwnd,SQL_HANDLE_STMT,hstmt);
}
//查检是否有错误
BOOL CHECKDBSTMTERROR(HWND hwnd,SQLRETURN result,SQLHSTMT hstmt)
{
	if(SQL_ERROR==result)
	{
		ShowDBStmtError(hwnd,hstmt);
		return TRUE;
	} 
	else 
	{
		return FALSE;
	}
}
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
        HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
		HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
    }

    return FALSE;
}

BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
    return TRUE;
}
//选择文件
void openfile(HWND hwnd)
{
OPENFILENAME ofn;//定义一个OPENFILENAME类型的结构体。
				ZeroMemory(&ofn,sizeof(ofn));//使用结构体变量前把该结构体变量各个位清零。
				ofn.lStructSize = sizeof(ofn);
				ofn.lpstrFile = szFile; 
				ofn.lpstrFile[0] = TEXT('\0');
				ofn.nMaxFile = sizeof(szFile);
				ofn.lpstrFilter = TEXT("ALL\0*.*\0文本文档\0*.TXT\0");
				ofn.nFilterIndex = 2;
				ofn.lpstrFileTitle = NULL;
				ofn.nMaxFileTitle = 0;
				ofn.lpstrInitialDir = NULL;
				ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
				if (GetOpenFileName(&ofn))
				{
					SetDlgItemText(hwnd,IDC_FILEINFO,szFile);
				}
}
BOOL inport_begin(HWND hwnd)
{
	//分配环境句柄
	result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
	//设置管理环境属性
	result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
	//分配连接句柄
	result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
	//设置连接属性
	result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
	//连接数据库
	result = SQLDriverConnect(hdbc,NULL,ConnStrIn,SQL_NTS,ConnStrOut,MAXBUFLEN,(SQLSMALLINT *)0,SQL_DRIVER_NOPROMPT);
	if(SQL_ERROR==result)
	{
		ShowDBConnError(hwnd,hdbc);
		return FALSE;
	}
	ImportStatus = TRUE;
	return TRUE;
}
DWORD WINAPI ThreadFunc(LPVOID lpParam)                //多线程任务
{
	HWND hwnd = (HWND)lpParam;
	char str[50];
	char fname[11];
	char fage[11];
	int  age;
	int i,j,k;
	int IntoNum = 0;
	//TCHAR temp[256];
	
	TCHAR info[256];
	FILE * Input;
	for (i=0;szFile[i]!='\0';++i)                        //处理绝对路径
	{
		if (szFile[i]=='\\')
		{
			szFile[i]='/';
		}
	}
	if(strlen(szFile)==0){SetDlgItemText(hwnd,IDC_STATUS,"请选择文件!"); return 0;}
	Input = fopen(szFile,"r");                                //打开文本文档
	BOOL hasError=FALSE;
	/*创建新的数据库句柄,执行SQL语句*/
	result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
	result = SQLPrepare(hstmt,(SQLCHAR *)"insert into T_Person(FName,FAge) values(?,?)",SQL_NTS);//两个占位符
	SQLINTEGER iSQL_NTS=SQL_NTS;
	while(!feof(Input)&&ImportStatus)                //判断文件流是否到末尾,并判断导入标志的状态
	{
		ZeroMemory(fname,sizeof(fname)/sizeof(char));
		ZeroMemory(fage,sizeof(fage)/sizeof(char));
		ZeroMemory(str,sizeof(str)/sizeof(char));
		//ZeroMemory(temp,sizeof(temp)/sizeof(TCHAR));
		ZeroMemory(info,sizeof(info)/sizeof(TCHAR));
		fgets(str,50,Input);
		for (i=0,j=0,k=0;str[k]!='\0';++k)                                        //将文件流中的姓名和年龄数据进行处理,存储到相应的变量中
		{
			if (str[k]>='A'&&str[k]<='Z' || str[k]>='a'&&str[k]<='z')
			{
				fname[i] = str[k];
				++i;
			} 
			else
			{
				if (str[k]>='0'&&str[k]<='9')
				{
					fage[j] = str[k];
					++j;
				}
			}
		}
		fname[i] = '\0';
		fage[j] = '\0';
		age = atoi(fage);
		
		if(CHECKDBSTMTERROR(hwnd,result,hstmt)==TRUE) {hasError=TRUE;break;}
		//给两个占位符赋值
		SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,strlen(fname),0,fname,0,&iSQL_NTS);
		SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,sizeof(int),0,&age,0,&iSQL_NTS);
		result =SQLExecute(hstmt);
		if(CHECKDBSTMTERROR(hwnd,result,hstmt)==TRUE) {hasError=TRUE;break;}
		Sleep(30);
		wsprintf(info,TEXT("正在导入第%d条数据"),++IntoNum);
		SetDlgItemText(hwnd,IDC_STATUS,info);
	}

	fclose(Input);
	SQLFreeStmt(hstmt,SQL_CLOSE);
	SQLDisconnect(hdbc);                                        //如果到达末尾,跳出,并关闭数据库
	SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV,henv);
	if(hasError==TRUE)
	{
		SetDlgItemText(hwnd,IDC_STATUS,TEXT("数据库操作出错,取消导入!"));
	}
	else if (ImportStatus)
	{
		SetDlgItemText(hwnd,IDC_STATUS,TEXT("恭喜您,所有的数据都已经导入成功!"));
	}
	else
	{
		SetDlgItemText(hwnd,IDC_STATUS,TEXT("您已经取消了数据库的导入!"));
	}
	return 0;
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch(id)
    {
        case IDC_OK:
                {
                        if(inport_begin(hwnd))
						{
                        CreateThread(NULL,0,ThreadFunc,hwnd,0,0);  //开始使用多线程调用函数
						}
						else
						{
							SetDlgItemText(hwnd,IDC_STATUS,TEXT("数据库连接出错,取消导入!"));
						}
                        break;
                }
		case IDC_CANCEL:
			{
				ImportStatus = FALSE;
				break;
            }
		case IDC_FILEOPEN:
			openfile(hwnd);
			break;
        default:
		break;
    }
}

void Main_OnClose(HWND hwnd)
{
    EndDialog(hwnd, 0);
}




 




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
2月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
6月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
161 2
|
2月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
113 11
|
3月前
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
2月前
|
SQL 关系型数据库 MySQL
如何将Excel表的数据导入RDS MySQL数据库?
本文介绍如何通过数据管理服务DMS将Excel文件(转为CSV格式)导入RDS MySQL数据库,涵盖建表、编码设置、导入模式选择及审批执行流程,并提供操作示例与注意事项。
|
3月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
332 0
|
7月前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
286 35
|
5月前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。

热门文章

最新文章

推荐镜像

更多