从BDE移植到ADO。本来完全没问题的语句现在出问题了。例如以下代码,目的是根据条件判断,如果表中没有就插入数据:
with AdoCommand do
Begin
Connection:=AdoConnection;
CommandType:=cmdText;
CommandText:=
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=:Field1 AND Field2=:Field2 ' +
' AND Field3=:Field3 AND Field4=:Field4) ' +
'BEGIN' +
' INSERT table1 '+
' (Field1,Field2,Field3,Field4,Field5) '+
' VALUES(:Field1,:Field2,:Field3,:Field4,:Field5) ' +
'END';
Parameters.ParamByName('Field1').Value:=Value1;
Parameters.ParamByName('Field2').Value:=Value2;
Parameters.ParamByName('Field3').Value:=Value3;
Parameters.ParamByName('Field4').Value:=Value4;
Parameters.ParamByName('Field5').Value:=Value5;
Execute; //这句出错
end;出错信息:Parameter object is improperly defined. Inconsistent or incomplete information was provided用TQuery赋上相应的SQL语句时是完全没问题的,而转用ADOCommand就出现异常了(转用ADOQuery结果一样)。请问高手,这问题该如何解决?什么原因造成的?注:以上SQL语句,把IF EXISTS条件去掉的话异常就没有了。
with AdoCommand do
Begin
Connection:=AdoConnection;
CommandType:=cmdText;
CommandText:=
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=:Field1 AND Field2=:Field2 ' +
' AND Field3=:Field3 AND Field4=:Field4) ' +
'BEGIN' +
' INSERT table1 '+
' (Field1,Field2,Field3,Field4,Field5) '+
' VALUES(:Field1,:Field2,:Field3,:Field4,:Field5) ' +
'END';
Parameters.ParamByName('Field1').Value:=Value1;
Parameters.ParamByName('Field2').Value:=Value2;
Parameters.ParamByName('Field3').Value:=Value3;
Parameters.ParamByName('Field4').Value:=Value4;
Parameters.ParamByName('Field5').Value:=Value5;
Execute; //这句出错
end;出错信息:Parameter object is improperly defined. Inconsistent or incomplete information was provided用TQuery赋上相应的SQL语句时是完全没问题的,而转用ADOCommand就出现异常了(转用ADOQuery结果一样)。请问高手,这问题该如何解决?什么原因造成的?注:以上SQL语句,把IF EXISTS条件去掉的话异常就没有了。
解决方案 »
- 自定义组件click事件问题
- 怎么实现 关闭程序时候,跳出输入密码框,如果输入正确则退出,如果错误则回到程序界面
- 能不能把BOM表裝入到 TcxDBTreeList 中
- 请教BDE的api数据库查询问题
- 我新开一专门供大家研讨的QQ\ 有意者加进来\ 欢迎高手\不加女生、本人基本上18小时在线
- 在filelistbox中双击一个文件名,如何使它运行?
- 添加记录?
- 请教高手!急需!
- 绝顶好的文章,不可不看,如果你还犹豫,那就当是进来拿分吧!
- 通用数据库程序问题
- dbgrid的一列某一单无改变值后另一列相关字段值改变的事件和代码如何写?
- 一个曾经问过的问题:Delphi6 DBGrid控件的DBGrid.Columns设置了DropDownRow和PickList后,如何设置运行时只允许用户从下拉表中选取,不
你不用参数只接写肯定没问题
try:
先定义参数,然后再给值,一切按书上的来做,可能问题能很快解决!祝你好运!
那有什么办法可以作最小的改动而让程序正实工作呢?
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1='+Value1.tostring+' AND Field2='+ Value2.tostring+'.........'
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=:Field1 AND Field2=:Field2 ' +
' AND Field3=:Field3 AND Field4=:Field4) ' +
'BEGIN' +
' INSERT table1 '
+ ' (Field1,Field2,Field3,Field4,Field5) '
+' VALUES('+''''+Field1+''''+','+''''+Field2+''''+','+''''+Field3+''''+','
+''''+Field4+''''+','+''''+Field5+''''+') '
+'END';
试一下
其中Field1...是字符型变量!
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=@Field1 AND Field2=@Field2 ' +
' AND Field3=@Field3 AND Field4=@Field4) ' +
'BEGIN' +
' INSERT table1 '+
' (Field1,Field2,Field3,Field4,Field5) '+
' VALUES(@Field1,@Field2,@Field3,@Field4,@Field5) ' +
'END';
Parameters.ParamByName('@Field1').Value:=Value1;
Parameters.ParamByName('@Field2').Value:=Value2;
Parameters.ParamByName('@Field3').Value:=Value3;
Parameters.ParamByName('@Field4').Value:=Value4;
Parameters.ParamByName('@Field5').Value:=Value5;
试试
' declare @Field1,@Field2,@Field3,@Field4,@Field5 int
select @Field1 = :Field1,@Field2 = :Field2,@Field3 = :Field3 ,@Field4 = Field4,@Field5 =:Field5
IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=@Field1 AND Field2=@Field2 ' +
' AND Field3=@Field3 AND Field4=@Field4) ' +
'BEGIN' +
' INSERT table1 '+
' (Field1,Field2,Field3,Field4,Field5) '+
' VALUES(@Field1,@Field2,@Field3,@Field4,@Field5) ' +
'END';
Parameters.ParamByName('Field1').Value:=Value1;
Parameters.ParamByName('Field2').Value:=Value2;
Parameters.ParamByName('Field3').Value:=Value3;
Parameters.ParamByName('Field4').Value:=Value4;
Parameters.ParamByName('Field5').Value:=Value5;
这样写应该没问题
CommandText:=
'IF NOT EXISTS (SELECT 1 FROM table1 '+
' WHERE Field1=:Field1 AND Field2=:Field2 ' +
' AND Field3=:Field3 AND Field4=:Field4) ' +
'BEGIN' +
' INSERT table1 '+
' (Field1,Field2,Field3,Field4,Field5) '+
' VALUES(:Field11,:Field12,:Field13,:Field14,:Field15) ' +
'END';
Parameters.ParamByName('Field1').Value:=Value1;
Parameters.ParamByName('Field2').Value:=Value2;
Parameters.ParamByName('Field3').Value:=Value3;
Parameters.ParamByName('Field4').Value:=Value4;
Parameters.ParamByName('Field11').Value:=Value1;
Parameters.ParamByName('Field12').Value:=Value2;
Parameters.ParamByName('Field13').Value:=Value3;
Parameters.ParamByName('Field14').Value:=Value4;
Parameters.ParamByName('Field15').Value:=Value5;
“ exception class EOleException with message '不能比较或排序 text、ntext 和 image 数据类型,除非使用 IS NULL 或 LIKE 运算符。'”
但我的表里根据就没有TEXT/IMAGE/NTEXT类型的字段,赋给参数的值也全都是STRING来的。莫名其妙。用yangdear()的方法成功了,但这样令到我的SQL语句变得非常的长了。 还有其他的方法吗?期待ING
我用的就是7啊。to tonycjl(陈欣): 现在根本不是这个问题,如果没有的话在编译这关就通不过了。继续期待着……
1、如belllab(bell)所描述的那样,参数不同名
2、不使用参数
3、循环赋值同名参数(不使用ParamByName)