query.sql='select a,b,c,d,e from a,b,c where ....';
来源3个表,
设计时添加字段列表,每个字段有Origin属性
分别是a.a,b.b,c.c格式,表示该字段是那个表。
然后query.edit,query.post方法调用后,生成update或insert语句的时候,
UPDATE ttdb.dbo.a
SET [a.a] = @P1
WHERE [a.a] = @P2
AND [a.b] = @p3
sql server报错,提示
消息 207,级别 16,状态 1,第 3 行
列名 'a.a 无效。
数据库字段肯定存在,只是加了[]就不识别了,去掉[]就不报错了,加[]的字段名[a]是可以识别,比如
[table1.a],[t1.b],[t1.c];这样是无法识别列的存在.t1.a,t1.b,t1.c这样是可以识别。前段firedac生成的语句自动加上了[]无法去掉。
在source\data\firedac\FireDAC.DApt.pas文件里,
arUpdate: Result.CommandText := oCmdGen.GenerateUpdate;
就是FireDAC.Phys.SQLGenerator.pas文件里的方法,GetWhere方法,GetColumn和NormalizeColName方法最加上了[],暂时找不到去的地方。FGenOptions也没有赋值调用的地方,故而放弃此思路。
query有UpdateOptions>UpdateTableName属性,设置为要更新的表名,然后把各个字段的Origin的前缀去掉,使得生成的update 语句只有列名而无前缀[field];试试。
select [fieldname] from table //列存在
select table1.fieldname from table //列存在
select [table1.fieldname] from table //列不存在,这种写法不行吗
select table1.fieldname from table //列存在
select [table1.fieldname] from table //列不存在,这种写法不行吗