传递具有未指定值的存储过程的值

时间:2016-07-29 13:13:45

标签: c# sql-server stored-procedures

如果在SQL Server Management Studio中执行,则存储过程执行正常。

在C#(Winforms)中,我有以下代码:

InsertWarning.Parameters.AddWithValue("@idUser", userIDAuth);
InsertWarning.Parameters.AddWithValue("@idPass", idPass);

if (Privileged)
    MessageWarning += " gave you privileged access to note " + Description;
else
    MessageWarning += " gave you access to note " + Description;

InsertWarning.Parameters.AddWithValue("@Message", MessageWarning);
InsertWarning.ExecuteNonQuery(); 
InsertWarning.Parameters.Clear();

ExecuteNonQuery()运行时,它会停止说@idUser没有值。

idUser being given a value

enter image description here

C#中的存储过程:

SqlCommand InsertWarning = new SqlCommand("_spInsertWarnings", TeamPWSecureBD);  

InsertAuths.CommandType = CommandType.StoredProcedure;

SQL中的存储过程:

[dbo].[_spInsertWarnings] 
    @idUser int, @idPass int, @Message nvarchar(MAX)
AS
    INSERT INTO Warnings 
    VALUES(@idUser, @idPass, @Message)

4 个答案:

答案 0 :(得分:1)

 using (SqlConnection con = new SqlConnection(dc.Con))
 {
    using (SqlCommand cmd = new SqlCommand("_spInsertwarnings", con))
    {
      cmd.CommandType = CommandType.StoredProcedure;

//Please Make SqlDataType as per your Sql ColumnType
      cmd.Parameters.Add("@idUser", SqlDbType.VarChar).Value = userIDAuth;
      cmd.Parameters.Add("@idPass", SqlDbType.VarChar).Value = idPass;


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

答案 1 :(得分:0)

这篇文章中的问题看起来与你的相似: Stored procedure or function expects parameter which was not supplied

您是否尝试过使用.Parameters.Add(“fieldname”,type,value)?我想知道即使你在调试会话中看到值8,当你进行存储过程调用时它也不会被识别。

答案 2 :(得分:0)

再次考虑这个问题,我的猜测是你错过了与@idUser不同的参数,并且该参数没有分配默认值。有时,SQL Server会为缺少值的参数报告错误的名称。

查看你的proc标题并确认你传递了proc期望的所有必需参数,或者你为那些你并不总是想要传递的参数分配了合理的默认值。

答案 3 :(得分:0)

我想这可能有用,我已经发布了你要添加的代码。

    InsertWarning.Parameters.Add("@idUser", SqlDbType.Int);
    InsertWarning.Parameters["@idUser"].Value = userIDAuth;
    InsertWarning.Parameters.AddWithValue("@idPass", idPass);
   try
   {
        connection.Open();
        InsertWarning.ExecuteNonQuery()
   }
  catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }