2016-04-11 12 views
0

私はSQL Prepared Statement関数に使用しているクラスを作成しました。クラスは、私はその後、SQLデータベースにデータを挿入するために別の関数に変数を渡すために、このコードを使用し、パラメータVB.Netクラス/メソッドの改良

Public Function MakeMyParameter(ByVal strName As String, ByVal intLength As Integer, ByVal objValue As Object) As _SQLParameter 
    Dim param As New _SQLParameter 
    param.Name = strName 
    param.Length = intLength 
    param.Value = objValue 
    Return param 
End Function 

を作成するには、このコードを持っている

Public Class _SQLParameter 
    Public Name As String 
    Public Length As Int16 
    Public Value As Object 
End Class 

です。

Dim MyDatabaseName as "MyDatabase" 
    Dim MyTableName as "Password" 
    Dim MyVariableList As New List(Of _SQLParameter) 
    MyVariableList.Add(MakeMyParameter("Password",0,varbytePassword)) 
    MyVariableList.Add(MakeMyParameter("DateTimeChanged",0,DateTime.Now())) 
    _SQLPreparedInsertStatement(MyDatabaseName, MyTableName, MyVariableList) 

My関数は、データベース名、テーブル名、および渡されたリスト変数を使用して、プリペアドステートメントを作成し、NonQueryを実行します。これはうまくいく。

すべてのコードは機能しますが、私のコードを改善する方法を知りたいのは、恐ろしいことです。私は.NETの専門家ではありませんが、取得するのに十分なことができます。あなたが私にそれを改善する方法に関するいくつかの提案を与えることができるなら、それは素晴らしいだろう。

おかげ

編集....

私はプリペアドステートメントを作成し、それを実行するために、このサブ・ルーチンを使用しています。私はそれを作って、私が持っているINSERTステートメントにそれを再利用することができます。

Public Sub _SQLPreparedInsertStatement(ByVal _SQLDatabaseName As String, ByVal _SQLTableName As String, _SQLParameters As List(Of _SQLParameter)) 
    Dim _ColumnNames As String = "" 
    Dim _Parameters As String = "" 

    Dim _SQLInsertCommand As New SqlCommand() 
    _SQLInsertCommand.CommandType = CommandType.Text 


    Try 
     Using _SQLConnection As New SqlConnection(_varstrSQLLocalDBConnectionString) 
      Try 
       _SQLConnection.Open() 
       _SQLInsertCommand.Connection = _SQLConnection 
      Catch ex As Exception 
       MessageBox.Show("Error - " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 

      For Each param As _SQLParameter In _SQLParameters 
       _ColumnNames = _ColumnNames & param.Name & "," 
       _Parameters = _Parameters & "@" & param.Name & "," 
       If TypeOf param.Value Is Byte() Then 
        _SQLInsertCommand.Parameters.Add("@" & param.Name, SqlDbType.VarBinary, param.Length).Value = param.Value 
       ElseIf TypeOf param.Value Is String Then 
        _SQLInsertCommand.Parameters.Add("@" & param.Name, SqlDbType.VarChar, param.Length).Value = param.Value 
       ElseIf TypeOf param.Value Is Integer Then 
        _SQLInsertCommand.Parameters.Add("@" & param.Name, SqlDbType.Int, param.Length).Value = param.Value 
       ElseIf TypeOf param.Value Is DateTime Then 
        _SQLInsertCommand.Parameters.Add("@" & param.Name, SqlDbType.DateTime, 0).Value = param.Value 
       End If 
      Next 
      'remove comma from the end of the variables 
      _ColumnNames = _ColumnNames.TrimEnd(",") 
      _Parameters = _Parameters.TrimEnd(",") 

      Try 
       _SQLInsertCommand.CommandText = "USE " & _SQLDatabaseName & "; INSERT INTO " & _SQLTableName & " (" & _ColumnNames & ") VALUES (" & _Parameters & ")" 

       _SQLInsertCommand.ExecuteNonQuery() 

      Catch ex As Exception 
       MessageBox.Show("An error has occurred executing a SQL command - " & ex.Message & Environment.NewLine & "Query - " & _SQLInsertCommand.CommandText, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End Using 
    Catch ex As Exception 
     MessageBox.Show("Some Error. Most unexpected") 
    End Try 
End Sub 
+2

.NETはすでにこの機能を提供しているので、最初はこのコードがあります。 – David

+1

利用可能なオーバーロードの一部を使用する場合、ヘルパークラスなしでパラメータを直接作成して追加することができます: 'cmd.Parameters.Add(param、dbType、size).Value = typedValue'。 "ヘルパー"クラスは直接行うよりも多くの作業になります。 – Plutonix

+0

'this code to ... Insert Data'単一のテーブルの場合、INSERT、SELECT、DELETE、UPDATEコマンドを「記憶」し、基本となるデータテーブルに対して簡単に「更新」を発行するようDataAdapterを設定できます。完全に構成されたDAには他にも多くの利点と機能があります。 – Plutonix

答えて

0

.NETはすでにこれを行います。ここでは、あなたが探しているコンセプトの完全な例です。

Imports System.Data.SqlClient 
Module Module1 
    Sub Main() 
     Using connection As New SqlConnection("Server=SERVERNAME;Database=DATABASENAME;uid=USERNAME;pwd=PASSWORD") 
      connection.Open() 
      Using cmd As SqlCommand = connection.CreateCommand 
       With cmd 
        .CommandType = CommandType.Text 
        .CommandText = "UPDATE SomeTable SET [email protected] WHERE [email protected]" 
        With .Parameters 
         .AddWithValue("@OldValue", "smith") 
         .AddWithValue("@NewValue", "jones") 
        End With 
        .ExecuteNonQuery() 
       End With 
      End Using 
     End Using 
    End Sub 
End Module 
+0

この例をありがとう。私はこれが可能であることを理解しており、私はすでにそれを使用しています。私は単一の関数を書くことを試みたので、バリエーションごとにサブルーチンを書き直さなくても、異なるINSERTステートメントに対して再利用することができます。以下の返信を参照してください – user3771860

+0

あなたが提案しているものに似たコードでレガシーシステムを維持しているので、それはメンテナンスの悪夢であると言えます。私は、あなたがそのようなもののために確立されたパターンを使用することを強くお勧めします。この単一の丸穴を通してデータベースの四角いペグをすべて動かすことは、後悔する決断です。 – DWRoelands

関連する問題