帮我看一看这段代码问题出在什么地方?

时间:2022-04-08 14:14:51
var
  sQueryString, sMoney_name, sMoney_sname : string;
  fChange_rate : integer;
begin
  sMoney_name  := '';
  sMoney_sname := '';
  fChange_rate := 0;
  sQueryString := '';

  sMoney_name  := Trim(edtMoneyName.Text);
  sMoney_sname := Trim(edtMoneySName.Text);
  fChange_rate := StrToInt(Trim(edtChangeRate.Text));

  dmFootBallForm.ADOQuery1.Close;
  dmFootBallForm.ADOQuery1.SQL.Clear;
  dmFootBallForm.ADOQuery1.SQL.Add('insert into FootBall..MoneyType(money_id,money_name,money_sname,change_rate) values(1, :sMoney_name, :sMoney_sname, :fChange_rate)');
  dmFootBallForm.ADOQuery1.ExecSQL;


end;

9 个解决方案

#1


执行后提示:无法将NULL值插入列'money_name',表'football.dbo.MoneyType';该列不允许为空值。INSERT失败。

可每个值都有输入呀,没有空的值呀。

#2


首先,你的数据库的有些字段是不允许为空的;
其次,你的SQL语句中用了变量参数作为输入值(如::sMoney_name, :sMoney_sname, :fChange_rate),那你必须用ADOQuery1.Parameters.ParamByName('sMoney_name').value:=sMoney_name指定参数的值,否则程序执行时会将其当空值处理;(这样就多此一举了)

#3


给你段程序,如果去掉有标识的那两句,数据库只有插入空行。

var
  a1,b1,sqlstr:String;
begin
  a1:='ss';
  b1:='yy';
  sqlstr:='Insert into aa (aa,bb) values (:a1,:b1)';
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(sqlstr);
  ADOQuery1.Parameters.ParamByName('a1').value:=a1;   //去掉
  ADOQuery1.Parameters.ParamByName('b1').value:=b1;   //去掉
  ADOConnection1.BeginTrans;
  ADOQuery1.ExecSQL;
  ADOConnection1.CommitTrans;
end;

#4


dmFootBallForm.ADOQuery1.ExecSQL;
在这段代码前面加入
dmFootBallForm.parameties.paramByName('smoney_name'):=你所要传的值,
...
三个变量都要这样加,

#5


你没有给参数赋值的
dmFootBallForm.ADOQuery1.SQL.Add('insert into FootBall..MoneyType(money_id,money_name,money_sname,change_rate) values(1, :sMoney_name, :sMoney_sname, :fChange_rate)');
//这里应该给参数的赋值的
parameters.ParamByName(sMoney_name).value:=sMoney_name;
parameters.ParamByName(sMoney_sname).value:=sMoney_sname;
parameters.ParamByName(fChange_rate).value:=fChange_rate;
dmFootBallForm.ADOQuery1.ExecSQL;

#6


应该是dmFootBalForm.adoQuery1.parameties.paramByName('sMoney_name'):=你所要传的值,

#7


如果用存储过程,应该如何实现以上这段代码要实现的目的呢,请朋友帮着写一段。谢谢!

#8


直接用dmFootBallForm.ADOQuery1.SQL.Add('insert into FootBall..MoneyType(money_id,money_name,money_sname,change_rate) values(1, '''+sMoney_name+''', '+sMoney_sname+''','+fChange_rate+''')');就是了,何必这么兴师动众。

#9


楼上的说得对,SQLSERVER支持变量的,不用参数也行!

#1


执行后提示:无法将NULL值插入列'money_name',表'football.dbo.MoneyType';该列不允许为空值。INSERT失败。

可每个值都有输入呀,没有空的值呀。

#2


首先,你的数据库的有些字段是不允许为空的;
其次,你的SQL语句中用了变量参数作为输入值(如::sMoney_name, :sMoney_sname, :fChange_rate),那你必须用ADOQuery1.Parameters.ParamByName('sMoney_name').value:=sMoney_name指定参数的值,否则程序执行时会将其当空值处理;(这样就多此一举了)

#3


给你段程序,如果去掉有标识的那两句,数据库只有插入空行。

var
  a1,b1,sqlstr:String;
begin
  a1:='ss';
  b1:='yy';
  sqlstr:='Insert into aa (aa,bb) values (:a1,:b1)';
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add(sqlstr);
  ADOQuery1.Parameters.ParamByName('a1').value:=a1;   //去掉
  ADOQuery1.Parameters.ParamByName('b1').value:=b1;   //去掉
  ADOConnection1.BeginTrans;
  ADOQuery1.ExecSQL;
  ADOConnection1.CommitTrans;
end;

#4


dmFootBallForm.ADOQuery1.ExecSQL;
在这段代码前面加入
dmFootBallForm.parameties.paramByName('smoney_name'):=你所要传的值,
...
三个变量都要这样加,

#5


你没有给参数赋值的
dmFootBallForm.ADOQuery1.SQL.Add('insert into FootBall..MoneyType(money_id,money_name,money_sname,change_rate) values(1, :sMoney_name, :sMoney_sname, :fChange_rate)');
//这里应该给参数的赋值的
parameters.ParamByName(sMoney_name).value:=sMoney_name;
parameters.ParamByName(sMoney_sname).value:=sMoney_sname;
parameters.ParamByName(fChange_rate).value:=fChange_rate;
dmFootBallForm.ADOQuery1.ExecSQL;

#6


应该是dmFootBalForm.adoQuery1.parameties.paramByName('sMoney_name'):=你所要传的值,

#7


如果用存储过程,应该如何实现以上这段代码要实现的目的呢,请朋友帮着写一段。谢谢!

#8


直接用dmFootBallForm.ADOQuery1.SQL.Add('insert into FootBall..MoneyType(money_id,money_name,money_sname,change_rate) values(1, '''+sMoney_name+''', '+sMoney_sname+''','+fChange_rate+''')');就是了,何必这么兴师动众。

#9


楼上的说得对,SQLSERVER支持变量的,不用参数也行!