使用RemObjects在delphi中的SQL Server varchar(MAX)数据类型

时间:2013-11-01 10:25:51

标签: sql-server database delphi remobjects

请求在应用程序中更改注释字段最大大小。在设置为 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中的错误数据类型。

如何解决这个问题?有哪些替代方案?

P.S。在这个版本中,来自RemObjects的Build .1267日志清楚地表明:

  

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

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

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

3 个答案:

答案 0 :(得分:0)

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

  

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

您提到TDASchema已将您的新字段映射为字符串(65536),虽然以前从未使用过RemObjects,但我会假设它自己的代码(或您的代码)正在尝试进行某种比较,因此错误信息。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

的Delphi:

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

MS SQL Server:

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
    )
...