3

SQLに関しては、私は初心者です。そのようなパラメータを使用してストアドプロシージャを作成する場合:

@executed           bit,
@failure            bit,
@success            bit,
@testID             int,
    @time               float = 0,
@name               varchar(200) = '',
@description        varchar(200) = '',
@executionDateTime  nvarchar(max) = '',
@message            nvarchar(max) = ''

これは、T-SQLのデフォルト値の正しい形式ですか?''の代わりにNULLを使用しようとしました。

C#を使用してこの手順を実行しようとすると、説明が予期されているが提供されていないという事実を参照してエラーが発生します。このように呼び出すとき:

        cmd.Parameters["@description"].Value = result.Description;

result.Descriptionがnullです。これはSQLでデフォルトでNULL(私の場合は今のところ'')にすべきではありませんか?

呼び出しコマンドは次のとおりです。

        cmd.CommandText = "EXEC [dbo].insert_test_result @executed,
                           @failure, @success, @testID, @time, @name, 
                           @description, @executionDateTime, @message;";

        ...
        cmd.Parameters.Add("@description", SqlDbType.VarChar);
        cmd.Parameters.Add("@executionDateTime", SqlDbType.VarChar);
        cmd.Parameters.Add("@message", SqlDbType.VarChar);

        cmd.Parameters["@name"].Value = result.Name;
        cmd.Parameters["@description"].Value = result.Description;
        ...

        try
        {
            connection.Open();
            cmd.ExecuteNonQuery();
        }
        ...
        finally
        {
            connection.Close();
        }
4

3 に答える 3

12

より良いアプローチは、CommandTextをSPの名前だけに変更し、CommandTypeをStoredProcedureに変更することです。そうすれば、パラメーターははるかにきれいに機能します。

cmd.CommandText = "insert_test_result";
cmd.CommandType = CommandType.StoredProcedure;

これにより、位置ではなく名前で簡単に渡すこともできます。

一般に、ADO.NETはnullではなくDBNull.Valueを必要とします。引数をループしてnullをDBNull.Valueに置き換える便利なメソッドを使用します-(ラップされた)のと同じくらい簡単です:

    foreach (IDataParameter param in command.Parameters)
    {
        if (param.Value == null) param.Value = DBNull.Value;
    }

でも!nullで値を指定することは、デフォルト値を想定させることとは異なります。デフォルトを使用する場合は、コマンドにパラメーターを含めないでください。

于 2008-09-30T21:02:34.030 に答える
0

名前付きパラメーターを使用していない場合、MSSQL は受け取った順序 (インデックス) でパラメーターを取得します。これには cmd オブジェクトのオプションがあると思います。

だからあなたのSQLはもっと似ているはずです

EXEC [dbo].insert_test_result 
@executed = @executed,
@failure = @failure, 
@success = @success, 
@testID = @testID, 
@time = @time, 
@name = @name, 
@description = @description, 
@executionDateTime = @executionDateTime, 
@message = @message;
于 2008-09-30T21:07:27.093 に答える
0

cmd.CommandText = "insert_test_result";
cmd.Parameters.Add(new SQLParameter("@description", result.Description));
cmd.Parameters.Add(new SQLParameter("@message", result.Message));
try
{
     connection.Open();
     cmd.ExecuteNonQuery();
}
finally
{
     connection.Close();
}
于 2008-10-04T00:23:48.293 に答える