delphi – dbExpress /未指定密钥
我正在使用dbExpress组件(Delphi 7)开发数据库程序.通过以下组件从数据库中检索数据:TSQLDataSet – > TDataSetProvider – > TClientDataSet – > TDatasource – > TDBEdit.到目前为止,表格已正常运作. 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’和’size’中具有正确的值. ====更多信息==== 我重写了表单以使用非数据感知组件.一个查询从数据库中检索数据(使用与我在TSQLDataSet中使用的查询字符串完全相同的查询字符串);然后将数据传输到控件.在用户按下表单上的“确定”按钮后,数据将通过执行更新或插入的另一个查询传递回数据库.由于这可以正常工作,我不知道数据感知组件的问题是什么. ====又一段信息==== 我在Stack Overflow上找到了this question,这似乎解决了类似的问题.我将查询更改为 select id,timeflag,cast (constext as varchar (2048)) as fconstext from scales where id = :p1 并将dbMemo的数据字段设置为’fconstext’.将文本添加到dbMemo后,’applyupdates’调用现在失败,并显示以下消息 column unknown 'fconstext' 尽管存在使用该名称创建的持久字段. 我不知道这是否有助于或简单地混淆水. ====更多信息,4月23日==== 我从数据库表中删除了该字段,然后将其添加回来.只要输入到有问题的数据字段中的字符串少于约260个字符,所写的程序就可以正常工作.我一次添加十个字符几次没有问题,直到字符串长度为256.然后我添加了一些字符(不计数),试图保存 – 并得到错误.从这一点开始,尝试再添加一个字符会导致错误消息(来自clientdataset的’applyupdates’方法). 最初,该字段包含832个字符,因此对于我可以成功存储的字符数没有硬性限制.但是一旦出现错误消息,它就会出现,就好像数据库记得存在错误一样. ====更多信息,4月24日==== 我再次从数据库中删除了字段,然后将其添加回来;由于我现在不清楚的原因(我不需要西里尔字符),字符集是WIN1251.无论字段本身如何定义,我可以使用数据感知控件输入的最大字符数似乎约为280. 我已经开始在发生此问题的真实程序中使用非数据感知控件,我可以向您保证此处不存在此限制.因此,我很确定问题不是由于字符大小的不匹配,正如所建议的那样.不要忘记我使用的是Delphi 7,它没有unicode字符串.我认为其中一个组件中存在一个错误,但由于我使用的是旧版本,我认为问题已经解决,但在我使用的版本中没有. ====希望最终编辑,25/04/12 ==== 根据蚊子的建议,我创建了一个新的数据库,其默认字符集是WIN1252(UTF-8并不是一个选择,而且无论如何我的程序都不是unicode).在这个干净的数据库中,我定义了一个表,其中’constext’字符串的字符集也被定义为WIN1252.我运行了有问题的表单的数据感知版本,并能够毫无问题地输入文本(目前超过1700个字符). 因此,似乎问题是通过为数据库定义一个字符集而为字段定义一个字符集来创建的.我不知道如何检查数据库的默认字符集定义为什么,所以我无法确认这一点. 我现在有一个小问题,即定义一个新数据库(有50个表)并从原始数据库复制数据.由于这个数据库服务于客户的旗舰产品,我有点担心这样做…. 解决方法
无法找到记录.没有指定密钥.
设置选择id,其中id =:p1 至 从id = 245的比例中选择id,timeflag 设计时现有的id. 施放 算术异常,数字溢出或字符串截断 >字符串截断 FbCommand CMD = new FbCommand(“TBLTEXT_ADDTEXT”,cnn); 4.
不记得;数据库损坏!!! 只要您无法更改数据库字符集并始终尝试将字段删除并添加到损坏的表中,就很难解决问题. 1.对于每个新测试,必须创建一个新数据库(提示:创建一个并复制x次). 2.字段设置为纯文本,而不是原始字段中存储的西里尔字符;你看不到他们,但他们在那里. 3.将varchar(8191)和数据库PAGE_SIZE设置为8192.使用UTF8的实际最大VARCHAR长度为8191 CREATE DATABASE语句: CREATE DATABASE localhost:mybase USER SYSDBA PASSWORD masterkey PAGE_SIZE 8192 DEFAULT CHARACTER SET UTF8; SET NAMES ISO8859_1; CREATE TABLE scales ( ID ...,byteken VARCHAR(8191) COLLATE DE_DE,.... 排序规则 没有默认排序规则.因此,您应为每个要用于排序(ORDER BY)或比较(UPPER)的字段定义排序规则: 您还可以使用ORDER BY子句指定排序规则: ORDER BY LASTNAME COLLATE FR_CA,FIRSTNAME COLLATE FR_CA 或者使用WHERE子句: WHERE LASTNAME COLLATE FR_CA = :lastnametosearch 统一 Firebird 2.0.以上.现在有一个新的UTF8字符集可以正确处理UTF-8格式的Unicode字符串.已经实现了Unicode排序规则算法,因此您现在可以使用UPPER()和新的LOWER()函数,而无需指定排序规则. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |