2016-05-11 4 views
0

私はストアドプロシージャを呼び出すSQLコマンドに、複数のフィールド値を含む型付きオブジェクトを渡しました。デバッグでは、各フィールドに値があり、どれもnullでないことがわかります。ExecuteNonQueryでnullオブジェクトフィールドの値をデバッグするには?

しかし、db.ExecuteNonQueryコールをさらにデバッグすると、アプリケーションフィールドがNULLであることを示すSQL例外が発生します。このコマンドを実行する前に、nullではなく文字列値を持っていますが。

通常のデバッグ手順を確認しましたが、モデルフィールドのタイプはDbCommandのタイプと一致しています。また、期待通りに文字列値が設定されたクエリを実行する前に、escalation.Applicationの値を確認しました。

質問:フィールド値はExecuteNonQueryにヌルとして評価される理由

、誰もが知っていますか?

コード:

  • DALクラス -

    public bool InsertWebReq(Escalation escalation) 
    { 
        Database db = null; 
        string sqlCommand = ""; 
    
        try 
        { 
         DatabaseProviderFactory factory = new DatabaseProviderFactory(); 
         db = factory.Create("NOTIFICATION"); 
    
         sqlCommand = "CREATE_ESCALATION"; 
    
         using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
         { 
          db.AddInParameter(dbCommand, "Application", DbType.String, escalation.Application); 
          db.AddInParameter(dbCommand, "EM", DbType.String, escalation.EM); 
          db.AddInParameter(dbCommand, "EscalationActions", DbType.String, escalation.EscalationActions); 
          db.AddInParameter(dbCommand, "ProblemStatement", DbType.String, escalation.ProblemStatement); 
          db.AddInParameter(dbCommand, "status", DbType.String, escalation.status); 
          db.AddInParameter(dbCommand, "UpdatedBy", DbType.String, escalation.UpdatedBy); 
          db.AddInParameter(dbCommand, "UpdatedTime", DbType.DateTime, escalation.UpdatedTime); 
          db.AddInParameter(dbCommand, "Impact", DbType.String, escalation.Impact); 
    
          db.ExecuteNonQuery(dbCommand); 
          return true; 
         } 
        } 
        catch (SqlException ex) 
        { 
         //Log the SQL specific errors 
         for (int i = 0; i < ex.Errors.Count; i++) 
         { 
          StringBuilder errorMessages = new StringBuilder(); 
    
          errorMessages.Append("Index #" + i + "\n" + 
           "Message: " + ex.Errors[i].Message + "\n" + 
           "LineNumber: " + ex.Errors[i].LineNumber + "\n" + 
           "Source: " + ex.Errors[i].Source + "\n" + 
           "Procedure: " + ex.Errors[i].Procedure + "\n"); 
         } 
    
         MyLogger.FileLogger.ErrorFormat("{0} - {1}", sqlCommand, ex.Message); 
         return false; 
        } 
    } 
    
  • モデル - アプリケーションリストの

    public partial class Escalation 
    { 
        public int ID { get; set; } 
        public string Application { get; set; } 
        public string EM { get; set; } 
        public string status { get; set; } 
        public string ProblemStatement { get; set; } 
        public string Impact { get; set; } 
        public string EscalationActions { get; set; } 
        public System.DateTime UpdatedTime { get; set; } 
        public string UpdatedBy { get; set; } 
    } 
    
  • HTML要素 -

         <div class="form-adjacent"> 
              <label class="col-md-3 control-label" for="App">App</label> 
              <div class="col-md-8"> 
               <select id="App" name="Application" onchange="" class="form-control"> 
                <option value="SAP">SAP</option> 
                <option value="EME">EME</option> 
               </select> 
              </div> 
             </div> 
    
+2

ストアドプロシージャの外観(create_escalation)は何ですか? AddInParametersとExecuteNonQueryを正しく使用しているようですが、実際に値をプロシージャに渡す前に、アプリケーションの値を取得していることはすでに述べています。また、アプリケーションがNULLになるという正確なエラーは何ですか? – Dresden

+0

ストアドプロシージャコードを提供する場合は、正解を得るために十分な情報が表示されていることを確認してください。また、機密情報を削除してください。 – PhilDulac

答えて

1

通常、データベースパラメータは@で始まる必要があります。このためにコードを変更する場合:

db.AddInParameter(dbCommand, "@Application", DbType.String, escalation.Application); 
db.AddInParameter(dbCommand, "@EM", DbType.String, escalation.EM); 
db.AddInParameter(dbCommand, "@EscalationActions", DbType.String, escalation.EscalationActions); 
db.AddInParameter(dbCommand, "@ProblemStatement", DbType.String, escalation.ProblemStatement); 
db.AddInParameter(dbCommand, "@status", DbType.String, escalation.status); 
db.AddInParameter(dbCommand, "@UpdatedBy", DbType.String, escalation.UpdatedBy); 
db.AddInParameter(dbCommand, "@UpdatedTime", DbType.DateTime, escalation.UpdatedTime); 
db.AddInParameter(dbCommand, "@Impact", DbType.String, escalation.Impact); 

これは動作するはずです。

+0

いいえ、 '@ '接頭辞なしで動作します。 –

+0

私が見ることができる他の説明は、ストアドプロシージャのパラメータ名がデータアクセス層の名前と一致しないということだけです。 – PhilDulac

+1

@roryap @がなければ正常に動作しますか?パラメータとして同じ名前の列がある場合、クエリアナライザは混乱する可能性があります。 – Gusman

関連する問題