关于解决VS2008ODBC连接MySQL时“绑定所有列“程序崩溃问题

VS2008中使用C#连接Oracle数据库的完整指南 在深入了解如何使用C#连接Oracle数据库之前,有必要先理解数据库连接的理论基础。数据库连接是应用程序与数据库服务器之间建立的逻辑连接,这允许应用程序执行数据的存取操作。在.NET环境中,C#与数据库的交互通常依赖于ADO.NET框架。ADO.NET提供了核心组件,如Connection、Command、DataReader和DataAdapter等,这些组件是构建数据库操作逻辑的基础。数据库连接原理涉及以下核心步骤:建立连接:通过数据库连接字符串,应用程序初始化与数据库的通信链接。 阅读详情

2012年5月20更新:

1. 连Oracle没有这个问题,修改了标题

2.可以使用VC6生成这些东西,不过和VS2008生成的有一些不同。

==============


这两天做数据库实验,VS2008连接MySQL数据库的时候,或者添加类的时候,每次勾选“绑定所有列”都会导致VS2008崩溃,上网一番搜索也没找到什么合适的解决方式。找到的一些文章都是建议手工绑定。



虽然我用的表不超过十个,每个表里的属性也不超过十个,不过总觉得手工去建立一个一个CRecordSet的派生类,再自己在*.h添加变量,在*.cpp添加诸如“RFX_Text(pFX, _T("location"), m_location);”这样的句子实在是太麻烦了……


于是自己写了一个小小的代码生成器来完成这项工作。其实思路很简单,就是读取*.sql文件里的create table部分,参照VS2008 Class Wizard自动生成对应的*.h和*.cpp,生成对应的*.h和*.cpp文件。分别为table对应的CRecordSet的派生类。之后把这些文件都拷贝到VS2008工程的文件夹里,添加到项目中就可以了。


生成器是按照自己写*.sql的习惯来写的,主要是方便自己使用,所以对sql文件有做了几个小限制:
1. 使用生成代码器前把create table替换成createtable
2. table名字不包括“XXXXXXXX”,因为这个作为占位符放在sample.h和sample.cpp中供复制文件时替换
3. 目前只支持varchar和int类型,因为我暂时只需要这两个,不过扩展起来很方便

