5

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

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

数据类型 varchar(max) 和 text 在等于运算符中不兼容

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

如何解决?有哪些替代方案?

PS 在此版本中来自 RemObjects 的 Build .1267 日志中明确指出:

已修复:DataSnap:无法将更新发布到 MSSQL 2005 VARCHAR(MAX)

我正在使用构建版本 .1067。想知道更新是否能解决问题

PPS 更新到最新版本的 RemObjects 后,问题仍然存在。

4

3 回答 3

0

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

当您将数据存储到 VARCHAR(N) 列时,这些值的物理存储方式相同。但是,当您将其存储到 VARCHAR(MAX) 列时,屏幕后面的数据将作为 TEXT 值处理。所以在处理 VARCHAR(MAX) 值时需要一些额外的处理。(仅当大小超过 8000 时)

您提到 TDASchema 已将您的新字段映射为 String(65536),尽管之前从未使用过 RemObjects,但我会假设它自己的代码(或您的代码)中的某处正在尝试进行某种比较,因此会出现错误消息。

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

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

于 2013-11-05T08:57:37.047 回答
0

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

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

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

于 2014-08-18T16:08:52.053 回答
0

Delphi 7 和 MS SQL Server 2008 R2 (SP2) 的分辨率

德尔福:

    with TADOStoredProc.Create(Self) do
    try
      Connection := AConnection;
      ProcedureName := ASPName;
      Parameters.Refresh;
      Parameters.ParamByName('@XML').Value := AXML;
      try
        ExecProc;
...

微软 SQL 服务器:

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
    )
...
于 2015-09-18T13:54:39.667 回答