2009-03-26 6 views
1

現在、すべてのデータベースからすべてのsprocsを返し、正しいパラメータの型と名前をSqlCommandオブジェクトに追加して1つの巨大クラスに戻すことで、クラスをApp_Codeに生成します。これは、呼び出しを行うたびに相対的なデータ型でパラメータを追加することなく、ストアドプロシージャのパラメータをSqlCommandに渡すときにMyCmd.cmd.Parameters("MyParam").Value = "whatever"のようなことができることを意味します。また、sprocが単に文字列であるため、各sprocの公開されたパラメータを参照する必要があることも意味します。それはイントラネット/インターネットアプリケーションを意味するだろうとして、本当に、これは望ましくないVB.NETでストアドプロシージャの解決を強く指定する

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

:あなたはこれを行う必要があるだろうSPROCをに対処したいすべてのパラメータのために、大局的にそれを置くために

非常に単純なタスクを達成するために、コード行を爆発させるでしょう。

これを強く型付けすることで、代わりにMyDatabase.MySproc.MyParam("value")のような方法でリファクタリングする方法を検討しています。残念ながら、これは私たちのApp_Codeフォルダーが、そのような大量のコードが必要となるため、既にサイズの2倍になっていることを意味します。

私は私が何を意味するかの簡単な例を書いた:

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

なぜLINQ to SQLを使用しないのですか?クエリの内容を使用したくない場合でも、ストアドプロシージャを呼び出すメソッドを生成できます。

+0

パラメータは実行時にLINQを使用して派生していますか? – Kezzer

+0

LINQ ORMは、コンパイル時にデータコンテキスト生成時にパラメータを推論し、それらを表す強力な型付きのメソッドを作成します。 –

+0

手書きLINQ to SQL関数を選択しましたが、これは可変的に同じです。 – Kezzer

0

SubSonicこれは非常に素晴らしいSPs静的クラスを生成し、各sprocは呼び出し可能な関数であり、DataTableを返します(私は信じています)。

+0

しかし、それはSQL Server 2008のために動作しますか? 2000年と2005年をサポートしているとしか言いません。 – Kezzer

+0

@Kezzer:それもサポートする必要があります。 –

関連する問題