c# - 向 IDbCommand 添加参数

标签 c# datatable

我正在创建一个小的辅助函数来返回 DataTable .我想与 ADO.Net 的所有供应商合作支持,所以我想把所有东西都用IDbCommandDbCommand在可能的情况下。

我遇到了以下代码的绊脚石:

    private static DataTable QueryImpl(ref IDbConnection conn, String SqlToExecute, CommandType CommandType, Array Parameters)
    {
        SetupConnection(ref conn);
        // set the capacity to 20 so the first 20 allocations are quicker...
        DataTable dt = new DataTable();
        using (IDbCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = SqlToExecute;
            cmd.CommandType = CommandType;
            if (Parameters != null && Parameters.Length > 0)
            {
                for (Int32 i = 0; i < Parameters.Length; i++)
                {
                    cmd.Parameters.Add(Parameters.GetValue(i));
                }
            }
            dt.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges);
        }
        return dt;
    }

执行此代码时,我收到一个 InvalidCastException声明如下:

The SqlParameterCollection only accepts non-null SqlParameter type objects, not String objects.

代码掉线了:

cmd.Parameters.Add(Parameters.GetValue(i));

有什么想法吗?

感谢对上述代码的任何改进。


实际解决方案:

    private static readonly Regex regParameters = new Regex(@"@\w+", RegexOptions.Compiled);
    private static DataTable QueryImpl(ref DbConnection conn, String SqlToExecute, CommandType CommandType, Object[] Parameters)
    {
        SetupConnection(ref conn);
        DataTable dt = new DataTable();
        using (DbCommand cmd = conn.CreateCommand())
        {
            cmd.CommandText = SqlToExecute;
            cmd.CommandType = CommandType;
            if (Parameters != null && Parameters.Length > 0)
            {
                MatchCollection cmdParams = regParameters.Matches(cmd.CommandText);
                List<String> param = new List<String>();
                foreach (var el in cmdParams)
                {
                    if (!param.Contains(el.ToString()))
                    {
                        param.Add(el.ToString());
                    }
                }
                Int32 i = 0;
                IDbDataParameter dp;
                foreach (String el in param)
                {
                    dp = cmd.CreateParameter();
                    dp.ParameterName = el;
                    dp.Value = Parameters[i++];
                    cmd.Parameters.Add(dp);
                }
            }
            dt.Load(cmd.ExecuteReader(), LoadOption.OverwriteChanges);
        }
        return dt;
    } 

感谢您的想法/链接等。:)

最佳答案

我相信 IDbCommand 有一个 CreateParameter() 方法:

var parameter = command.CreateParameter();
parameter.ParameterName = "@SomeName";
parameter.Value = 1;

command.Parameters.Add(parameter);

关于c# - 向 IDbCommand 添加参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234971/

相关文章:

mysql - 将组合框添加到链接到数据表的数据网格

c# - 将任何 Excel 电子表格导入 DataGridView - C#

c# - 删除 SQL 行并更改 Id

c# - 提高时间复杂度

C# 使用 ExpressionTree 将 DataTable 映射到 List<T>

javascript - 如何在数据表中使用Rowspan

r - 如何在r中查看类似表格样式的列表

c# - 如何处理T4字符串模板?

c# - 网络农场中的分布式关键部分

javascript - jQuery DataTable 显示条目、搜索框和排序不起作用?