首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用RemObjects实现delphi中的Server varchar(MAX)数据类型

用RemObjects实现delphi中的Server varchar(MAX)数据类型
EN

Stack Overflow用户
提问于 2013-11-01 10:25:51
回答 3查看 2.8K关注 0票数 5

收到更改应用程序中注释字段最大大小的请求。在将其设置为varchar(500)之前,在阅读文档之后,我决定将字段的数据类型从varchar(500)更改为varchar(max)。数据库接受的更改没有任何问题(使用2005和2008进行数据库管理)。然后我继续修改软件。软件在Delphi中用RemObjects编写,与数据库进行通信。因此,我为服务器更改了TDASchema,它将新的varchar(max)字段映射为String(65536)数据类型(这让我有点担心这样一个显式的静态大小,但我继续说)。然后,我为我的DataTable对象检索了TDAMemDataTable模式,该对象更新了所有字段。

我启动了应用程序,并决定查看我的数据库是否会接受这个特定更改的字段上的更改。我编辑了其中一条记录,并单击按钮使DataSet与服务器同步,并得到了这样一条失败消息:

数据类型varchar(max)和文本在等于操作符中不兼容。

我将其解释为我的服务器对象(将数据库字段映射为RemObjects对象的对象)将字段数据类型映射到RemObjects中的错误数据类型。

如何解决这个问题呢?有什么可供选择的?

P.S.在这个版本中,从.1267构建了RemObjects日志,它明确指出:

修正: DataSnap:未能发布对MSSql2005VARCHAR(最大)的更新

我使用的是构建版本.1067。想知道更新是否会解决这个问题

P.P.S.在更新了RemObjects的最新版本后,问题依然存在。

EN

回答 3

Stack Overflow用户

发布于 2013-11-05 08:57:37

此错误消息通常发生在使用相等运算符比较varchar(n)和文本时(通常在sql中的where子句中,但在其他地方可能发生)。有一篇关于MSDN的文章,其中包含了一些可能与此相关的要点。

当您将数据存储到VARCHAR(N)列时,这些值的物理存储方式是相同的。但是,当您将其存储到VARCHAR(MAX)列中时,屏幕后面的数据将作为文本值处理。因此,在处理VARCHAR(MAX)值时需要进行一些额外的处理。(只有在尺寸超过8000的情况下)

您提到TDASchema将您的新字段映射为String(65536),虽然以前从未使用过RemObjects,但我假设在它自己的代码(或您的代码)中的某个位置,正在尝试进行某种类型的比较,因此产生了错误消息。

尝试使用VARCHAR(8000)而不是MAX,看看这是否解决了问题。

如果您可以在代码中找到它执行此等式检查的位置,则另一个选项是尝试执行一个cast()

票数 0
EN

Stack Overflow用户

发布于 2014-08-18 16:08:52

正如您所怀疑的,我认为问题的根源在于字段没有作为正确的类型进入TDASchema。我刚刚在这里尝试过,varchar(max)和nvarchar(max)字段分别作为Memo和WideMemo进入我的模式,而不是字符串(65536)。

我通过XE6使用Delphi和Server 2008 R2。

这表明从数据库检索元数据存在问题。您使用的是什么数据库驱动程序?您是否可以尝试FireDAC (如果可用)或其他驱动程序来查看问题是否仍然存在?

票数 0
EN

Stack Overflow用户

发布于 2015-09-18 13:54:39

Delphi 7和MS 2008 R2 (SP2)的解决方案

德尔菲:

代码语言:javascript
复制
    with TADOStoredProc.Create(Self) do
    try
      Connection := AConnection;
      ProcedureName := ASPName;
      Parameters.Refresh;
      Parameters.ParamByName('@XML').Value := AXML;
      try
        ExecProc;
...

MS SQL Server:

代码语言:javascript
复制
ALTER PROCEDURE dbo.StoredProcName
    @XML        NVARCHAR(MAX)
   ,@ErrMsgOut  NVARCHAR(MAX) = NULL OUT
AS BEGIN
SET NOCOUNT ON
DECLARE @RETURN INT = 0
       ,@idoc   INT

BEGIN TRY
    -- Prepare XML
    DECLARE @XML_TEXT VARCHAR(MAX)
    SET @XML_TEXT = CONVERT(VARCHAR(MAX), @XML) 
    EXEC sp_xml_preparedocument @idoc OUTPUT, @XML_TEXT

    -- Open XML
    SELECT  *
    FROM    OPENXML (@idoc, '/ServicesList/ServicesItem', 2)
    WITH
    (
        YourFields AndTypes
    )
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19724898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档