C#:通过2d对象数组将参数传递给函数

时间:2011-09-30 10:46:45

标签: c# sql arrays 2d

我正在尝试编写一个简洁的通用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 []!不是吗?

也许这只是一些小代码问题,一些愚蠢的我做错了。通常是。但是我觉得你们知道一些更简洁的方法来完成上述工作。

1 个答案:

答案 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" });

更多替代方案:

  • 如果您正在使用C#4,您可能会发现动态类型很有用;看一下Massive的例子。
  • 正如Ray所说,你可以传递Dictionary<string, object>;再次,C#3比其他方式更容易:

    Data.SQL("...", new Dictionary<string, object> { 
             { "my_id", 1 },
             { "name", "Jon" }});
    

编辑:至于您遇到的确切问题:您需要了解矩形数组(例如Object[,])和锯齿状<之间的区别/ em> array(例如Object[][])。后者是一个数组数组,这是你尝试使用参数的方式,但它实际上只是一个矩形数组。将参数类型更改为Object[][]可能会解决这个直接问题 - 但我个人会转而采用上述方法之一。顺便说一下,我也试图避免将所有内容都变成字符串。