В настоящее время мы генерируем классы в App_Code
, возвращая все sprocs из всех наших баз данных и добавляя правильные типы параметров и имена к объекту 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
Есть ли альтернативы необходимости делать это, о которых мы не знаем? Я уверен, что это распространенная проблема среди многих компаний, разрабатывающих приложения для внутренней / внутренней сети.