【问题标题】:Error invoking stored procedure with input parameter from ADO.Net使用来自 ADO.Net 的输入参数调用存储过程时出错
【发布时间】:2010-06-07 16:14:08
【问题描述】:

我正在使用 VSTS 2008 + C# + .Net 3.5 + ADO.Net。这是我的代码和相关的错误消息。错误消息说,@Param1 没有提供,但实际上它是在我的代码中提供的。有什么想法有什么问题吗?

System.Data.SqlClient.SqlException: 过程或函数“Pr_Foo”期望 参数“@Param1”,不是 提供。

class Program
{
        private static SqlCommand _command;
        private static SqlConnection connection;

        private static readonly string _storedProcedureName = "Pr_Foo";
        private static readonly string connectionString = "server=.;integrated Security=sspi;initial catalog=FooDB";

        public static void Prepare()
        {
            connection = new SqlConnection(connectionString);
            connection.Open();
            _command = connection.CreateCommand();
            _command.CommandText = _storedProcedureName;
            _command.CommandType = CommandType.StoredProcedure;
        }

        public static void Dispose()
        {
            connection.Close();
        }

        public static void Run()
        {
            try
            {
                SqlParameter Param1 = _command.Parameters.Add("@Param1", SqlDbType.Int, 300101);
                Param1.Direction = ParameterDirection.Input;
                SqlParameter Param2 = _command.Parameters.Add("@Param2", SqlDbType.Int, 100);
                portal_SiteInfoID.Direction = ParameterDirection.Input;
                SqlParameter Param3 = _command.Parameters.Add("@Param3", SqlDbType.Int, 200);
                portal_RoleInfoID.Direction = ParameterDirection.Input;

                _command.ExecuteScalar();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        static void Main(string[] args)
        {
            try
            {
                Prepare();

                Thread t1 = new Thread(Program.Run);
                t1.Start();
                t1.Join();

                Dispose();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message + "\t" + ex.StackTrace);
            }
        }
    }

提前致谢,

乔治

【问题讨论】:

  • 您似乎已经清理了您的代码,以便发布查看不一致的参数名称。我怀疑您对代码的清理隐藏了实际问题。你能仔细检查一下你做了什么吗?
  • 你是什么意思“检查你做了什么”?感谢您是否可以提供有关检查内容的更多详细信息? :-)
  • 你有`SqlParameter Param2 = _command.....` 然后下一行是`portal_SiteInfoID.Direction = ....` - 这应该是同一个参数Param2 吗? ?
  • Plus:ParameterDirection.Input; 是默认值 - 真的不需要一遍又一遍地指定。

标签: c# .net sql-server-2008 stored-procedures ado.net


【解决方案1】:

尝试用下面的代码替换你的函数并检查:

public static void Run()
        {
            try
            {
                _command.Parameters.AddWithValue("@Param1", 300101);
                _command.Parameters.AddWithValue("@Param2", 100);
                _command.Parameters.AddWithValue("@Param3", 200);

                _command.ExecuteScalar();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

【讨论】:

    【解决方案2】:

    您没有为参数添加值。 Add 的签名是 Add(string parameterName, SqlDbType type, int size)... 最后一个参数是大小,而不是值。您可以使用 AddWithValue 方法。

    MSDN Article

    【讨论】:

      【解决方案3】:

      尝试从 .Add 语句中去掉“@”符号。我在添加参数时从不添加@。

      例如:

      SqlParameter Param1 = _command.Parameters.Add("Param1", SqlDbType.Int, 300101);
      

      【讨论】:

      • 我也尝试从 SSMS 执行存储过程并从 GUI 手动提供相同的参数,它运行成功。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多