-1

msdn で string(.net フレームワーク タイプ) と対応する nvarchar( dbtype ) のマッピングに関する情報を見つけました。

文字列が NVarChar の最大サイズである 4000 文字より大きい場合、この暗黙的な変換は失敗します。4000 文字を超える文字列の場合は、明示的に SqlDbType を設定してください。

「明示的に設定」の意味がわかりません。だから私は次のようにいくつかのコードを書きます:

char[] c = new char[5000];
for (int i = 0; i < 5000; i++)
{
    c[i] = 'a';
}
string s = new string(c);
using (SqlConnection conn = new SqlConnection(connstr))
{ 
    conn.Open();
    // create command object
    var comm = conn.CreateCommand();
    comm.CommandText = "select @s";

    // create parameter for command
    var p = comm.CreateParameter();
    p.ParameterName = "@s";
    // p.DbType = DbType.String;
    // p.Size = 5000;
    p.Value = s;

    // add parameter to command
    comm.Parameters.Add(p);

    // execute command
    var r = comm.ExecuteScalar();
}

ご覧のとおり、パラメーターの型とパラメーターのサイズを設定していないため、msdn の指示に基づいて、実行時に例外が発生すると考えました。残念ながら、それは完全に正しく実行され、結果 r は 5000 個の 'a' を含む文字列でした。実際、パラメータのタイプ、サイズを設定するコードをコメントまたはコメント解除しても、結果は常に正しく、常に同じになります。

助けてください。msdn の指示について何か誤解していますか?

ありがとうございました。

4

1 に答える 1

1

あなたの質問が何であるか完全にはわかりません。ドキュメントには 1 つのことが書かれているため、混乱していますか。まだ何か他のことができますか?

次を使用して、パラメーターの型を明示的に設定します...

var p = comm.CreateParameter();
p.SqlDbType = System.Data.SqlDbType.VarChar;
p.Size = 5000;
p.ParameterName = "@s";
p.Value = 'c';

編集:あなたが同封したドキュメントに基づいて、私が解釈した方法では、サイズは4000を超える可能性があります。SqlDbType を明示的に設定するだけです。過去にこれに遭遇したとき、データが切り捨てられるか、文字列またはバイナリ データが切り捨てられるというエラーが表示されました。

残念ながら、SqlServer は私の最強のスキル セットではありません。

于 2013-07-01T15:13:27.583 に答える