【问题标题】:C# - Generalized SQL Server stored procedure callsC# - 通用 SQL Server 存储过程调用
【发布时间】:2016-03-10 05:54:26
【问题描述】:

我正在尝试一些新的东西(至少对我而言),而不是使用特定的函数来调用单个存储过程(数据访问函数与存储过程的比率为 1 比 1),我正在尝试编写传递存储过程名称的通用函数,以及作为参数的参数名称和参数值的字符串数组。

例如:

public DataTable CallQuery(string spName, string[] paramNames, string[] paramValues, string connString)
{
    DataTable dt = new DataTable();
    SqlConnection conn = new SqlConnection(connString);

    try
    {
        //create a command and assign it to the passed stored procedure name
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = conn; // new SqlConnection(connString); ;
        cmd.CommandText = spName;

        //add any and all parameters to the command
        for(int i = 0; i < paramNames.Length; i++)
        {
                SqlParameter temp = new SqlParameter(paramNames[i], paramValues[i]);
                cmd.Parameters.Add(temp);
                //cmd.Parameters.AddWithValue(paramNames[i], paramValues[i]);
        }

        //get the data and return it
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);

        return dt;
    }
    catch (Exception)
    {
        return dt;
    }
}

不幸的是,由于某种原因,当我使用参数值(即 paramNames[0] = "@Provider" 和 paramValues[0] = "AT&T")调用此函数并进行数据库调用时,我发现异常说存储过程需要参数@Provider

我已经逐步检查并验证了参数是否与它们的值一起添加,但我仍然遇到同样的异常。我在这里遗漏了一些简单的东西吗?

我传入字符串数组的原因是因为每个存储过程可能有 0 到 5 个参数(到目前为止...)。

【问题讨论】:

  • 传递字典、哈希表或通用列表可能会更好,而不是独立数组,这样很容易将参数名称和值保持在一起。
  • 这可能是有道理的,不是吗?在完成对应用程序逻辑的其余部分的测试后,我将对其进行更改。谢谢!

标签: c# sql-server


【解决方案1】:

尝试为您的参数指定一个类型。但是,最重要的是确保您这样做:

cmd.CommandType = CommandType.StoredProcedure;

【讨论】:

  • 天啊。我是个白痴。不敢相信我忘了把它放进去,这就是造成我问题的原因。太感谢了! p.s.我会在 6 分钟内将其标记为答案。
  • 很容易错过。这就是为什么我们有 SO :)
猜你喜欢
  • 2014-11-04
  • 2019-12-02
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2014-03-30
  • 2013-09-18
  • 2015-05-08
  • 2021-05-26
相关资源
最近更新 更多