2016-11-04 6 views
0

私は私のコードでは、以下の方法で得た:それは手順が「@returnMsg」と呼ばれるパラメータを必要とし、私がする必要があるということを私に言って失敗した私のプロシージャはパラメータを期待していますが、すでに提供していますか?

cmd.ExecuteNonQuery(); 

:ここでは、この行で

/// <summary> 
/// Used to add a new log entry in the database. 
/// </summary> 
/// <param name="logId">The ID of the log</param> 
/// <param name="severityLevel">The Severity Level of the Entry</param> 
/// <param name="entry">The Entry text</param> 
/// <returns>A message depending on success or failure to add the message.</returns> 
public static String AddNewLogEntry(int logId, int severityLevel, String entry) 
{ 
    String returnMsg = ""; 

    using (SqlConnection conn = GetConnection()) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = "AddLogEntry"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Connection = conn; 

      cmd.Parameters.AddWithValue("@logId", logId); 
      cmd.Parameters.AddWithValue("@severityLevel", severityLevel); 
      cmd.Parameters.AddWithValue("@entry", entry); 

      SqlParameter returnParam = cmd.Parameters.AddWithValue("@returnMsg", SqlDbType.VarChar); 
      returnParam.Direction = ParameterDirection.ReturnValue; 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 

      returnMsg = (String)returnParam.Value; 

      if (!returnMsg.Contains("Log ID") || !returnMsg.Contains("Severity Level")) 
      { 
       String[] parameters = returnMsg.Split('¤'); 
       returnMsg = parameters[0]; 
       int entryId = Int32.Parse(parameters[1]); 
       Utility.ReportIncident(logId, severityLevel, entry, entryId); 
      } 
     } 
    } 

    return returnMsg; 
} 

をそれをメソッドに渡します。ただし、ここに表示されているとおり:

SqlParameter returnParam = cmd.Parameters.AddWithValue("@returnMsg", SqlDbType.VarChar); 
returnParam.Direction = ParameterDirection.ReturnValue; 

私はすでにそれを行っています。だから問題は何になるのだろうか?

EDIT

GarethDが私に戻って取得していないので、私はIF/ELSEブランチに何が起こるかに応じて、数を返し、その後、それに応じて行動するために、一時的な解決策と一緒に行きました。

+0

「AddLogEntry」のパラメータリストとは何ですか?コールシグネチャの早い方のパラメータが欠けている可能性があります。最初に 'returnMsg'が欠けています。 –

+3

2番目の引数を値にするべきではありませんか? –

+5

私はあなたが 'AddWithValue'を使用して、その値を' SqlDbType.VarChar'に設定したかったとは思いません。とにかく 'AddWithValue'の使用を止めたいかもしれませんが、[this](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)を読んでください – juharr

答えて

1

あなたのコードでは、これはあなたが値を渡していない戻り値であるParameters.AddWithValue()

を使用しています。あなたはちょうどあなたがSqlDbTypeは、SQLコードの戻り値の型と一致していることを確認してください。また

Parameters.Add() 

を使用する必要があります。

希望すると便利です。

2

あなたはパラメータを追加すると、あなたがそうここに、ParameterCollection.Add()ParameterCollection.AddWithValue()の引数を混乱されています

cmd.Parameters.AddWithValue("@returnMsg", SqlDbType.VarChar) 

をあなたがの値を持つパラメータを定義するSqlDbType.VarCharのタイプのパラメータを定義していませんそれ。私はおそらくAddWithValue()の内部に面白いことをしていると思うし、あなたのエラーの原因です。

あなたはAdd()代わりのAddWithValue()which is pretty sound advice whenever you are adding parameters

SqlParameter returnParam = cmd.Parameters.Add("@returnMsg", SqlDbType.VarChar, 50); 
returnParam.Direction = ParameterDirection.ReturnValue; 

n.b.を使用して、これを避けることができるはずです私は、戻り値は唯一の整数であることができ、あなたはまた、それに

を調整する必要があり、あなたのvarchar型の長さで推測しているので、私は@returnMsgが実際にあなたが使用している場合には、出力パラメータであると仮定します。

SqlParameter returnParam = cmd.Parameters.Add("@returnMsg", SqlDbType.VarChar, 50); 
returnParam.Direction = ParameterDirection.InputOut; 
+0

申し訳ありませんが、説明していただきありがとうございます。私はできるだけ早くそれを試みます:) – OmniOwl

+0

私はあなたが示唆したことを試して、それはまったく同じことを言う。 – OmniOwl

関連する問題