问题描述
我创建一个小的辅助函数返回一个数据表
。我想跨所有供应商合作ADO.Net
支持,所以我想到了将一切都使用 IDbCommand的
或的DbCommand
在可能的情况
I am creating a small helper function to return a DataTable
. I would like to work across all providers that ADO.Net
supports, so I thought about making everything use IDbCommand
or DbCommand
where possible.
我已经与下面的代码的绊脚石:
I have reached a stumbling block with the following code:
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的
,其中列明了以下内容:
When this code is executed, I receive an InvalidCastException
which states the following:
SqlParameterCollection仅接受非空的SqlParameter类型的对象,而不是String对象
代码落在了就行了:
cmd.Parameters.Add(Parameters.GetValue(i));
任何想法?
Any ideas?
以上代码的任何改进表示赞赏。
Any improvements to the above code is appreciated.
实际的解决方案:
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;
}
感谢您的想法/链接等:)
Thanks for ideas/links etc. :)
推荐答案
我相信IDbCommand的有CreateParameter()方法:
I believe IDbCommand has a CreateParameter() method:
var parameter = command.CreateParameter();
parameter.ParameterName = "@SomeName";
parameter.Value = 1;
command.Parameters.Add(parameter);
这篇关于添加参数的IDbCommand的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!