我的代码中有以下方法:
/// <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;
}
在这一行:
cmd.ExecuteNonQuery();
它没有告诉我该过程需要一个名为&#34; @ returnMsg&#34;的参数。而且我需要将它传递给方法。但是你可以在这里看到:
SqlParameter returnParam = cmd.Parameters.AddWithValue("@returnMsg", SqlDbType.VarChar);
returnParam.Direction = ParameterDirection.ReturnValue;
我已经这样做了。那么问题又是什么呢?
修改
由于GarethD没有回复我,我使用临时解决方案返回一个数字,取决于IF / ELSE分支中发生的事情,然后采取相应的行动。
答案 0 :(得分: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;
答案 1 :(得分:1)
您的代码使用Parameters.AddWithValue()
这是您未传递值的返回值。你应该使用
Parameters.Add()
还要确保SqlDbType
匹配SQL代码返回类型。
希望这有帮助!