我的程序需要一个参数,但我已经提供了它?

时间:2016-11-04 15:17:39

标签: c# sql-server

我的代码中有以下方法:

/// <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分支中发生的事情,然后采取相应的行动。

2 个答案:

答案 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代码返回类型。

希望这有帮助!