VB.NET中强类型存储过程解析

时间:2009-03-26 11:38:22

标签: asp.net vb.net sql-server-2008

目前,我们通过从所有数据库返回所有sprocs并将正确的参数类型和名称添加到App_Code对象然后将其返回到一个巨型类中来生成​​SqlCommand中的类。这意味着当我们想要将参数传递给存储过程的MyCmd.cmd.Parameters("MyParam").Value = "whatever"时,我们可以执行SqlCommand之类的操作,而不必在每次调用时都使用相关数据类型添加参数。这也意味着我们必须查找每个sproc的公开参数,因为它们只是字符串。

从透视角度来看,对于你想在sproc中处理的每个参数,你必须这样做:

cmd.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Param", 3, 10, 1, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Nothing))

实际上这是不可取的,因为它意味着内联网/互联网应用程序会爆炸成数不清的代码行来实现非常简单的任务。

我们正在考虑以这样的方式重构这一点,即我们可以通过强制键入MyDatabase.MySproc.MyParam("value")来代替App_Code。不幸的是,这意味着我们的Public Class MyProc Dim cmd As SqlCommand Public Sub New() ' uses the ConfigurationManager to get the connection string for a certain DB' Dim cmd As New SqlCommand("MyProc", GetSqlConnection()) End Sub Public Sub Param1(ByVal param As String) cmd.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Param1", 3, 10, 1, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Nothing)) cmd.Parameters("Param1").Value = param End Sub Public Sub Param2(ByVal param As String) cmd.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Param2", 22, 7000, 1, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Nothing)) cmd.Parameters("Param1").Value = param End Sub Public Sub Param3(ByVal param As String) cmd.Parameters.Add(New System.Data.SqlClient.SqlParameter("@Param3", 3, 1, 1, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Nothing)) cmd.Parameters("Param3").Value = param End Sub Public Function GetReturnValue() As String cmd.Parameters.Add(New System.Data.SqlClient.SqlParameter("@RETURN_VALUE", 8, 0, 6, False, CType(0, Byte), CType(0, Byte), "", System.Data.DataRowVersion.Current, Nothing)) Return cmd.Parameters("RETURN_VALUE").Value End Function End Class 文件夹的大小将是原来的两倍,因为需要大量的代码。

我写了一个我的意思的简短例子:

{{1}}

是否有其他方法可以做到我们不知道的事情?我确信这是开发内部/内部网应用程序的许多企业中的常见问题。

2 个答案:

答案 0 :(得分:1)

为什么不使用LINQ to SQL?即使您不想使用查询内容,它也可以生成为您调用存储过程的方法。

答案 1 :(得分:0)

SubSonic,它会生成一个非常好的SPs静态类,其中每个sproc都是一个可调用的函数,并返回(我相信)DataTable