2

ExecuteNonQuery(およびDatabaseFactory.CreateDatabase()MS Practices Enterprise Libraryから)8000文字以上(Webページから送信)を挿入しようとしています。ストアド プロシージャは、パラメータを として定義しますVARCHAR(MAX)。コラムはVARCHAR(MAX). 理論的には、2GB のデータを渡すことができるはずです。

8000 を超えるデータを渡すにはどうすればよいですか? ブレークポイントを設定しましたstring.Lengthが、実際には 8K を超えています。

   public static void UpdateTerms(string terms)
   {
        Database db = DatabaseFactory.CreateDatabase();
        db.ExecuteNonQuery("uspUpdateTerms", terms);
    }

ストアド プロシージャ:

ALTER PROCEDURE [dbo].[uspUpdateTerms]
    @Terms VARCHAR(MAX)
AS
  SET NOCOUNT ON

  INSERT INTO tblTerms(Terms)
  VALUES(@Terms)

表 (すべてが であることを示すためvarchar(max)):

CREATE TABLE [dbo].[tblTerms](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Terms] [varchar](max) NULL,
[DateUpdated] [datetime] NULL,

.

アップデート:

コードを変更したところ、これは機能しているように見えますが、違いはわかりません。

 public static void UpdateTerms(string terms)
 {
        Database db = DatabaseFactory.CreateDatabase();
        DbCommand cmd = db.GetStoredProcCommand("uspUpdateTerms");
        db.AddInParameter(cmd, "Terms", DbType.String, terms);
        db.ExecuteNonQuery(cmd);
 }
4

4 に答える 4

3

REPLICATE後の割り当てに関係なく、入力タイプを返します。面倒ですが、サイレントトランケーションを回避するには、次のことを試してください。

SET @x = REPLICATE(CONVERT(VARCHAR(MAX), 'a'), 10000);

これは、SQL Server が、REPLICATE割り当て先や拡張しようとしている文字数を考慮する前に操作を実行するためです。入力式のみを考慮して何を返す必要があるかを判断し、入力が最大タイプでない場合は、8,000 バイト以内に収まるように意図されていると想定します。これはBooks Onlineで説明されています。

string_expression が varchar(max) または nvarchar(max) 型でない場合、REPLICATE は戻り値を 8,000 バイトで切り捨てます。8,000 バイトを超える値を返すには、string_expression を適切な大きな値のデータ型に明示的にキャストする必要があります。

于 2013-01-15T22:41:53.277 に答える
2

サンプル コードは、次のようにして修正できます。

declare @x varchar(max)
set @x = replicate (cast('a' as varchar(max)), 10000)
select @x, len(@x)
于 2013-01-15T22:41:59.103 に答える
2

問題はデータの保存ではなく、検索かもしれません。

エンタープライズ マネージャーを使用して 8000 文字を超える文字が DB に格納されているかどうかを判断しようとしている場合、列の内容を選択してテキストの長さを確認するだけでは不運です: エンタープライズ マネージャーは列の出力を制限します.

列に実際に格納されているデータの量を確認するには、次のクエリを実行します。

SELECT DATALENGTH(Terms) FROM tblTerms

これにより、保存されたテキストの量がわかります。

編集:

もう 1 つの考えが浮かびました。エンタープライズ ライブラリは、パフォーマンスを向上させるために、ストアド プロシージャのパラメーターをキャッシュします。パラメータを に設定してテストした後にストアド プロシージャを変更し、アプリケーションをリセットせずnvarchar(8000)にパラメータを に切り替えた場合 (IIS でホストされている場合は、または dirty )、古いストアド プロシージャ パラメータを引き続き使用します。nvarchar(max)iisresetweb.config

于 2013-01-15T23:32:48.813 に答える
1

を使用しようとしているコードを表示していませんExecutenonQuery。パラメータを使用する必要があることに注意してください。

using(var con = new SqlConnection(conString))
using(var cmd = new SqlCommand("storedProcedureName", con))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@text", SqlDbType.NVarChar, -1);
    cmd.Parameters["@text"].Value = yourVeryLongText;
    cmd.ExecuteNonQuery();
}
于 2013-01-15T22:45:36.303 に答える