我正在尝试编写一个简洁的通用Sql方法,该方法将接受SQL查询和参数列表,并返回结果。我想保持足够整洁,我可以使用任何其他代码中的一行来调用它。
这样做真的很棒吗?我不想在调用代码中创建所有SqlParameters,我不想传递和拆分字符串。在过去,我使用了一个string []数组并接受了每个奇数成员作为参数名称,并且每个偶数都作为一个参数值,但是在调用该方法时太容易搞砸了。
理想情况下,我喜欢这样做:
Data.SQL("Select * from Table where my_id = @my_id", { my_id = 1 });
我知道这有点不切实际,所以我尝试了这个:
Data.SQL("Select * from Table where my_id = @my_id", new Object[,]{ { "my_id", 1 } });
然而,当我尝试在另一端处理它时,我只会遇到麻烦:
public static Object SQL(String command, Object[,] parameters = null){
[ ... reusable SQL code here... ]
foreach(Object[] p in parameters){
cmd.Parameters.Add(new SqlParameter(p[0].ToString(), p[1].ToString());
}
}
看起来很好,但在foreach语句中抛出错误
foreach (Object[] p in parameters)
无法将“System.String”类型的对象强制转换为“System.Object []”
但我没有传递它是一个System.String数组。我传递的是2D System.Object []!不是吗?
也许这只是一些小代码问题,一些愚蠢的我做错了。通常是。但是我觉得你们知道一些更简洁的方法来完成上述工作。
答案 0 :(得分:4)
理想情况下,我喜欢这样做:
Data.SQL("Select * from Table where my_id = @my_id", { my_id = 1 });
我知道这有点不切实际,
好吧,在完全那个表格中,是的......但是试试这个:
Data.SQL("Select * from Table where my_id = @my_id", new { my_id = 1 });
这将为参数使用匿名类型,您可以通过反射来检查。您可能只需要一个参数(即它将是SQL(string sql, object parameters)
),因为您将在单个对象中传递多个参数:
Data.SQL("Select * from Table where my_id = @my_id and name = @name",
new { my_id = 1, name = "Jon" });
更多替代方案:
正如Ray所说,你可以传递Dictionary<string, object>
;再次,C#3比其他方式更容易:
Data.SQL("...", new Dictionary<string, object> {
{ "my_id", 1 },
{ "name", "Jon" }});
编辑:至于您遇到的确切问题:您需要了解矩形数组(例如Object[,]
)和锯齿状<之间的区别/ em> array(例如Object[][]
)。后者是一个数组数组,这是你尝试使用参数的方式,但它实际上只是一个矩形数组。将参数类型更改为Object[][]
可能会解决这个直接问题 - 但我个人会转而采用上述方法之一。顺便说一下,我也试图避免将所有内容都变成字符串。