最近在练习ADO访问DB,好不容易写完了一堆的类,编译通过了,结果一运行就提示列名无效。
我一直在检查是不是表中的字段名用了关键字,然后或者是程序中和表的字段名不一致啥的。因为我的查询变量定义的类型是_bstr_t,压根就没考虑到查询变量不被DB识别的问题。
汗,结果是个超低级的错误。
code1(错误的):
_bstr_t vSQL;
vSQL="SELECT * FROM Users WHERE UserName="+cUserName;//cUserName是个CString变量,两者相加,编译可行
执行。
然后结果就是这个cUserName对应输入的值无法识别,说列名无效。
其实这个SQL语句还算是简短的,长了就很麻烦,VC又不支持两个字符常量直接相加,一个SQL语句要加N次,还容易出错。
用Format就方便许多。
code2(正确的):
_bstr_t vSQL;
CString sSQL;
sSQL.Format("SELECT * FROM Users WHERE UserName='%s'",cUserName);//假如SQL语句超长,这里就很好写,不用总是加来加去
vSQL=_bstr_t(sSQL);//最后转换成DB支持的_bstr_t类型就OK了。
执行。
当然也可以在code1直接再转换一下,不用搞个CString什么的,只是format超方便,推荐之。