用Tquery控件做数据库程序,在用insert语句时有问题,具体请进!

时间:2022-03-05 17:34:41
数据库有表,如下
create table tmp(
  zh varchar(3),                //证号
  lxdh varchar(20),             //联系电话
  sj date,                      //办理时间
  );

form上有三个控件(接受用户输入数据),如下
edit_zh: TEdit;
edit_dh: TEdit;
MaskEdit_sj: TMaskEdit;

有一按钮(将用户输入信息作为一条新记录插入数据库)
button1: Tbutton;

在按钮的onclick事件写入
procedure Tform1.button1Click(Sender: TObject);
begin
 query1.Close;
 query1.SQL.Clear ;
 query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
 query1.SQL.Add('values(:zh,:lxdh,:sj)');
 query1.params[0].AsString:=edit_zh;
 query1.params[1].AsString:=edit_dh.text;
 query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);
 query1.ExecSQL;
end;

现在问题时,有时用户输入的记录没有联系电话和办理时间,只有一个证号(只是有时候是这种情况),
我想让联系电话和办理时间为空,即可插入这样的记录:
zh           lxdh             sj
------------------------------------
008         [null]           [null]

怎么做,我上面的程序不行,

在query1.params[1].AsString:=edit_dh.text;里,因为我在 edit_dh控件的text里没输入内容,
它就把 '' 赋值给了 lxdh字段,这还没什么,

在query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);里,我在EaskEdit_sj控件的text也没输入内容,
就出错,提示   '' is not a valid date  

请问我要达到我的要求,怎么做?

24 个解决方案

#1


if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=0;

#2



try
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);
except
  query1.params[2].Asdate:=null;
end;

//8888888888888888888
if length(edit_dh.text) then

query1.params[1].AsString:='';

#3


try
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);
except
  query1.params[2].Asdate:=null;
end;

//8888888888888888888
if length(edit_dh.text) = 0 then

query1.params[1].AsString:='';
 

 

#4


用Apollo47(阿波罗) 的方法 sj字段的内容为1899/12/30,我想让它为[null]
用airhorse(编程至尊宝) 方法,出错,提示"Invalid variant type conversion"
等待解答

#5



  对了,对数据库传递参数,null,会有问题,你还是用,其他值代替吧!

#6


try
  if EaskEdit_sj.text=''  then Query1.SQL.add('insert into tmp(zh,lxdh)...')  
//不 插入时间值

else  'insert into tmp(zh,lxdh,sj)')  .....//插入时间值
excetp
  ........
end;

#7


我这只是个例子,我的表有20多个字段,怎么能使用9653013(毒谷) 的方法?

#8


首先,sj字段必须可以为空,
建议采用SQL语句插入
INSERT INTO tmp(zh,lxdh,sj)VALUES (zh,null,null);

#9


xlem(luzi) 这我知道
问题是,有时用户输入的记录没有联系电话和办理时间,只有一个证号(只是有时候是这种情况),
注意只是有时候是这种情况,
要是有时候我的sj字段又有内容了,即需要用户输入了,
那你的 INSERT INTO tmp(zh,lxdh,sj)VALUES (zh,null,null); 语句就不能满足要求了


大家快帮帮我呀!

#10


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=0;
query1.ExecSQL;


试试看吧。。。。

#11


machin(刷新一下) :
你所说的和Apollo47(阿波罗) 的方法 一样!
执行后法 sj字段的内容为1899/12/30,
但我想让它为null

快来帮我

#12


if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;

#13


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;
query1.ExecSQL;


#14


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
Try 
  StrToDateTime(EaskEdit_sj.text);
  query1.paramByName('sj').Asdate:=strtodate(EaskEdit_sj.text);
Except
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End;
query1.ExecSQL;

时间或日期的输入最好用TDateTimePicker控件
代码应改为:
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
If  EaskEdit_sj.Date = 0 Then
Begin
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End
Else
  query1.paramByName('sj').Asdate:=strtodate(EaskEdit_sj.text);
