1

ado.netを使用してsprocを呼び出し、データを挿入しています。挿入する前に、どのパラメーターもnullになっていないことを確認するための最良の方法は何ですか?テーブルでは一部の列でnullを許可しますが、この場合、挿入する前に各値がnullでないことを確認する必要があります。SqlParameterを割り当てる前に、各値のnullをチェックし、null引数例外をスローすることができます。これが最善の方法かどうかはわかりません。

ありがとう

これが参考のために私のコードのビットです

  using (var con = new SqlConnection(ConnectionString.GetWebTablesConnectionString()))
        using (var cmd = new SqlCommand("InsertNewCustomer", con))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("dealerid", SqlDbType.Int).Value = dealerid;
            cmd.Parameters.Add("firstname", SqlDbType.NVarChar, 50).Value = customerToInsert.FirstName;
            cmd.Parameters.Add("lastname", SqlDbType.NVarChar, 50).Value = customerToInsert.LastName;
            cmd.Parameters.Add("mailingaddress", SqlDbType.NVarChar, 50).Value = customerToInsert.MailingAddress.Addr;
            cmd.Parameters.Add("mailingcity", SqlDbType.NVarChar, 30).Value = customerToInsert.MailingAddress.City;
            cmd.Parameters.Add("mailingstate", SqlDbType.NVarChar, 25).Value = customerToInsert.MailingAddress.State;
            cmd.Parameters.Add("mailingzip", SqlDbType.NVarChar, 10).Value = customerToInsert.MailingAddress.Zip;
            cmd.Parameters.Add("mailingcountry", SqlDbType.NVarChar, 2).Value = customerToInsert.MailingAddress.Country;
            cmd.Parameters.Add("homephone", SqlDbType.NVarChar, 20).Value = customerToInsert.HPhone;
            cmd.Parameters.Add("email", SqlDbType.NVarChar, 75).Value = customerToInsert.Email;
            cmd.Parameters.Add("referredBy", SqlDbType.NVarChar, 50).Value = customerToInsert.ReferredBy;

            con.Open();
            cmd.ExecuteNonQuery();
         }
4

2 に答える 2

3

もちろん、10〜15個のif-elseステートメントを記述できます。ただし、ソリューションを拡張し、関心の分離を実施し、コードの重複を回避することを計画している場合は、そうすることをお勧めしません。私の経験に基づいて、次のライブラリを使用することをお勧めします。

http://fluentvalidation.codeplex.com/

これは、非常に使いやすいルールベースの検証エンジンです。Codeplexの例を見てください。これは非常にシンプルでわかりやすいフレームワークです。基本的に、ドメインオブジェクトを検証するためのルールを追加し、検証ルールをエンティティ固有の検証クラスにカプセル化できます。これにより、条件付きロジックなしでもう1つの「ストアドプロシージャ呼び出し」を簡単に追加でき、Open-Closedの原則に違反しません(既存のバリデーターを変更する代わりに、新しいバリデーターを追加する必要があります)。

独自のカスタムバリデーター(たとえば、CustomerValidatorクラス)を実装する必要があります。接続を開いてSqlCommandの初期化を開始する前でも、Customerオブジェクトの有効性を確認してください。

CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customerToInsert);
if(results.IsValid){
    using (var con = new SqlConnection(ConnectionString.GetWebTablesConnectionString()))
        using (var cmd = new SqlCommand("InsertNewCustomer", con))
        {
            //Do the actual insert / SP call here, your object is valid
        }
    }
}

さらに、CustomerValidatorクラスにカプセル化された検証ルールの単体テストを記述できるようになりました。

于 2012-09-19T20:48:39.850 に答える
1

UIでの検証に同意しますが、データレイヤーでも確認します。

if(string.IsNullOrEmpty(dealerid))throw new ArgumentNullException( "dealerid");

NullまたはEmptyのこのテスト。空を受け入れたい場合は、nullのみをテストします。

ディーラーIDが文字列の場合は、Intに解析されることを確認してください。

Trim()のような他のことをしたいと思うかもしれません。特に先頭と末尾のスペースを含めたい場合を除いて、クエリが煩雑になります。

SQLは.NETほど広い日付範囲を受け入れないため、日付範囲をテストする必要があります。

于 2012-09-19T18:11:40.897 に答える