5

アプリのコメント欄の最大サイズを変更したいという要望がありました。以前はvarchar(500)に設定していたので、ドキュメントを読んだ後、フィールドのデータ型をvarchar(500)からvarchar(max)に変更することにしました。データベースは問題なく変更を受け入れました (データベース管理に Microsoft SQL Server Management Studio 2005 および Microsoft SQL Server Management Studio 2008 を使用)。それから私はソフトウェアを変更し続けました。ソフトウェアは、データベースと通信するためのRemObjectsを使用してDelphiで記述されています。そこで、サーバーのTDASchemaを変更し、新しいvarchar(max)フィールドをString(65536)としてマップしましたデータ型 (このような明示的な静的サイズについて少し心配しましたが、続けました)。次に、TDAMemDataTableオブジェクトのDataTable スキーマを取得し、すべてのフィールドを更新しました。

アプリケーションを起動し、データベースがこの特定の変更されたフィールドの変更を受け入れるかどうかを確認することにしました。レコードの 1 つを編集し、ボタンをクリックしてDataSetをサーバーと同期すると、次のような失敗メッセージが表示されました。

データ型 varchar(max) と text は equal to 演算子で互換性がありません

サーバー オブジェクト (データベース フィールドを RemObjects オブジェクトにマップするオブジェクト) がフィールド データ型を RemObjects の間違ったデータ型にマップしたと解釈します。

これはどのように解決できますか?代替手段は何ですか?

PS このリリースでは、RemObjects から .1267 ログを作成すると、次のことが明確に示されます。

修正: DataSnap: MSSQL 2005 VARCHAR(MAX) への更新のポストに失敗する

ビルド バージョン .1067 を使用しています。アップデートで問題が解決するかどうか

PPS RemObjects の最新バージョンに更新した後も、問題は解決しません。

4

3 に答える 3

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

MS 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 に答える
0

このエラー メッセージは、通常、varchar(n) とテキストを等値演算子 (通常はwheresql の句で使用されますが、他の場所でも可能です) を使用して比較しようとしたときに発生します。これに関連する可能性のあるいくつかのポイントをカバーしたMSDNの記事がありました。

データを VARCHAR(N) 列に格納すると、値は同じ方法で物理的に格納されます。ただし、VARCHAR(MAX) 列に格納すると、画面の背後でデータは TEXT 値として処理されます。したがって、VARCHAR(MAX) 値を処理する場合は、追加の処理が必要になります。(サイズが 8000 を超える場合のみ)

あなたは、TDASchema があなたの新しいフィールドを String(65536) としてマッピングしたと言いましたが、これは以前に RemObjects を使用したことがありませんでしたが、それ自身のコード (またはあなたのもの) のどこかで何らかの比較を行おうとしていると思います。

MAX の代わりに VARCHAR(8000) を使用してみて、問題が解決するかどうかを確認してください。

コード内でこの等価チェックを行っている場所を見つけることができる場合の他のオプションは、cast()

于 2013-11-05T08:57:37.047 に答える