gpt4 book ai didi

delphi - dbExpress/未指定键

转载 作者:行者123 更新时间:2023-12-03 15:01:56 25 4
gpt4 key购买 nike

我正在使用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中使用的查询字符串完全相同的查询字符串);然后将数据传输到控件。用户按下表单上的“确定”按钮后,数据将通过另一个执行更新或插入的查询传递回数据库。因为这可以正常工作,所以我看不到数据感知组件的问题所在。

====另一段信息====

我在堆栈溢出上发现了 this question,似乎解决了类似的问题。我将查询更改为
select id, name, name, byteken, 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个字符。

从那以后,我开始在发生此问题的真实程序中使用 非数据感知控件,并且可以向您保证那里不存在此限制。因此,我已经确定问题不是由字符大小不匹配引起的,正如我所建议的那样。别忘了我正在使用没有unicode字符串的Delphi 7。我认为其中一个组件存在错误,但是当我使用的是旧版本时,我想问题已经解决了,但是我所使用的版本没有解决。

====希望最终编辑,2012年4月25日====

遵循mosquito的建议,我创建了一个新数据库,其默认字符集为WIN1252(UTF-8并未显示为选择,而且我的程序也不是Unicode)。在这个干净的数据库中,我定义了一个表,其中“上下文”字符串的字符集也定义为WIN1252。我运行了有问题的表格的数据感知版本,并且能够毫无问题地输入文本(目前超过1700个字符)。

因此,似乎是由于为数据库定义了一个字符集而为该字段定义了一个字符集而造成了该问题。我不知道如何回顾一下数据库的默认字符集定义为什么,因此我无法确认这一点。

我现在遇到了一个小问题,即定义一个新数据库(有50多个表)并从原始数据库复制数据。由于该数据库服务于客户的旗舰产品,因此我对此有些警惕。

最佳答案

无法找到记录。未指定 key 。

从id =:p1的比例设置选择id,名称,byteken,时间戳



从id = 245的比例中选择id,name,byteken,timeflag

设计时已有的ID。

强制转换
强制转换(上下文为varchar(2048)).....
如果更改了列的定义,则该列类型的现有CAST可能会变得无效

算术异常,数字溢出或字符串截断

  • 字符串截断
    当串联的字符串不适合基础CHAR或VARCHAR数据类型大小时,会发生这种情况。如果结果进入表列,则可能是有效错误。或者,也许您确实需要增加列的大小。存储过程中存储的中间值或触发变量也是如此。
  • 字符音译失败
    当数据库中的数据存储在一个字符集中,但是音译到所需字符集失败时,就会发生这种情况。字符集音译发生在很多地方。有一个自动的:
    您从数据库(通过SELECT或其他方式)检索到的每条数据都将从数据库表的列的字符集音译为连接字符集。如果字符集差异太大,将有两种转换:首先是从列字符集到Unicode,然后是从Unicode到连接字符集。
    另外,您可以通过将列CAST转换为另一个字符集来手动请求音译,例如:
    CAST(column_name AS varchar(100)字符集WIN1251)。
    音译可能失败的原因是,某些字符集中根本不存在某些字符。例如,WIN1252不包含任何西里尔字符,因此,如果您使用连接字符集WIN1252,并尝试从具有西里尔字符的列中进行选择,则可能会出现此类错误。
    在现代,最好在应用程序中使用Unicode或UTF8以及UTF8连接字符。并确保至少使用 Firebird 2.0 ,并具有UTF8支持。
  • 使用DotNetFirebird时的参数顺序错误
    使用DotNetFirebird时,将参数添加到FbCommand的顺序可能会导致-303异常,并带有提示“算术异常,数字溢出或字符串截断”。参数的顺序必须符合存储过程中参数的顺序-否则将引发异常。示例(.NET,C#,DotNetFirebird(使用FirebirdSql.Data.FirebirdClient;))

    FbCommand CMD =新的FbCommand(“TBLTEXT_ADDTEXT”,cnn);
    CMD.Parameters.Add(“TEXT1”,FbDbType.VarChar,600).Value = strText1;
    CMD.Parameters.Add(“TEXT2”,FbDbType.VarChar,600).Value = strText2;
    CMD.CommandType = CommandType.StoredProcedure;
    CMD.ExecuteNonQuery();
    如果过程“TBLTEXT_ADDTEXT”中的参数顺序与将参数添加到FbCommand-Object的顺序不同,则会收到-303错误。

  • 4,

    No'am Newman said But once the error message appears, it always appears, as if the database remembers that there is an error.



    不记得了数据库已损坏!!!

    只要您不能更改数据库字符集,并且始终尝试在损坏的表中添加和添加字段,就很难解决问题。 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

    Unicode

    火鸟2.0。以上。现在有一个新的UTF8字符集,可以正确处理UTF-8格式的Unicode字符串。 Unicode排序规则算法已实现,因此现在您无需指定排序规则就可以使用UPPER()和新的LOWER()函数

    关于delphi - dbExpress/未指定键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10122073/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com