Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在长VARCHAR字段(SQL Anywhere)中插入空(非空)字符串时,IsNull返回TRUE_Sql_Delphi_Varchar_Firedac_Sql Null - Fatal编程技术网

在长VARCHAR字段(SQL Anywhere)中插入空(非空)字符串时,IsNull返回TRUE

在长VARCHAR字段(SQL Anywhere)中插入空(非空)字符串时,IsNull返回TRUE,sql,delphi,varchar,firedac,sql-null,Sql,Delphi,Varchar,Firedac,Sql Null,Delphi 10.3.2企业数据库ASA(SQL Anywhere 17.0.9.4913) 我有这张桌子 创建表字符串\u null( lo_key integer非空默认自动递增主键, str_short char(100)非空默认值“”, str_long long varchar非空默认值“”); 我想使用FireDACTFDConnection和TFDQuery组件插入记录 qry.Insert; 如果我分配非空字符串,一切都正常工作 qry.FindField('str_sho

Delphi 10.3.2企业数据库ASA(SQL Anywhere 17.0.9.4913)

我有这张桌子

创建表字符串\u null(
lo_key integer非空默认自动递增主键,
str_short char(100)非空默认值“”,
str_long long varchar非空默认值“”);
我想使用FireDAC
TFDConnection
TFDQuery
组件插入记录

qry.Insert;
如果我分配非空字符串,一切都正常工作

qry.FindField('str_short')。Asstring:='ABC';
qry.FindField('str_long')。关联字符串:='XYZ';
如果我使用空字符串插入记录(空,非空!)

qry.FindField('str_short')。关联字符串:='';//IsNull为FALSE,好吗
qry.FindField('str_long')。关联字符串:='';//IsNull变为TRUE(错误!)
LONG VARCHAR字段上的
IsNull
属性返回TRUE,即使它被分配了一个非NULL值(空字符串),而short field行为是正确的

(连接和查询的属性
FormatOptions.strempty2null
均为FALSE)

此外,当我执行
Post()
方法时,Delphi在
LONG VARCHAR
字段上引发异常:

字段“str_long”必须有一个值

如果我设定

qry.FindField('str_long')。必需:=FALSE;
qry.Post;
记录成功插入到数据库中,字符串值为空

长话短说:如果我在
long VARCHAR
字段中插入一个带有空字符串值的记录,
IsNull
属性返回一个错误的值,我必须赋值
Required:=False
,以便执行
insert
操作。

在这个小型演示应用程序中,我尝试插入

  • 不是空字符串的记录(并且所有内容都正常工作)

  • 带有空字符串的记录

单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、FireDAC.Stan.Intf、FireDAC.Stan.Option、FireDAC.Stan.Error、FireDAC.UI.Intf、FireDAC.Phys.Intf、,
FireDAC.Stan.Def,FireDAC.Stan.Pool,FireDAC.Stan.Async,FireDAC.Phys,FireDAC.Phys.ASA,FireDAC.Phys.ASADef,FireDAC.VCLUI.Wait,
FireDAC.Stan.Param、FireDAC.DatS、FireDAC.DApt.Intf、FireDAC.DApt、Data.DB、FireDAC.Comp.DataSet、FireDAC.Comp.Client、Vcl.StdCtrls、,
FireDAC.Phys.SQLite、FireDAC.Phys.SQLiteDef、FireDAC.Stan.ExprFuncs、FireDAC.Phys.ODBCBase、FireDAC.Comp.UI;
类型
TForm1=类(TForm)
连接:TFD连接;
qry:TFDQuery;
备忘录:TMemo;
过程表单创建(发送方:ToObject);
私有的
过程执行插入(str\u值:字符串);
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
常数
LONG_字段='str_LONG';
SHORT_字段='str_SHORT';
过程TForm1.exec\u insert(str\u值:字符串);
程序消息(s:字符串);
开始
memo.Text:=memo.Text+s+#13#10
结束;
开始
味精("味精");;
msg('INSERT VALUE=“”+str_VALUE+”);
尝试
qry.插入;
如果qry.FindField(SHORT_FIELD).IsNull,则消息('BEFORE assign SHORT FIELD IsNull'))
else msg('BEFORE assign SHORT field NOT NULL');
如果qry.FindField(LONG_FIELD).IsNull,则msg('BEFORE assign LONG FIELD is NULL'))
else msg('BEFORE assign LONG field NOT NULL');
味精(“”);
qry.FindField(短字段).assString:=str\u值;
qry.FindField(长字段).assString:=str\u值;
如果qry.FindField(SHORT_FIELD).IsNull,则消息('AFTER assign SHORT FIELD IsNull'))
else msg('AFTER assign SHORT field NOT NULL');
如果qry.FindField(LONG_FIELD).IsNull,则msg('AFTER assign LONG FIELD is NULL'))
else msg('AFTER assign LONG field NOT NULL');
//qry.FindField(长字段)。必填项:=FALSE;
邮政总局
除了
关于e:Exception do msg('Exception:'+e.message)
结束;
味精(“”)
结束;
过程TForm1.FormCreate(发送方:TObject);
变量
s:字符串;
开始
conn.params.Text:='Database=jolly'#$D#$A'User\u Name=jop'#$D#$A'Password=jpw'#$D#$A'Server=jolly'#$D#$A'DriverID=ASA'#$D#$A;
conn.FormatOptions.strEmpty2Null:=FALSE;
连接:=真;
qry.FormatOptions.strEmpty2Null:=FALSE;
qry.SQL.Text:='select*from string_null';
qry.UpdateOptions.RequestLive:=TRUE;
qry.Active:=真;
执行董事插入(“ABC”);
执行插入(“”)
结束;
结束。
对象格式1:t格式1
左=0
Top=0
标题='Form1'
ClientHeight=299
ClientWidth=635
颜色=clBtnFace
Font.Charset=默认字符集
Font.Color=clWindowText
字体高度=-11
Font.Name='Tahoma'
Font.Style=[]
OldCreateOrder=False
OnCreate=FormCreate
设计尺寸=(
635
299)
PixelsPerInch=96
text高度=13
对象备忘录:TMemo
左=120
Top=8
宽度=273
高度=283
锚定=[akLeft、akTop、akBottom]
TabOrder=0
结束
对象连接:TFD连接
左=28
Top=12
结束
对象qry:TFDQuery
连接=连接
左=28
Top=64
结束
结束
程序项目1;
使用
Vcl.表格,
‘Unit1.pas’{Form1}中的Unit1;
{$R*.res}
开始
应用程序初始化;
Application.MainFormOnTaskbar:=True;
Application.CreateForm(TForm1,Form1);
应用程序。运行;
结束。

我还没有用其他数据库测试过这种行为。

您的字段被定义为
notnull
,因此根据定义
IsNull
永远不会为它们返回True。如果是的话,那就是一个bug。@RemyLebeau,我不确定当你调用qry.Insert之前,这是否仍然成立。插入后,通常所有字段都是空的,不是吗?@RemyLebeau这是真的,但是我可以为每个字段调用Clear方法——但是帖子会引发一个异常。我的