C++中istream和stringstream的使用

来源:互联网 发布:电脑用电子白板软件 编辑:程序博客网 时间:2024/04/29 01:10

   上个项目完成第一个版本开发,写的部分由于是底层SDK。测试的时候没有BUG可改,于是又回到本部门开始做数据库维护的工作。数据库表设计已基本成型,主要是添加或删除一些字段。麻烦的是要为数据库表建立触发器,而且这些触发器功能都一样,就是在数据更新的时候写历史记录。一百多个表,一个一个写不知道写到什么时候,甚至有些表字段就差不多有一百个字段。于是下载一个MySQL的C++连接器,不知道为什么,下源码居然编译通不过,里面甚至还有一些基本的标识符不识别的错误。真不知道Oracle想把MySQL怎么样了,上传代码不用检查吗?下了一个编译好非安装的库,加入工程使用,居然连基本的getString函数都报错。恩,不是我一个人遇见,其他人的解决方法是使用getBlob代替。于是就是我标题中的istream流了,使用方法如:

string svalue;

std::istream* id = result->getBlob(sfield.c_str());//从结果集中取回字段sfield.c_str()的值

*id >> (svalue);//把该值输出给svalue;以前还真没如此使用过istream。


下面还是使用MySQL连接器引出的问题,该问题导致我化了一天的时间,恩。有如下几个问题:

1、MySQL连接器库对string进行封装成SQLString,并重载了该类的构造函数接收string,char[]及char*等类型作为参数来构造SQLString对象,于是导致在调用excute函数的时候传递给string字符串时,编译器不会报告类型不匹配,因为会构造临时SQLString对象,但是在运行时由于内存结构不一样会导致崩掉。至于为什么string给SQLString中的string不行,我也还不清楚。最后改成string的data()或c_str()函数返回char[]后传给excute函数解决。有一点变态的是封装后的SQLString再我直接构造一个字符串的时候编译器总是提示指针错误,其实是没问题的,只是在SQLString的前几个字符为被使用吧。

2、我一直认为DELIMITER命令式MySQL服务器提供的命令,所以我在编程的时候在前面加了一个DELIMITER $$命令,由于该命令后第1点同时存在,导致我未搞清楚什么原因。其实DELIMITER是告诉客户端什么时候可以提交一个SQL语句,由于我是在程序中处理,所以是不需要改命令的。在用户手动输入的时候,由于默认情况下回车会提交,导致多行的命令不能完整提交而出现该命令。正因为这,我找不到原因,于是加了连接器提供的异常处理机制。是网上一个老兄提供的代码,如下:


cout<< "# ERR: SQLException in " << __FILE__;
cout<< "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
cout<< "# ERR: " << e.what();
cout<< " (MySQL error code: " << e.getErrorCode();
cout<< ", SQLState: " << e.getSQLState().data() << " )" << endl;

可我是在MFC下,cout的东西看不到,而且我不想去改写这些代码,印象中找到了stringstream类。

处理如下,需要包含sstream头文件。

stringstream sException;

sException << "# ERR: SQLException in " << __FILE__;
sException << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
sException << "# ERR: " << e.what();
sException << " (MySQL error code: " << e.getErrorCode();
//sException << ", SQLState: " << e.getSQLState().data() << " )" << endl;//这句不知道为什么会崩掉
string str = sException.str();//这样就先输出到stringstream对象中,在从中提取出字符串就OK了。
AfxMessageBox(str.data());


总的来说,感觉上MySQL提供的这些连接器不太专业,感觉做为C++程序员的我也不太专业,连C++基本的输入输出流都使用不熟。不过问题解决了就行

原创粉丝点击