web-dev-qa-db-ja.com

Ado.net-Sizeプロパティの無効なサイズは0です

ADO.netを介してDBから出力値を取得しようとしています。クライアントコードがあります。

    using (var connection = new SqlConnection(ConnectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection);
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@i", 1);
        var outParam = new SqlParameter("@out", SqlDbType.VarChar);
        outParam.Direction = ParameterDirection.Output;
        command.Parameters.Add(outParam);
        command.ExecuteNonQuery();
        Console.WriteLine(command.Parameters["@out"].Value.ToString());
    }

これを実行すると、次の例外が発生します。

the Size property has an invalid size of 0

マニュアルによると SqlParameter.Size Property サイズを省略できます。なぜこの例外が発生するのですか?サイズを渡さずに機能させる方法は?
ご協力ありがとうございました!

55
StuffHappens

VarCharとNVarCharは可変幅の文字フィールドです(したがってvar + char)。長さを設定する必要があります。設定しない場合、デフォルトはゼロです。

58
Sachin Shanbhag

パラメータサイズは、可変サイズの出力パラメータに必要です。通常、ADO.NETはパラメーターに割り当てられた値に基づいてパラメーターのサイズを決定します(したがって、オプションです)が、出力パラメーターでは値が設定されていないため、パラメーターに必要なサイズを指定する必要があります

パラメータサイズをDBからの出力変数のサイズに設定します... 50と言います

outParam.Size = 50;
46
The King

ちなみに、出力パラメータのサイズプロパティの設定は、文字列型のパラメータではない場合でも必要です。たとえば、System.Data.SqlDbType.Intを使用している場合、サイズを4に設定する必要があります。

14
Andrew Jens

MSDNを確認してください: SqlParameter.Sizeプロパティ

双方向および出力パラメーター、および戻り値の場合、Sizeの値を設定する必要があります。これは入力パラメーターには必要ありません。明示的に設定されていない場合、パラメーター化されたステートメントの実行時に、指定されたパラメーターの実際のサイズから値が推測されます。

9
Pranay Rana

誰もが答えは泥のようにはっきりしていた。多分これは私が働いたものを見つけた今誰かを助けるでしょう。

パラメータにサイズを追加する必要があります

        DynamicParameters Params = new DynamicParameters();
        Params.Add("@ProfileID", ProfileID);
        Params.Add("@CategoryName", CategoryName);
        Params.Add("@Added", dbType: DbType.String, direction: ParameterDirection.Output,size:10);

        db.Execute(sql, Params, commandType: CommandType.StoredProcedure, commandTimeout: 60);

        var Added = Params.Get<string>("@Added");
3
Deathstalker

これが以前と同じ問題かどうかはわかりませんが、パラメーターにバイトを使用すると、このエラーが発生することがあります。

これを試して。 iパラメーターを変数として明示的に宣言します。次に、Valueプロパティで値を割り当てます。

1
Andrew Harry

パラメーター出力のサイズを設定する必要があります

using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    SqlCommand command = new SqlCommand("pDoSomethingParamsRes", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@i", 1);
    var outParam = new SqlParameter("@out", SqlDbType.VarChar);
    outParam.Direction = ParameterDirection.Output;
    outParam.Size = 50; // this is example
    command.Parameters.Add(outParam);
    command.ExecuteNonQuery();
    Console.WriteLine(command.Parameters["@out"].Value.ToString());
}
0
Lê Xuân Tây

また、次の小さなコマンドでsprocを調べることで、パラメーターの実際のサイズを取得できます。

SqlCommandBuilder.DeriveParameters(yourCommand)

そして、パラメータコレクションを介してあなたの方法をforeachします。

0
Mr W

このエラーが発生し、文字列ではないがNULL入力可能な型を持つ値を指定しました。私の場合、int?。代わりに、null不可のintを渡すことで修正しました。

0
Jonathan