4. 习惯性写法“create table tablename( ...”中tablename后加一个括号,然后换行,所以代码生成器中直接去掉括号得到tablename


要手工改一下*.cpp里初始化部分的n_Fields……


如果发现新添加的这些类没有基类型,手工用Class Wizard添加一个CRecordSet的派生类再删掉就可以了。


代码草草加了一些注释,贴上来吧。

/*
CRecordSet派生类产生器
团子 2012年4月20日
sql文件要求:
处理前先把"create table"换成createtable
table名后换行
暂时只处理varchar和int类型,别的有需要再加
假设table不会叫"XXXXXXXX"
*/

#include <string>
#include <iostream>
#include <fstream>
using namespace std;

const string output_dir="res\\";    //输出文件夹
const string sqlfilename="lab2_gen.sql";    //*.sql文件
const string suffix="set";          //类名=C+tablename+suffix

string tablename;                   //当前处理的table的名字+suffix

void copytofile(ofstream &dst, const char* filename)
{
    ifstream src(filename);
    if (!src.is_open())
    {
        printf("%s 未找到!\n", filename);
        return;
    }
    int pos;
    string tmp;
    while (getline(src, tmp))
    {
        while ((pos=tmp.find("XXXXXXXX", 0))!=string::npos)
        {
            tmp.replace(pos, 8, tablename.c_str());
        }
        dst<<tmp<<endl;
    }
    src.close();
}

int main()
{
    string str[2];
    ofstream res_h, res_cpp;

    freopen(sqlfilename.c_str(), "r", stdin);

    int now=0, pre=1;
    str[pre]="";

    while (cin>>str[now])
    {
        const char* strpre=str[pre].c_str();
        const char* strnow=str[now].c_str();
        if (str[pre].find("createtable", 0)==0)
        {
            str[now].replace(str[now].find("(", 0),1,"");  //如果习惯性写法中table名之后连着括号
            tablename=str[now]+"set";
            string hname=output_dir+tablename+".h";
            string cppname=output_dir+tablename+".cpp";
            printf("build %s %s\n", hname.c_str(), cppname.c_str());
            res_h.open(hname.c_str(), ios::out);
            res_cpp.open(cppname.c_str(), ios::out);
            if (!res_h.is_open() || !res_cpp.is_open())
            {
                printf("输出文件打开失败!\n");
                return 0;
            }
            copytofile(res_h, "sample1.h");
            copytofile(res_cpp, "sample1.cpp");
        }
        if (str[now].find("varchar", 0)==0)
        {
            //变量名以m_开头
            res_h<<"\tCString m_"<<str[pre]<<";"<<endl;
            res_cpp<<"\tRFX_Text(pFX, _T(\""<<str[pre]<<"\"), m_"<<str[pre]<<");"<<endl;
        }
        else if (str[now].find("int", 0)==0)
        {
            //变量名以m_开头
            res_h<<"\tint m_"<<str[pre]<<";"<<endl;
            res_cpp<<"\tRFX_Int(pFX, _T(\""<<str[pre]<<"\"), m_"<<str[pre]<<");"<<endl;
        }
        //else if ... 如果要添加对更多类型的支持,这里可以相应扩展
        if (str[now].find(");", 0)==0)
        {
            copytofile(res_h, "sample2.h");
            copytofile(res_cpp, "sample2.cpp");
            res_h.close();
            res_cpp.close();
        }
        now=1-now;
        pre=1-pre;
    }
    return 0;
}


sample.h和sample.cpp是VS2008 Class Wizard自动生成的CRecordSet的派生类对应的文件修改而来的。拆成两部分,中间部分正好是用来添加变量或者是RFX_Text之类的。

sample1.h

// XXXXXXXX.h : CXXXXXXXX 的声明

#pragma once

// 由团子的code_gen生成~

class CXXXXXXXX : public CRecordset
{
public:
	CXXXXXXXX(CDatabase* pDatabase = NULL);
	DECLARE_DYNAMIC(CXXXXXXXX);

// 字段/参数数据


sample1.cpp

// XXXXXXXX.h : CXXXXXXXX 类的实现

// CXXXXXXXX 实现

// 由团子的code_gen生成~

#include "stdafx.h"
#include "XXXXXXXX.h"
IMPLEMENT_DYNAMIC(CXXXXXXXX, CRecordset)

CXXXXXXXX::CXXXXXXXX(CDatabase* pdb)
	: CRecordset(pdb)
{
	m_nFields = 0;
	m_nDefaultType = dynaset;
}

CString CXXXXXXXX::GetDefaultConnect()
{
	return _T("换掉我");  //换成自己的
}

CString CXXXXXXXX::GetDefaultSQL()
{
	return _T("");
}

void CXXXXXXXX::DoFieldExchange(CFieldExchange* pFX)
{
	pFX->SetFieldType(CFieldExchange::outputColumn);


sample2.h

// 以下字符串类型(如果存在)反映数据库字段(ANSI 数据类型的 CStringA 和 Unicode
// 数据类型的 CStringW)的实际数据类型。
//  这是为防止 ODBC 驱动程序执行可能
// 不必要的转换。如果希望,可以将这些成员更改为
// CString 类型,ODBC 驱动程序将执行所有必要的转换。
// (注意: 必须使用 3.5 版或更高版本的 ODBC 驱动程序
// 以同时支持 Unicode 和这些转换)。


// 重写
	// 向导生成的虚函数重写
	public:
	virtual CString GetDefaultConnect();	// 默认连接字符串
	virtual CString GetDefaultSQL(); 	// 记录集的默认 SQL
	virtual void DoFieldExchange(CFieldExchange* pFX);	// RFX 支持

// 实现
#ifdef _DEBUG
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

};



sample2.cpp

}
/////////////////////////////////////////////////////////////////////////////
// CXXXXXXXX Õï¶Ï

#ifdef _DEBUG
void CXXXXXXXX::AssertValid() const
{
	CRecordset::AssertValid();
}

void CXXXXXXXX::Dump(CDumpContext& dc) const
{
	CRecordset::Dump(dc);
}
#endif //_DEBUG



在VS2019中复活与重构经典MFC计算器项目:从环境配置到代码优化 消息驱动与对话框编程是Windows桌面应用开发的核心基础。其原理在于应用程序通过响应系统或用户产生的消息(如点击、键盘输入)来驱动界面更新与业务逻辑执行。这项技术的价值在于它构建了图形用户界面(GUI)与后台逻辑之间的高效通信机制,是实现交互式软件的关键。在工程实践中,微软基础类库(MFC)为C++开发者提供了封装此机制的成熟框架,广泛应用于计算器、文本编辑器等经典桌面工具的开发。本文将以一个典型的MFC计算器项目为标本,详细解析如何在现代VS2019集成开发环境中重建开发环境、处理字符集与库依赖等配置问 阅读详情

相关推荐

c#连接mysql示例

mysql c# odbc windows7 64位处理器

VS2008 ODBC方式连接Mysql7.9

ODBC简介 开放数据库互连(Open DatabaseConnectivity,ODBC)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQ

feilongzaitianhehe的专栏 1454

mysql连接过多和死掉以及拒绝服务的解决方法

mysql连接过多导致总是死掉,后来网上搜索发现此文自Mysql 5.x的某个版本之后,Mysql的自动关闭空闲连接的特性修改了,如果一个连接空闲到超时时间(默认28000秒8小时),再次发起的Reconnect重新连接请求不会被接受,需要重新建立新连接,这就导致了SER的重连机制不能正常工作:SER只会在需要操作数据库时去使用同一个连接接口,断开了则发起重新连接请求,而且这个问题短期内SER也不能够解决:)处理方法:1.使用Mysql 4.0或4.1版本,如果没有用到Mysql 5的一些新特性比如存储过程触发器之类。2.定时重启Mysql服务器或Ser(由于本问题可能同样会影响到其它一些需要

VS2019 EF6连接Mysql闪退以及实体框架版本问题

VS2019 EF6连接Mysql闪退以及实体框架版本问题 花了两三天才解决,踩过很多坑,bing,csdn,博客园的文档都要翻烂了。试过网上很多种方案,避免码友踩和我相同的坑,以下是我的解决方案。 解决方案 1,需要安装两个连接mysql的插件,MySQL版本不要太高了(包括部署在云服务器上的) [mysql-connector-net-6.9.11.msi](MySQL :: Download MySQL Connector/NET (Archived Versions)) [mysql-for-vi

m0_54560077的博客 1190

POWER SI仿真流程

一、打开软件Power SI二、加载PCB,可以直接使用brd文件,不用再进行格式转换三、check Stackup,与原来的PCB叠层对照一遍,检查数据加载后有没有出错。四、select Nets,加载brd文件后,可能所有的网络都处于使用状态,先在右侧net manager下面右键disable all nets,再使能需要仿真的电源网络(如果要仿真的网络没有归属到电源网络,在其上右键,选classfy as power \ground nets)

lx5213的博客 1316

JOOQ用法和实例

jOOQ,是一个ORM框架,利用其生成的Java代码和流畅的API,可以快速构建有类型约束的安全的SQL语句。jOOQ的核心优势是可以将数据库表结构映射为Java类,包含表的基本描述和所有表字段。通过jOOQ提供的API,配合生成的Java代码,可以很方便的进行数据库操作生成的Java代码字段类型是根据数据库映射成的Java类型,在进行设置和查询操作时,因为是Java代码,都会有强类型校验,所以对于数据的输入,是天然安全的,极大的减少了SQL注入的风险。

m0_67403076的博客 1376

2008 mysql odbc_VS2008 C++ ODBC mysql datasource

Linker:http://blog.youkuaiyun.com/ztz0223/article/details/7614091Hyperlink before introduce the basical ODBCbetween VS2008 C++ project and Mysql datasource.The issue I met isMySQL ODBC "architecture misma...

weixin_30572265的博客 158

HTB_Bike靶机之模板注入

船到桥头自然直 文章目录信息收集模板引擎SSIT 模板注入后放答案 信息收集 日常 A 扫描,两个端口 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:.

网络安全学习 797

crecordset连接mysql_visual c++ 2008进行MySQL编程(ODBC)-- (四) 终极实现 之 派生CRecordset 上...

本来想一直这么写着,写完增删,写修改,写完遍历(查询,用多了C++,习惯说遍历)数据库。但是,我最近有点累,速度结束吧。不过,我依旧愿意做到最好。还是先交待一下,需要有点C++的知识,不要太多,就是派生和一点点异常的知识,同时有点Mysql的Sql操作即可。先回忆之前的3篇文章,建议看过了再来开始这里:我的邮箱:azuo1228@gmail.com有什么疑问如果不能在回复里面说清楚,就邮件@我吧。...

weixin_39815286的博客 151

[ensp报错:USG6000V错误代码45解决方案]

[ensp报错:USG6000V:错误代码45解决] [ensp报错:USG6000V:错误代码45解决] 第一种处理方式: ensp的45错误帮助文档里的解决方法:(这里就不说了,上华为爸爸的图) ensp的45错误:如果你的45错误不是描述的那个,可能是ensp与virtualbox不兼容了。 错误描述:具体表现为在virtualbox里没有vfw_usg的条目,虚拟介质管理器里也没有相应的条目: 就是vfw_usg_vdi这个 这种情况下你把ensp卸载重装多少次都没用,原因在两个软件的兼容

weixin_45456536的博客 3万+

基于NE555的触摸延时开关电路设计与实现

本文详细介绍了基于NE555芯片的触摸延时开关电路设计与实现方法。通过分析NE555的单稳态工作模式,结合定时电阻、电解电容等关键元件选型,提供了一套完整的电路搭建方案。文章还包含抗干扰设计、调试技巧及常见故障处理,帮助电子爱好者快速掌握触摸延时灯的制作要点。

weixin_29268267的博客 788

VC++数据库编程核心技术:MFC ODBC类深度解析与实战优化

数据库编程是连接应用程序与数据存储的核心技术,其本质在于通过标准化的接口协议实现高效、安全的数据交换。在C++生态中,ODBC作为跨数据库的统一接口基石,提供了驱动程序管理器与驱动程序的标准化调用层,确保了应用程序与多种数据库的兼容性。这一原理为上层封装框架奠定了技术基础,其价值在于平衡了开发效率与底层控制力,尤其适用于对性能与资源有严苛要求的金融、工业控制等场景。MFC ODBC类库正是基于此构建的经典封装,通过CDatabase和CRecordset等核心类,将ODBC API的面向过程调用转化为面向对

weixin_33739646的博客 825

100:vue+cesium: 加载glb文件,随机位置加载2000架飞机

本示例在 Vue + cesium 项目中随机位置加载2000架飞机,飞机是glb文件,每个大小为571kb。这个示例属于性能优化的范畴内,通常如果用entity加载glb只能显示几个飞机,这里采用primitive的方法来加载。直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果.

大剑师兰特的GIS世界 706

Visual C++数据库开发实战:MFC ODBC核心技术与性能优化指南

数据库连接技术是构建企业级应用的核心基础,其原理在于通过标准接口实现应用程序与数据存储系统之间的高效通信。在Windows平台开发中,ODBC(开放数据库互连)作为广泛采用的数据库访问标准,提供了跨数据库的统一API层,确保了代码的可移植性和维护性。Visual C++结合MFC框架对ODBC进行了深度封装,通过CDatabase和CRecordset等类,显著降低了数据库操作的复杂度,其技术价值体现在对系统资源的精细控制和接近底层的执行效率上。这种组合尤其适用于对性能有严苛要求的桌面应用、工业控制系统及遗

weixin_33978044的博客 378

使用字体解密技术爬取懂车帝二手车数据

本文介绍了一种针对懂车帝二手车平台的字体加密数据采集方案。通过抓包分析,识别出关键API接口并解析了字体加密机制,成功实现了价格等敏感数据的解密。方案采用requests库发送POST请求获取JSON数据,利用fontTools解析字体映射关系,建立加密字符到真实数字的转换算法。程序支持多页采集,提取车辆名称、价格、年份等12个维度的信息,并自动保存为Excel格式。技术亮点包括动态字体解析、健壮的数据处理和分页优化,为二手车市场分析提供了可靠的数据支持。文中特别强调数据采集的合法合规性,建议仅用于学术研究

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1310

Sigrity System SI Parallel Bus Analysis模式进行DDR3仿真分析操作指导-单个颗粒

Default Strobe Offset:DQS默认偏移时间,自动填充为0.5ns,即DQS默认偏移1/2UI,DQS滞后于DQ 1/2UI,让建立保持时间均分。WLO:写平衡偏移的数值,DataL是0ps,DataU是500ps,是根据WLOSkew自动定义的,可以认为是WLOSkew取整,也可以根据需要手动调整数值。注意AddCmd的UI=T,这里的Data Rate仍然是DQ的速率,并不是地址线的速率,地址线的速率=1/UI=1/2ns=0.5Gbps。

weixin_54787054的博客 365

MFC汽配管理系统实例解析:从架构设计到代码重构

桌面应用程序开发的核心在于如何有效地组织数据、业务逻辑与用户界面。文档/视图架构作为一种经典的设计模式,通过分离数据模型与显示逻辑,为构建可维护的桌面应用奠定了基础。其原理在于定义清晰的职责边界:文档类管理数据持久化与状态,视图类处理用户交互与呈现。这种分离带来的技术价值是提高了代码的模块化程度,便于测试与功能扩展。在实际的工程实践中,诸如库存管理、订单处理等业务场景,都需要处理数据一致性、事务操作与性能优化等挑战。以MFC框架实现的汽配管理系统为例,它完整展示了如何运用这一架构处理**数据持久化**与**

weixin_33881140的博客 553

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VS2008添加ODBC数据源崩溃

VS2008添加ODBC数据源崩溃 OS:win7旗舰版 IDE:VS2008 SP1 项目:MFC 描述: ODBC事先已经建好,此处直接添加即可应用。在用类向导添加MFC ODBC使用者类时出现VS2008崩溃(表现为停止工作而后自动重启); 网上有人说是数据库有问题,回去检查,数据库是用 access 2010建立,包括数据源一...

weixin_34168700的博客 292

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

国产系统 -中标麒麟上使用odbc连接mysql出现崩溃的解决办法

国产系统 -中标麒麟内核版本:Linux version 4.1.39-1.nd7.14.aarch64 (root@localhost.localdomain) (gcc version 5.3.1 20151207 (Red Hat 5.3.1-2) (GCC) ) #1 SMP Wed Jul 4 19:12:39 CST 2018 问题:如果你想通过odbc的方式连接mysql数据库,如...

zhouxiao2009的专栏 1484

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 222
上一篇: [POJ2337]
下一篇: Pajek学习笔记——centrality与centralization
program_shun
博客等级 码龄17年 10粉丝 43原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值