問題1、文參數(shù)的支持問題
今天在使用ClientDataSource查詢的時候,“divece_name”參數(shù)賦值為“%筆記本電腦%”,但是使用sql server Profiler跟蹤后發(fā)現(xiàn)查詢的語句變?yōu)椋?/p>
查詢的數(shù)據(jù)提交到數(shù)據(jù)庫時不完整,當我把N'@P1 varchar(8)', '%筆記本%'就可以正常執(zhí)行了
我想可能是數(shù)據(jù)類型不正確,于是這么寫:
cdsEquipment.Close;<br>cdsEquipment.Params.ParamByName('divece_name').DateType := ftWideString;cdsEquipment.Params.ParamByName('divece_name').Value := '%' + txtDevice.Text + '%';
cdsEquipment.Open;
但是提交到數(shù)據(jù)庫的數(shù)據(jù)依然不完整:
最后在中間服務端的ADOQuery控件的BeforeOpen事件中加入如下代碼就可以了:
adoqEquipment.Parameters.ParamByName('divece_name').Size := Length(adoqEquipment.Parameters.ParamByName('divece_name').Value);
重新設(shè)置參數(shù)長度,據(jù)說這是ADOQuery控件的BUG,對中文參數(shù)的支持問題
問題2、ADOQuery錯誤:ADOQuery1:commandtext does not return a result set
程序內(nèi)容:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into DBhomework values('+Edit1.Text+','+Edit2.Text+','+ComboBox1.Text+','+Edit3.Text+','+Edit4.Text+')');
ADOQuery1.Open;
解決方法:
ADOQuery1.Open; 這行改成 ADOQuery1.ExecSQL;
Select 之類的 SQL 語句才用 ADOQuery1.Open;
附:
在select中用open方法,是正確的,但是在insert中代碼能夠執(zhí)行,只是顯示了上面的錯誤信息:ADOQuery1:CommandText does not return a result set,后來才知道ExecSQL方法是執(zhí)行,不會要求SQL服務器給一個返回值,而對于select則能夠使用open方法,有返回值。
問題3、ADOQuery錯誤:在此上下問中不允許使用名稱"張三"。有效表達式包括常量、常量表達式和變量(在某些上下文中)。不允許使用列名。
程序內(nèi)容:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into DBhomework(學號,姓名,性別,手機號碼,班級) values('+Edit1.Text+','+Edit2.Text+','+ComboBox1.Text+','+Edit3.Text+','+Edit4.Text+')');
ADOQuery1.ExecSQL;
其中,“姓名”和“性別”的內(nèi)容是中文。
語法上能夠通過編譯。SQLserver服務器里面是確定表內(nèi)屬性的是字符類型了,在server2005中也能夠直接插入"張三"。在delphi中,把張三等中文換成數(shù)字或者字母能夠成功插入。
懷疑是ADOQuery組件的問題,所以換成ADOCommand組件,程序內(nèi)容如下:
Commandtext:='insert into DBhomework values('+Edit1.Text+','+Edit2.Text+','+ComboBox1.Text+','+Edit3.Text+','+Edit4.Text+')';
Execute;
出現(xiàn)一樣的錯誤信息。
解決方法:
'+Edit2.Text+'和'+ComboBox1.Text+'改成'''+Edit2.Text+'''和'''+ComboBox1.Text+'''
其他的'也可以換成'''
附:
錯誤原因是:對于字符串字段屬性沒有加上引號,一直以為是SQLserver數(shù)據(jù)庫建表中用的屬性的數(shù)據(jù)類型問題,后來又想過會不會是Delphi數(shù)據(jù)類型轉(zhuǎn)換問題,因為只要輸入中文就會出現(xiàn)問題,曾經(jīng)找到答案說加上雙引號,試過了不對,不知道雙引號在Delphi中是否等價于兩個單引