query1.ExecSQL;



#15


补充以上说明:
时间或日期的输入最好用TDateTimePicker控件
代码应改为:
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
If  EaskEdit_sj.Date = 0 Then
Begin
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End
Else
//  query1.paramByName('sj').Asdate:=StrToDate(EaskEdit_sj.Text);
  query1.paramByName('sj').Asdate:=EaskEdit_sj.Date;
query1.ExecSQL;



#16


to chinanet:

query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;
query1.ExecSQL;


再试试看吧。。。。

#17



Query1.RequestLive:=TRUE;
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.ExecSQL;

#18


to :machin(刷新一下) 
我说过了象 query1.params[2].Asdate:=null; 这句是不行的,delphi中不认识null,
到DBMS里才认识null

to:ch2zh1(逍遥剑客) 
不知道你的意思!

to: zou5655(周围)
你的方法很好,解决了问题!感谢!感谢
(都是我基础知识不好的结果) 
但我是这样做的(结合了前几位回复者的意见,也一并表示感谢)
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else 
  begin
    query1.params[2].datatype:=ftdate;
    query1.params[2].clear;
  end;
query1.ExecSQL;

准备给分了

再请问一下(继续加分),
Try …… Except ……和if……else……有什么区别,我不知道Try …… Except ……的用法

我在窗体上放一个label1和一个button1,
在button1的onclick事件中写入
label1.caption:=date;
执行时,label1变成 01-06-20 
我如何让它显示成 2001-06-20,这难道是delphi的千年虫?


#19


if else 条件语句符合条件即执行
Try …… Except 是在错误发生时才会去执行except语句

#20


格式化输出吧。

#21


label1.Caption:=datetostr(date);

#22


日期输出,两种方式都可以:
Label1.Caption := FormatDateTime('YYYY-MM-DD',Date);
Label1.Caption := FormatDateTime('YYYY"年"MM"月"DD"日"',Date);
If 是条件语句,具体有以下几种:
If ...
If ... Else
If .. Else If ..Else If ...  ...  ...  ... Else 
结构化异常处理语句:
Try ..Except ..End
Try ..Finally .. End 
具体操作,自己去看Delphi的Object Pascal语法. OK!!

#23


为什么一定要用日期类型呢?
就不能用字符串型?
用日期类型还有千年虫问题呀!

#24


本来是日期类型的数据用字符表示,会给数据处理带来一些麻烦。

#1


if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=0;

#2



try
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);
except
  query1.params[2].Asdate:=null;
end;

//8888888888888888888
if length(edit_dh.text) then

query1.params[1].AsString:='';

#3


try
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text);
except
  query1.params[2].Asdate:=null;
end;

//8888888888888888888
if length(edit_dh.text) = 0 then

query1.params[1].AsString:='';
 

 

#4


用Apollo47(阿波罗) 的方法 sj字段的内容为1899/12/30,我想让它为[null]
用airhorse(编程至尊宝) 方法,出错,提示"Invalid variant type conversion"
等待解答

#5



  对了,对数据库传递参数,null,会有问题,你还是用,其他值代替吧!

#6


try
  if EaskEdit_sj.text=''  then Query1.SQL.add('insert into tmp(zh,lxdh)...')  
//不 插入时间值

else  'insert into tmp(zh,lxdh,sj)')  .....//插入时间值
excetp
  ........
end;

#7


我这只是个例子,我的表有20多个字段,怎么能使用9653013(毒谷) 的方法?

#8


首先,sj字段必须可以为空,
建议采用SQL语句插入
INSERT INTO tmp(zh,lxdh,sj)VALUES (zh,null,null);

#9


xlem(luzi) 这我知道
问题是,有时用户输入的记录没有联系电话和办理时间,只有一个证号(只是有时候是这种情况),
注意只是有时候是这种情况,
要是有时候我的sj字段又有内容了,即需要用户输入了,
那你的 INSERT INTO tmp(zh,lxdh,sj)VALUES (zh,null,null); 语句就不能满足要求了


