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 サイズを省略できます。なぜこの例外が発生するのですか?サイズを渡さずに機能させる方法は?
ご協力ありがとうございました!
VarCharとNVarCharは可変幅の文字フィールドです(したがってvar + char)。長さを設定する必要があります。設定しない場合、デフォルトはゼロです。
パラメータサイズは、可変サイズの出力パラメータに必要です。通常、ADO.NETはパラメーターに割り当てられた値に基づいてパラメーターのサイズを決定します(したがって、オプションです)が、出力パラメーターでは値が設定されていないため、パラメーターに必要なサイズを指定する必要があります
パラメータサイズをDBからの出力変数のサイズに設定します... 50と言います
outParam.Size = 50;
ちなみに、出力パラメータのサイズプロパティの設定は、文字列型のパラメータではない場合でも必要です。たとえば、System.Data.SqlDbType.Intを使用している場合、サイズを4に設定する必要があります。
MSDNを確認してください: SqlParameter.Sizeプロパティ
双方向および出力パラメーター、および戻り値の場合、Sizeの値を設定する必要があります。これは入力パラメーターには必要ありません。明示的に設定されていない場合、パラメーター化されたステートメントの実行時に、指定されたパラメーターの実際のサイズから値が推測されます。
誰もが答えは泥のようにはっきりしていた。多分これは私が働いたものを見つけた今誰かを助けるでしょう。
パラメータにサイズを追加する必要があります
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");
これが以前と同じ問題かどうかはわかりませんが、パラメーターにバイトを使用すると、このエラーが発生することがあります。
これを試して。 iパラメーターを変数として明示的に宣言します。次に、Valueプロパティで値を割り当てます。
パラメーター出力のサイズを設定する必要があります
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());
}
また、次の小さなコマンドでsprocを調べることで、パラメーターの実際のサイズを取得できます。
SqlCommandBuilder.DeriveParameters(yourCommand)
そして、パラメータコレクションを介してあなたの方法をforeachします。
このエラーが発生し、文字列ではないがNULL入力可能な型を持つ値を指定しました。私の場合、int?
。代わりに、null不可のint
を渡すことで修正しました。