我想问一下会不会是下面两句的问题
user_type:=dm2.query3.fieldbyname('用户类型').asstring;
name:=dm2.query3.fieldbyname('用户名').asstring;
会不会把所有的“用户类型”和“用户名”都符给了user_type和name变量
在存储过程中三个变量的类型为char长度为10,我在查询分析器中试了,执行
正常
user_type:=dm2.query3.fieldbyname('用户类型').asstring;
name:=dm2.query3.fieldbyname('用户名').asstring;
会不会把所有的“用户类型”和“用户名”都符给了user_type和name变量
在存储过程中三个变量的类型为char长度为10,我在查询分析器中试了,执行
正常
name:=dm2.query3.fieldbyname('用户名').asstring;
这两句不会有问题的,就算查询结果集返回多条记录,但上面的语句只会得到最后一条记录的数据(或者是第一条,记不清了),我怀疑是存储过程的问题,在查询分析器里,你输入的数据是否与程序中的数据相同?如果相同,你试试修改这里:
Params[1].asstring:=Trim(name);
Params[2].asstring:=Trim(user_type);
因为该字段你定义为char类型,如果长度不足,系统会自动添加空格,这有可能也会导致错误,试试看吧
我用分步运行得知,运行到execproc时系统出错,提示为
project project1.exe raised exception class EDBEngine Error with message 'General SQL error'
[microsoft][odbc sqldriver][sqlserver]将截断字符或二进制数据
[microsoft][odbc sqldriver][sqlserver]语句已终止
@username char(100),@usertype char(100),@use_type char(100)
as insert 工作日志(用户名,用户类型,操作类型,操作时间)
values(@username,@usertype,@use_type,getdate())
可以先给一个固定的值调试,如果通过那么。。
begin
Params[1].asstring:=name;
Params[2].asstring:=user_type;
Params[3].asstring:='111';
prepare;
execproc;
end;
把这段代码改为:
with dm2.StoredProc1 do
begin
Close;
Params.Clear;
{@Param1,@Param2,@Param3分别为你存储过程定义的参数变量名称}
Params.CreateParam(ftString,'@Param1',ptInput);
Params.CreateParam(ftString,'@Param2',ptInput);
Params.CreateParam(ftString,'@Param3',ptInput);
ParamByName('@Param1')asstring:=name;
ParamByName('@Param2')asstring:=user_type;
ParamByName('@Param3')asstring:='111';
prepare;
execproc;
end;
试试看
根据你的错误提示,应该属于存储过程的问题,肯定有某个字段超出了你定义的长度,好好检查检查看看
create proc 日志
@username varchar(100),@usertype varchar(100),@use_type varchar(100)
as insert 工作日志(用户名,用户类型,操作类型,操作时间)
values(@username,@usertype,@use_type,getdate())你在程序中调存储过程的时候,因为你定义参数为char类型,系统自动补足长度达100,所以插入数据时,数据被截断,提示出错