【问题标题】:Suggestions on C# SQL parameters (collection) passed to function?关于传递给函数的 C# SQL 参数(集合)的建议?
【发布时间】:2013-06-07 01:24:26
【问题描述】:

我想使用ExecuteNonQuery 构建一个可大量重用的 SQL 函数,但我遇到的最大问题是参数。

我不确定其他人会做些什么来使这个简单而有弹性,以便我可以简单地传递 SQL 脚本。

例如SELECT * FROM table WHERE userid = @userid AND isactive = @isactive,然后也许permitters可以是一个数组。

public void ExecuteSQLCeNonQuery(string _Sql, ?parameter array of some type?)
{
    SqlCeConnection sCon = null;
    SqlCeCommand sCmd = null;
    int countOf = 0;

    try
    {
        sCon = new SqlCeConnection( sqlConnectionStringLocal);
        sCmd = new SqlCeCommand(_Sql, sCon);

        sCmd.Parameters.AddWithValue("@recBatchDateTarget", sDateOnly); <----- I know this will have to parse the collection some how.

        sCon.Open();
        countOf = (int)sCmd.ExecuteNonQuery();
        sCon.Close();
    }
    catch (SqlCeException ex)
    {
        Console.WriteLine("** DEBUG: ExecuteSQLCeNonQuery: {0} - {1}", ex.Message, sSql);
    }
    finally
    {
        if (sCmd != null)
            sCmd.Dispose();

        if (sCon != null)
            sCon.Dispose();
    }
}

关于如何处理参数数组或集合有什么建议吗?

【问题讨论】:

  • 重新发明轮子?我们不是已经有足够的 ORM 了吗?这是 2013 年的伙计们......
  • 你可以做一个可变参数的事情:public void ExecuteSQLCeNonQuery(string _Sql, params object[] args);然后调用者将调用 ExecuteSQLCeNonQuery( "--query text", "length", 37, "height", 6.5 );在 ExecuteSQLCeNonQuery 中,您将一次遍历 args 两个索引。对于每对元素,抛出异常,除非 args[i] 是一个字符串,并且 args[i+1] 是

标签: c# sql parameters


【解决方案1】:

只需将其声明为IEnumerable&lt;SqlParameter&gt;,这样调用者就可以提供他想要的任何集合(数组、List&lt;SqlParameter&gt;、...)

public void ExecuteSQLCeNonQuery(string _Sql, IEnumerable<SqlParameter> parameters)
{
    ...
    if (parameters != null) // Null check so caller can pass null if there are no parameters
    {
        foreach(SqlParameter parameter in parameters)
        {
            cmd.Parameters.Add(parameter);
        }
        ...
    }
}

【讨论】:

  • 谢谢 Prix 和 Joe,我会投票给你,但还没有代表。让我在里面工作。
【解决方案2】:

跟随兔子洞,让我来这篇文章。参数的 .AddRange 方法应该可以工作。

How to use SqlCeParameterCollection?

【讨论】:

    【解决方案3】:

    您可以尝试创建一个单独的类来访问数据, 并将您的方法放在那里(如删除方法、更新、插入等), 你的连接字符串,如果总是访问同一个数据库,可能在方法之外。 在您的方法参数中,您可以使用格式化的字符串传递 sql 语句,将您的 sqlcommand 对象设置为该参数。 您可以将该类设为静态或公开(然后您需要 在您的客户端表单中实例化它)。

    例如: 在客户端表单中......

    string query = "SELECT * from tablename";
    sqlaccessclass sqlclass = new sqlaccessclass();
    sqlclass.GetAll(query);
    

    在 ExecuteNonQuery 中获取数据方法的返回类型将是 DataSet 方法将是无效的。

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 2020-06-01
      • 2023-03-24
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2020-07-29
      相关资源
      最近更新 更多