[6.2.8 / SQLite] Can not access a DML array as a single value
Posted: Fri 27 Nov 2015 10:19
Hello,
I'm not able to use batch insert with SQLite.
I'm getting this error " Can not access a DML array as a single value" when executing the insert query.
I'm not able to use batch insert with SQLite.
I'm getting this error " Can not access a DML array as a single value" when executing the insert query.
Code: Select all
function TCTMArticles.GetArticles: Boolean;
var
str: string;
ArticleList: TArticleList;
Article: TArticle;
ArticleDetail: TArticleDetail;
i: Integer;
InternalConnection: TUniConnection;
cptArt, cptArtDet: Integer;
qryArticles, qryDetails: TUniSQL;
procedure ArticleToParams(var AUniQuery: TUniSQL;
const Article: TArticle; Index:Integer);
begin
AUniQuery.Params[0][Index].AsString := Article.lib_art;
AUniQuery.Params[1][Index].AsString := Article.gencod_art;
AUniQuery.Params[2][Index].AsString := Article.code_art;
AUniQuery.Params[3][Index].AsInteger := Article.colisage;
AUniQuery.Params[4][Index].asfloat := Article.stock;
end;
procedure ArticleDetailToParams(var AUniQuery: TUniSQL;
const Article: TArticle; const ArticleDetail: TArticleDetail; Index:Integer);
begin
AUniQuery.Params[0][Index].AsString := Article.gencod_art;
AUniQuery.Params[1][Index].AsString := Article.code_art;
AUniQuery.Params[2][Index].AsString := ArticleDetail.gencod;
AUniQuery.Params[3][Index].AsString := ArticleDetail.couleur;
AUniQuery.Params[4][Index].AsString := ArticleDetail.taille;
AUniQuery.Params[5][Index].AsInteger := ArticleDetail.nb_pcs;
end;
begin
result := False;
if not WebServiceAlive(FWebServiceHostName, FWebServicePort) then
exit;
ArticleList := TArticleList.Create;
InternalConnection := TUniConnection.Create(nil);
qryArticles := TUniSQL.Create(nil);
qryDetails := TUniSQL.Create(nil);
try
str := GetCTMWebService(False, FWebServiceURL)
.transfert(jsonStockArticlesGet, jsonStockArticles);
ArticleList := TArticleList.FromJsonString(str);
if (ArticleList.infodef.retnumbers = 0) or
(ArticleList.infodef.errcode <> '') then
exit;
SetDefaultConnection(connection, InternalConnection);
qryArticles.connection := InternalConnection;
qryArticles.SQL.Text := sqlStockArticlesInsert;
qryArticles.Params[0].DataType := ftString;
qryArticles.Params[1].DataType := ftString;
qryArticles.Params[2].DataType := ftString;
qryArticles.Params[3].DataType := ftInteger;
qryArticles.Params[4].DataType := ftFloat;
qryArticles.Params.ValueCount := Length(ArticleList.articles);
cptArtDet := 0;
for Article in ArticleList.articles do
cptArtDet := cptArtDet + Length(Article.artDetail);
qryDetails.connection := InternalConnection;
qryDetails.SQL.Text := sqlStockArticlesDetailInsert;
qryDetails.Params[0].DataType := ftString;
qryDetails.Params[1].DataType := ftString;
qryDetails.Params[2].DataType := ftString;
qryDetails.Params[3].DataType := ftString;
qryDetails.Params[4].DataType := ftString;
qryDetails.Params[5].DataType := ftInteger;
qryDetails.Params.ValueCount := cptArtDet;
cptArt:=0;
cptArtDet := 0;
for Article in ArticleList.articles do
begin
ArticleToParams(qryArticles,Article,cptArt);
cptArt := cptArt +1;
for ArticleDetail in Article.artDetail do
begin
ArticleDetailToParams(qryDetails,Article, ArticleDetail, cptArtDet);
cptArtDet := cptArtDet + 1;
end;
end;
InternalConnection.StartTransaction;
try
InternalConnection.ExecSQL(sqlStockArticleDelete);
qryArticles.Execute(cptArt-1);
qryDetails.Execute(cptArtDet-1);
InternalConnection.Commit;
result := True;
except
InternalConnection.Rollback;
end;
finally
ArticleList.free;
qryArticles.free;
qryDetails.free;
InternalConnection.free;
end;
end;