收到更改应用程序中注释字段最大大小的请求。在将其设置为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的最新版本后,问题依然存在。
发布于 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()。
发布于 2014-08-18 16:08:52
正如您所怀疑的,我认为问题的根源在于字段没有作为正确的类型进入TDASchema。我刚刚在这里尝试过,varchar(max)和nvarchar(max)字段分别作为Memo和WideMemo进入我的模式,而不是字符串(65536)。
我通过XE6使用Delphi和Server 2008 R2。
这表明从数据库检索元数据存在问题。您使用的是什么数据库驱动程序?您是否可以尝试FireDAC (如果可用)或其他驱动程序来查看问题是否仍然存在?
发布于 2015-09-18 13:54:39
Delphi 7和MS 2008 R2 (SP2)的解决方案
德尔菲:
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
)
...https://stackoverflow.com/questions/19724898
复制相似问题