我工作的一个数据库程序,使用dbExpress组件(德尔福7)。 >的TDataSetProvider - - >的TClientdataSet - >的TDataSource - > TDBEdit将TSQLDataSet:将数据从所述数据库通过以下组分检索。 到现在为止,窗体上有工作正常。 在将TSQLDataSet的查询
select id, name, byteken, timeflag from scales where id = :p1
我加入大量(2048)varchar字段到数据库表; 当我这个字段添加到上面的查询(并连接或者和TDBMemo或TDBRichEdit)到TDataSource),我收到以下消息时,我尝试在新的文本字段编辑值
Unable to find record. No key specified.
我得到同样的错误时,有没有TDBMemo的形式(但在查询中varchar字段)。 当我从查询中删除varchar字段,一切重新正常工作。
可能是什么这个问题的原因是什么?
====更多信息====
我现在已经在表单中定义持久字段。 持有的关键表中的字段设置为[pfInUpdate,pfInWhere,pfInKey]其供应商的标志,而所有其他领域有其标志为[pfInUpdate,pfInWhere。 这并不解决问题。
持久字段是对ClientDataSet的定义。 当我在将TSQLDataSet定义他们,“但没有指定键”不会出现该错误消息。 该计划还推出此错误信息(这是我忽视了前面提):
EDatabase error: arithmetic exception, numeric overflow or string truncation
大串场在“displaywidth”和“大小”正确的值。
====甚至更多的信息====
我重写使用非数据感知组件的形式。 一个查询从数据库中检索数据(使用完全一样,我使用的将TSQLDataSet相同的查询字符串); 然后将数据传送到控制。 用户按下的形式上的OK按钮后,将数据通过另一个查询执行的更新或插入传递回数据库。 作为这一工作正常,我没有看到的问题是与数据感知组件是什么。
====信息的另一个片段====
我发现这个问题上堆栈溢出,这似乎解决类似的问题。 我改变了查询是
select id, name, name, byteken, timeflag,
cast (constext as varchar (2048)) as fconstext
from scales
where id = :p1
并设置数据库备注的数据字段是“fconstext”。 添加文本到数据库备注后,“的ApplyUpdates”呼叫现在失败,出现以下消息
column unknown 'fconstext'
尽管没有与该名称创建一个持久字段。
我不知道这是否有助于或干脆muddies水。
====更多信息,4月23日====
我从数据库表中删除字段,然后加了回去。 作为编写程序工作正常,只要被输入到问题的数据字段中的字符串小于约260个字符。 我加了十个字符一次了几次都没有问题,直到字符串的长度是256。然后,我增加了一些更多的字符(不计),试图挽救 - 并得到了错误。 从这个角度上,试图以添加一个或多个字符会导致该错误消息(来自于“的ApplyUpdates” ClientDataSet的方法)。
原来,该领域包含832个字符,所以没有一个硬性限制,我可以成功地存储的字符数。 但是,一旦出现错误信息,它总是出现,就像该数据库还记得,有一个错误。
====更多信息,4月24日====
再一次,我从数据库中删除字段加入回来; 字符集是WIN1251,是在不很清楚,我现在(我不需要西里尔字母)的原因。 我可以进入使用数据感知控件的最大字符数似乎是约280,不管如何领域本身的定义。
因为我已经搬到了在出现此问题的真正的程序中使用非数据感知控件 ,我可以向你保证,这个限制不存在那里。 因此我相当肯定,问题是不是由于字符大小不匹配,因为已建议。 不要忘了,我是用Delphi 7,不具有Unicode字符串。 我认为有在组件的一个错误,但我使用的是旧版本,我想,这个问题已经解决了,但不是在我使用的版本。
====希望最终编辑25/04/12 ====
继蚊子的建议下,我创建了一个新的数据库,其默认字符集是WIN1252(UTF-8没有出现一个选择,反正我的计划是不是Unicode)。 在此洁净数据库中,我定义的一个表,其中“constext”字符串的字符集也被定义为WIN1252。 我跑的问题形式的数据感知版本,并能没有问题(目前超过1700个字符)输入文字。
这似乎,因此,这个问题是由具有对数据库和一个用于现场定义的一个字符集创建。 我不知道该怎么回想起来有什么设置数据库的默认字符被定义为检查,所以我无法证实这一点。
我现在有定义一个新的数据库的小问题(有50+表),并从原始数据库复制数据。 由于该数据库服务于客户的主打产品,我有些警惕这样的....