Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
Delphi 字符串存储为"&引用;使用FireDAC阵列DML_Delphi_Firebird_Firedac_Firebird2.5 - Fatal编程技术网

Delphi 字符串存储为"&引用;使用FireDAC阵列DML

Delphi 字符串存储为"&引用;使用FireDAC阵列DML,delphi,firebird,firedac,firebird2.5,Delphi,Firebird,Firedac,Firebird2.5,我在使用FireDAC数组DML和Delphi XE7将数据插入Firebird 2.5数据库时遇到了这个问题,它将字符串数据存储为“???????”文本,如下图所示: 我有一个TList并将它们循环传递给params: //ADetalles is a TList<TServiciosDetRec> ADataSet.Params.ArraySize := ADetalles.Count; ADataSet.ParamByName('id').DataType := ftIn

我在使用FireDAC数组DML和Delphi XE7将数据插入Firebird 2.5数据库时遇到了这个问题,它将字符串数据存储为“???????”文本,如下图所示:

我有一个TList并将它们循环传递给params:

//ADetalles is a TList<TServiciosDetRec>

ADataSet.Params.ArraySize := ADetalles.Count;

ADataSet.ParamByName('id').DataType := ftInteger;
ADataSet.ParamByName('nombre').DataType := ftString;
ADataSet.ParamByName('serv').DataType := ftInteger;
ADataSet.ParamByName('check').DataType := ftInteger;

for i := 0 to ADataSet.Params.ArraySize -1 do begin

  ADataSet.ParamByName('id').AsIntegers[i] := AIndex;
  ADataSet.ParamByName('nombre').AsStrings[i] := ADetalles.Items[i].SNombre; //<--- Here the Problem
  ADataSet.ParamByName('serv').AsIntegers[i] := ADetalles.Items[i].SCodigo;
  ADataSet.ParamByName('check').AsIntegers[i] := AListChecked.Items[ADetalles.IndexOf(ADetalles.Items[i])].Checked.ToInteger;

end;

ADataSet.Execute(ADataSet.Params.ArraySize,0);

使用普通ExecSQL逐个插入数据,字符串存储正确,但使用execute array DML不正确。

要存储Unicode值,请使用访问器(如果要显式执行,请将数据类型设置为)。我这样说是为了防止这是你的问题(从你提供的信息中很难猜测)。谢谢Victoria,我的英语很差,很抱歉,当我使用execSQL逐个插入数据时,我没有问题,但速度很慢。。。我尝试了你的建议。听起来很奇怪,但是如果你有一个Unicode数据库并且想要存储Unicode值,你必须使用
AsWideString
访问器来存储单个值,而
AsWideString
用于DML数组。是这样的。如果您想让我或其他人调查您报告的问题,您必须添加更多信息。就像您在数据库中使用的编码一样,您在从FireDAC连接时使用的设置是什么。使用ftWidestring和asWideString[]预期会起作用,但是,为什么不使用数组DML中的ftString和assString[]以及正常的循环ExecSQLis来起作用呢?我对此表示怀疑。。谢谢@Victoria@Mark,这在Unicode主题的一节中进行了说明。必须在连接参数中将其设置为UTF8(并且数据库必须是此类数据库)。但这并不意味着由此产生的问题(这是我的猜测)。但是无论如何,您需要在客户端指定适当的字符集,还是我错了?为什么单值和DML之间存在差异我不能说,因为我手头没有这样的旧Delphi。我将设置字符集并使用
作为宽字符串
  TServiciosDetRec = record
    SNombre: String;
    SCodigo: Integer;
    SSelected: Boolean;
  end;