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

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

#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);
}

时间: 2024-09-16 01:13:07

c++将txt数据批量导入mysql数据库的例子的相关文章

文本数据批量导入导出数据库功能~~急~~

问题描述 在asp.net中怎么实现txt和Iso文件批量导入跟导出,导入的数据内容作成报表打印哪个能这好给我个例子 解决方案 解决方案二:关键在于你自定义的文件格式

数据批量导入Oracle数据库

SQL*LOADER是大型数据 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL).现在,我们抛开其理论不谈,用实例来使 您快速掌握SQL*LOADER的使用方法. 首先,我们认识一下SQL*LOADER. 在NT下,SQL*LOADER的命令为SQLLDR,在UNIX下一般为sqlldr/sqlload. 如执行:d:oracle>sqlldr SQL*Loader: Release 8.1.6.0.0 - Production on 星期二 1月 8 11:0

oracle数据导入mysql数据库日期格式问题

问题描述 oracle数据导入mysql数据库日期格式问题 从oralce数据库导出日期格式数据为 to_date('13-04-2015 16:40:12', 'dd-mm-yyyy hh24:mi:ss'), 如何把它修改为yyyy-mm-dd的形式存储到mysql数据库中,由于数据比较多,一条条修改太过麻烦,有没有什么好的方法 解决方案 参考import CSV to MySQL and convert date LOAD DATA LOCAL INFILE '/Users/Path/To

excel数据导入mysql数据库二种方法

下面我们要讲二种excel数据导入mysql教程数据库教程方法了,这二种方法比较简单,也是很方便的,以前我把excel数据导入到mysql数据库都是用php教程程序来实例,现在我们不需要程序,用现有的工具就行了. 方法一,利用phpmyadmin把excel数据导入mysql数据库方法如下 这是excel的,必须是这种样子的. 在phpmyadmin导入文件的格式应该如上图配置.(注意一点,导入的excel表的结构必须与mysql数据表的结构,数据类型等一致就ok了.否则会导入失败的. 方法二,

Excel数据导入Mysql数据库的实现代码_php技巧

    首先做一下说明,为什么我要用Navicat,第一个原因,因为它是个不错的Mysql GUI工具,更重要的是,它可以将一些外部数据源导入Mysql数据库中.因为我的数据源是excel数据,所以想借助Navicat将其导入Mysql.     第一次运行,首先创建连接,主机名填写:localhost,端口为3306,然后填写用户名密码,OK.顺利的话,大家就可以看到名为localhost的连接图标了.双击点开它,一般Mysql默认有两个数据库,分别为mysql与test.     不用管它们

ExcelFileParser处理excel获得数据 可作批量导入到数据库

ExcelFileParser处理excel获得数据 可作批量导入到数据库 提交表单 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <

有一个几万条的文本文档信息在导入MySql数据库时,总是出现错误,该如何解决?

问题描述 有一个几万条的文本文档信息在导入MySql数据库时,总是出现错误,该如何解决? 有一个几万条的文本文档信息在导入MySql数据库时,总是出现错误,该如何解决? 解决方案 具体看错误类型,可能某行数据格式等不规范. 解决方案二: 把错误信息发上来,或者通过二分法拆分成多个文件来分批导入. 解决方案三: 几万条数据不是很多,这要根据错误也解决.

sqlserver2008迁移-sql server2008数据导进mysql数据库时报错

问题描述 sql server2008数据导进mysql数据库时报错 我使用的是navicat for mysql工具导入:首先选择导入向导-->选择ODBC导入类型--->选择s数据源:sql server Native client for 10.0-->输入服务器名称.用户名.密码.数据库.点击测试连接时,显示链接成功.最后点确定时报错了:无法打开文件provider=sqlncli10........;server spn="":这个错误 怎么解决? 解决方案

mysql-请问,excel表中的数据如何倒入MySQL数据库?谢谢!

问题描述 请问,excel表中的数据如何倒入MySQL数据库?谢谢! 求详细步骤1111111111111111111111111111谢谢!谢谢! 解决方案 方法很多:1.phpmyadmin导入,格式选择csv,导入即可.注意文件格式2.使用phpexcel插件将excel数据读入成数组,然后用php插入mysql