Сильно типизированное разрешение хранимых процедур в VB.NET - PullRequest
1 голос
/ 26 марта 2009

В настоящее время мы генерируем классы в 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

Есть ли альтернативы необходимости делать это, о которых мы не знаем? Я уверен, что это распространенная проблема среди многих компаний, разрабатывающих приложения для внутренней / внутренней сети.

Ответы [ 2 ]

1 голос
/ 26 марта 2009

Почему вы не используете LINQ to SQL? Даже если вы не хотите использовать запрос, он может генерировать методы для вызова хранимых процедур для вас.

0 голосов
/ 26 марта 2009

Или SubSonic , который генерирует очень хороший SPs статический класс, где каждый sproc является вызываемой функцией и возвращает (я считаю) DataTable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...