SqlParameter中的方法重写



我在C#中使用参数化查询,代码如下:

int i = 5;
string query = "select col1 from table where col2 = @prm1 and col3 = @prm2";
SqlCommand cmd = new SqlCommand(query,connection);
cmd.Parameters.Add(new SqlParameter("@prm1", (int)MyEnum.val1));
cmd.Parameters.Add(new SqlParameter("@prm2", i);
public enum MyEnum
{
val1 = 0,
val2 = 100,
val3 = 150
}

现在,内置类SqlParameter有2个重载方法,其中有2个参数,如下所示:

public SqlParameter(string parameterName, SqlDbType dbType);

public SqlParameter(string parameterName, object value);

现在,对于@prm2,我正在传递int变量,它正在正确地初始化具有适当值的参数。但对于@prm1,我正在传递enum&将其转换为int作为值,将其作为SqlParameter的第一种方法。

内置SqlDbType枚举如下:

public enum SqlDbType
{
BigInt = 0,
Binary = 1,
....
....
}

由于我传递的枚举的值是0,所以它取0并使用第一个方法,并使用BigIntDATATYPE创建一个参数,而不是创建值为0的参数。

这背后的原因是什么?是某种bug,还是我遗漏了一些愚蠢的地方?

更新:尽管这为我最初的问题提供了答案,即"0可以隐式转换为枚举,但非零值不能",因此两个语句在选择方法时存在差异。我尝试过以下内容:

cmd.Parameters.Add(new SqlParameter("@prm1", (int)MyEnum.val1));
cmd.Parameters.Add(new SqlParameter("@prm1", Convert.ToInt32(MyEnum.val1)));

使用CCD_ 11 arg&第二个是使用object值调用方法,尽管我基本上将这两个值都作为int传递。对此有什么解释吗?

在我看来API有点笨拙。只需明确指定:

cmd.Parameters.Add(new SqlParameter("@prm1", SqlDbType.Int){ Value = (int)MyEnum.val1}));

如果不使用任何ORM或框架来构建SQL:,我通常会用扩展来代替它

public static class SqlExtensions
{
public static SqlParameterCollection Add(this SqlParameterCollection pars, string name, SqlDbType type, object value)
{
var res = new SqlParameter(name, type){Value = (value == null ? DbNull.Value)};
pars.Add(res);
return pars;
}
}

然后:

cmd.Parameters.Add("@a", SqlDbType.Int, 123)
.Add("@b", SqlDbType.BigInt, 234)
.Add("@c", SqlDbType.Binary, null);

最新更新