大家快帮帮我呀!

#10


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=0;
query1.ExecSQL;


试试看吧。。。。

#11


machin(刷新一下) :
你所说的和Apollo47(阿波罗) 的方法 一样!
执行后法 sj字段的内容为1899/12/30,
但我想让它为null

快来帮我

#12


if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;

#13


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;
query1.ExecSQL;


#14


query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
Try 
  StrToDateTime(EaskEdit_sj.text);
  query1.paramByName('sj').Asdate:=strtodate(EaskEdit_sj.text);
Except
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End;
query1.ExecSQL;

时间或日期的输入最好用TDateTimePicker控件
代码应改为:
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
If  EaskEdit_sj.Date = 0 Then
Begin
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End
Else
  query1.paramByName('sj').Asdate:=strtodate(EaskEdit_sj.text);
query1.ExecSQL;



#15


补充以上说明:
时间或日期的输入最好用TDateTimePicker控件
代码应改为:
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.paramByName('zh').AsString:=edit_zh;
query1.paramByName('lxdh').AsString:=edit_dh.text;
If  EaskEdit_sj.Date = 0 Then
Begin
  query1.ParamByName('sj').DateType:=ftDateTime;
  Query1.ParamByName('sj').Clear; 
End
Else
//  query1.paramByName('sj').Asdate:=StrToDate(EaskEdit_sj.Text);
  query1.paramByName('sj').Asdate:=EaskEdit_sj.Date;
query1.ExecSQL;



#16


to chinanet:

query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else
  query1.params[2].Asdate:=null;
query1.ExecSQL;


再试试看吧。。。。

#17



Query1.RequestLive:=TRUE;
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.ExecSQL;

#18


to :machin(刷新一下) 
我说过了象 query1.params[2].Asdate:=null; 这句是不行的,delphi中不认识null,
到DBMS里才认识null

to:ch2zh1(逍遥剑客) 
不知道你的意思!

to: zou5655(周围)
你的方法很好,解决了问题!感谢!感谢
(都是我基础知识不好的结果) 
但我是这样做的(结合了前几位回复者的意见,也一并表示感谢)
query1.Close;
query1.SQL.Clear ;
query1.SQL.Add('insert into tmp(zh,lxdh,sj)');
query1.SQL.Add('values(:zh,:lxdh,:sj)');
query1.params[0].AsString:=edit_zh;
query1.params[1].AsString:=edit_dh.text;
if EaskEdit_sj.Text<>'' then  
  query1.params[2].Asdate:=strtodate(EaskEdit_sj.text)
else 
  begin
    query1.params[2].datatype:=ftdate;
    query1.params[2].clear;
  end;
query1.ExecSQL;

准备给分了

再请问一下(继续加分),
Try …… Except ……和if……else……有什么区别,我不知道Try …… Except ……的用法

我在窗体上放一个label1和一个button1,
在button1的onclick事件中写入
label1.caption:=date;
执行时,label1变成 01-06-20 
我如何让它显示成 2001-06-20,这难道是delphi的千年虫?


#19


if else 条件语句符合条件即执行
Try …… Except 是在错误发生时才会去执行except语句

#20


格式化输出吧。

#21


label1.Caption:=datetostr(date);

#22


日期输出,两种方式都可以:
Label1.Caption := FormatDateTime('YYYY-MM-DD',Date);
Label1.Caption := FormatDateTime('YYYY"年"MM"月"DD"日"',Date);
If 是条件语句,具体有以下几种:
If ...
If ... Else
If .. Else If ..Else If ...  ...  ...  ... Else 
结构化异常处理语句:
Try ..Except ..End
Try ..Finally .. End 
具体操作,自己去看Delphi的Object Pascal语法. OK!!

#23


为什么一定要用日期类型呢?
就不能用字符串型?
用日期类型还有千年虫问题呀!

#24


本来是日期类型的数据用字符表示,会给数据处理带来一些麻烦。