請問這個是不是delphi的bug,clientdataset查詢問題.(100分)

  • 主题发起人 主题发起人 zhaoxuncai
  • 开始时间 开始时间
Z

zhaoxuncai

Unregistered / Unconfirmed
GUEST, unregistred user!
cdmaterial 為clientdataset控件<br>cdmaterial1.Close;<br>cdmaterial1.CommandText:='select wl_no from material where &nbsp;wl_model='+quotedstr(trim(edit1.Text))+' and wl_spec='+quotedstr(trim(edit2.text))+' order by wl_no ';<br>cdmaterial1.Open;<br>當edit1.text:='25&quot;' &nbsp;(25&quot;是指25英寸) &nbsp;,edit2.text:='3:1' 時無法查詢,提示錯誤信息: Arguments are of the wrong type,are out of acceptable range, or are in conflict with one another<br>我反復試驗過, 在edit1,edit2中如果不同時出現 &quot; 和 : 就可以查詢,例如 edit1為25&quot; ,edit2為 31 或 edit1為25 ,edit2為3:1時 不會出錯誤提示,如果同時出現就會有錯誤提示.<br>請問是什麼原因?
 
1、quotedstr可能是将字符串用双引号围起来还是单引号?<br>2、25之后是两个单引号还是一个双引号?<br>总之,是因为引号问题,导致3:1被认为不是字符串常量了,而不在字符串常量里的冒号,<br>被认为是一个参数的开始。<br>在cdmaterial1.Open;这句加上断点,看看cdmaterial1.CommandText的内容你就明白了。<br>这不是cds的问题。
 
wl_spec 数据库里是什么类型?
 
1.數據庫 mssql &nbsp; wl_spec char(30)<br>2.25&quot; 是雙引號
 
再頂上去
 
如果25&quot;是双引号,这个错误看来是bug……错误的把:1当作参数了,cdmaterial1.CommandText:= &nbsp;这行<br>是你的真实的代码吗?在断点处得到的代码在sqlserver能执行否?<br><br>……<br>在cdmaterial1.Open;之前cdmaterial1.Params.clear是否能解决问题?
 
或者换个方式,用参数方式,就是改成:<br>cdmaterial1.CommandText:='select wl_no from material where &nbsp;wl_model=:p1 and wl_spec=:p2 order by wl_no ';<br>然后<br>cdmaterial1.Params.parambyname('p1').asstring:=edit1.text;<br>cdmaterial1.Params.parambyname('p2').asstring:=edit2.text;<br>cdmaterial1.open;<br>这样应该行。
 
是真實代碼,我也感到很郁悶
 
你先showmessge(cdmaterial1.CommandText)<br>看看<br><br>不行再看数据库的字段有没有问题
 
*******或者换个方式,用参数方式,就是改成:<br>cdmaterial1.CommandText:='select wl_no from material where &nbsp;wl_model=:p1 and wl_spec=:p2 order by wl_no ';<br>然后<br>cdmaterial1.Params.parambyname('p1').asstring:=edit1.text;<br>cdmaterial1.Params.parambyname('p2').asstring:=edit2.text;<br>cdmaterial1.open;<br><br>代碼改成這樣后出現新的提示: stringdata,right truncation &nbsp;(右切斷)
 
邪门了!!<br>我实验……
 
我用参数方式一点问题没有!!!<br>不过我这两个字段类型不是char(30),我干脆再实验一下。
 
一点问题没有!得到正确的结果。<br>表结构:<br>CREATE TABLE TABLE_test (<br> f1 char (30) ,<br> f2 char (30) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )<br>commandText的值是:select * from table_test where f1=:p1 and f2=:p2<br>edit1.text=25&quot; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;edit2.text=3:1<br>按钮的代码:<br> &nbsp; clientdataset1.Params.ParamByName('p1').AsString:=edit1.Text;<br> &nbsp; clientdataset1.Params.ParamByName('p2').AsString:=edit2.Text;<br> &nbsp; clientdataset1.Open;<br>我在TABLE_test填写了一些数据,点击按钮能够得到正确结果,没有任何错误信息。<br><br>环境:delphi7.5,sqlserver2000
 
我的環境是 delphi 7.0 &nbsp; &nbsp;sqlserver2000<br>你的7.5是什麼版本
 
用参数方式处理几乎是唯一的方法,这个应该不是cds的问题,在query中,都有这个问题。<br>先查看sqlserver帮助看对&quot;,: 的处理方法,然后查看delphi中sql语句的处理方法。
 
7.0打了两个补丁之后,是build 8.1(在网上搜一下,www.51delphi.com上应该有)<br>我觉得即使7.0,6.0都应该没有问题。
 
我的是三層.clientdataset 查詢時如遇到':'字符會提示錯誤
 
cdnewmater1.Close; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;<br>cdnewmater1.CommandText:='update material set wl_model=:p1,wl_spec='+quotedstr &nbsp;<br> &nbsp; &nbsp; &nbsp; &nbsp;(trim(edit3.Text))+',wl_name=:p2 wl_no=+'''+trim(edit1.Text)+''' &nbsp;';<br>cdnewmater1.params.parambyname('p1').asstring:=trim(edit7.Text);<br>cdnewmater1.params.ParamByName('p2').AsString:=trim(edit4.Text);<br>cdnewmater1.Execute;<br>當edit7.text:='25&quot; ',edit3.text:='12線 2:1' ,edit4.text:='25&quot; 12線 2:1 YO'時無法修改,edit4.text中有&quot;和:兩個字符因而無法個性,如果兩個不同時存在就可以 ,是三層clientdataset 數據庫 mssql<br>現在搞的頭大,用變量也不行.....
 
[red]:[/red]
 
cdnewmater1.Close; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;<br>cdnewmater1.CommandText:='update material set wl_name=:p1 where wl_no=+'''+trim(edit1.Text)+''' &nbsp;';<br>cdnewmater1.params.parambyname('p1').asstring:=trim(edit7.Text);<br>cdnewmater1.Execute;<br>當edit7.text:='25&quot; 12線 2:1 YO'時無法修改,edit4.text中有&quot;和:兩個字符因而無法個性,如果兩個不同時存在就可以 ,是三層clientdataset 數據庫 mssql<br>現在搞的頭大,用變量也不行.....
 
后退
顶部