繁体   English   中英

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

[英]C# : Passing Parameters to a function via a 2d object array

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

也许这只是一些小代码问题,但我做错了一些愚蠢的事情。 通常是这样。 但是我想你们知道做上述事情的一些更精巧的方法。

理想情况下,我很想这样做:

 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[,] )和锯齿状数组(例如Object[][] )之间的区别。 后者是一个数组数组,这就是您尝试使用该参数的方式,但实际上它只是一个矩形数组。 将参数类型更改为Object[][]可能会解决当前的问题-但就我个人而言,我将转向上述方法之一。 顺便说一句,我也尽量避免将所有内容变成字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM