搞不定了,难。。。(200分)

C

chenxz

Unregistered / Unconfirmed
GUEST, unregistred user!
AnsiString SqlStr;
SqlStr = "update tb set f1 = " + QuotedStr(RichEdit1->Text)
+ " where f1 = '1'"

问题是,当ReichEdit1中含有偶数个双引号时,query->ExecSql()是成功的,如果是
奇数个双引号时,返回错误。
更奇怪的是,直接在bcb6上写的程序是没问题的,从bcb5升级过来的就有这个问题。
 
建议用Parameter
SqlStr = "update tb set f1 = :f1 "
+ " where f1 = '1'"
然后在Parameter中设置类型和值
最后再ExecSQL()
 
SqlStr = "update tb set f1 = '" + RichEdit1->Text
+ "' where f1 = '1'"
 
to yanghaijun:
这样肯定是不行的啦,如果richedit->text中有单引号的话,一下就报错了。
 
我倒,C++有这么讨厌么?
 
给你一个小函数
AnsiString strReplace(AnsiString strSource, AnsiString strReplaceCharacter)
{
//将源字符串中所有待替换字符替代为两个待转换字符
for (int i = 1;
i <= strSource.Length();
i++)
{
if (strSource.SubString(i, 1) == strReplaceCharacter)
{
if (i == 1)
{
strSource = strReplaceCharacter + strSource;
}
else
{
if (i == strSource.Length())
{
strSource = strSource + strReplaceCharacter;
}
else
{
strSource =
strSource.SubString(1, i)
+ strReplaceCharacter
+ strSource.SubString(i + 1, strSource.Length() - i);
}
}
i++;
}
}
return (strSource);
}
用时
strReplace(Trim(frmone->ListBox1->Items->Strings.SubString(1,16)),"'")
 
内容引号与字符串引号冲突了
用中文引号试试
 
引号是容易闹脾气!哎!
 
是这样的啊!没什么奇怪的啊!
 
[:D]这样。可以把单引号找出来,然后替换成 ‘’进行配对
 
用Parameter肯定可以并且还容易编写
 
用Parameter,同意,对于特殊字符的冲突就不用管了!
 
>>>更奇怪的是,直接在bcb6上写的程序是没问题的,从bcb5升级过来的就有这个问题。
各位解释一下这个问题啊。并且update过来的程序,必须修改bde.hpp中的plongint为
system::plongint才能编译通过。
 
建议不要用“+”操作符来做字符串的拼接,这样的效率比较低,灵活使用sprintf或Format
可以得到很好的效率。
AnsiString SqlStr;
SqlStr = Format("update tb set f1 = /"%s/" where f1='1'",
ARRAYOFCONST((RichEdit1->Text)));
但是正如前面各位说的,这样在遇到单、双引号的时候就要出问题,所以最好还是用
TParam::AsString方法来存储安全。
 
c++ builder最令人讨厌的就是向下兼容差的问题 有时候真叫人发疯
 
多人接受答案了。
 
顶部