关于带单引号的大字符串插入sqlserver的问题。

monk2000 2012-10-28 07:41:29
解决方法1:把单引号替换为双引号,如下:

String sqlstr;
strMht = pMht;
strMht = StringReplace(strMht, "'", "''",TReplaceFlags()<<rfReplaceAll);
sqlstr.sprintf("insert into carinfo values ('%s','%s','%s','%s','%s','%s','%s',%d)", strDB[0],strDB[1],strDB[2],strDB[3],strDB[4],pCsv,pMht,0);

ADOQuery1->ParamCheck = false;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sqlstr);
ADOQuery1->ExecSQL();


问题是StringReplace函数占用的时间太多了,如果一定量的重复以上代码,花费的时间为5分钟之多。
把StringReplace的语句注释掉,把pMht改为"aaa",(pMht为含较多单引号的大字符串缓冲)
sqlstr.sprintf("insert into carinfo values ('%s','%s','%s','%s','%s','%s','%s',%d)", strDB[0],strDB[1],strDB[2],strDB[3],strDB[4],pCsv,“aaa”,0);
再一定量的重复以上代码,花费的时间为20秒。也就是说大量的时间被StringReplace占用。

还有其他解决单引号问题又不用字符替换的方法吗?
...全文
272 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2012-10-28
  • 打赏
  • 举报
回复
还是用参数形式传入合适。

insert into 语句中,把字段名也列出来,如:
insert into carinfo(字段1,字段2,字段3...) values(...)
monk2000 2012-10-28
  • 打赏
  • 举报
回复
我这样写
        String sqlstr;
sqlstr.sprintf("insert into carinfo values ('%s','%s','%s','%s','%s',:pCsv,:pMht,%d)", strDB[0],strDB[1],strDB[2],strDB[3],strDB[4], 0);
ADOQuery1->Close();
ADOQuery1->SQL->Add(sqlstr);
ADOQuery1->Parameters->ParamValues["pCsv"] = pCsv;
ADOQuery1->Parameters->ParamValues["pMht"] = pMht;
ADOQuery1->ExecSQL();

却抛出“数据库已存在名为carinfo的对象”的异常。而我根本就没有要创建表
ccrun.com 2012-10-28
  • 打赏
  • 举报
回复
Good.

另外,
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sqlstr);
这两条语句和
ADOQuery1->SQL->Text = sqlstr;
的效果是一样的。

monk2000 2012-10-28
  • 打赏
  • 举报
回复
解决了,抛出“数据库已存在名为carinfo的对象”的异常是因为没有写ADOQuery1->SQL->Clear();语句,导致重复创建表。
解决代码如下:
String sqlstr;
sqlstr = "insert into carinfo(Product,Area,CarType,Version,Caption,csv,mht,bookmark) values (:1,:2,:3,:4,:5,:6,:7,:8)";
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(sqlstr);

ADOQuery1->Parameters->ParamByName("1")->Value = strDB[0];
ADOQuery1->Parameters->ParamByName("2")->Value = strDB[1];
ADOQuery1->Parameters->ParamByName("3")->Value = strDB[2];
ADOQuery1->Parameters->ParamByName("4")->Value = strDB[3];
ADOQuery1->Parameters->ParamByName("5")->Value = strDB[4];
ADOQuery1->Parameters->ParamByName("6")->Value = pCsv;
ADOQuery1->Parameters->ParamByName("7")->Value = pMht;
ADOQuery1->Parameters->ParamByName("8")->Value = 0;
ADOQuery1->ExecSQL();

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