A_Griffin
Вы можете создать универсальный модуль с одной универсальной функцией и передать ему параметризованный SQL - оператор, а также набор параметров, которые могут быть использованы для добавления, обновления или удаления записей. Я действительно сделал что - то подобное однажды- это сработало довольно хорошо.
В моем случае мне нужно было беспокоиться только о 5 различных типах параметров - вы можете добавить другие:
Friend Enum ParamType
eNull = 0
eString = 1
eInteger = 2
eDecimal = 3
eDate = 4
End Enum
и я создал функцию create new parameters
''' <summary>
''' Defining parameters for database command
''' </summary>
''' <param name="sName">Parameter name (omit any leading @)</param>
''' <param name="eType">Parameter type (Enum ParamType)</param>
''' <param name="sValue">Paramter value (as Object)</param>
''' <param name="bRepeat">Repeat parameter in order after others in collection</param>
Friend Function NewParam(ByVal sName As String, ByVal eType As Integer, ByVal sValue As Object, ByVal bRepeat As Boolean) As clsParam
Dim cls As New clsParam
cls.sName = "@" & sName
cls.eType = eType
cls.sValue = sValue
cls.bRepeat = bRepeat
Return cls
End Function
Точка параметра bRepeat предназначена только для тех сценариев, в которых вы хотите передать оператор "insert.... on duplicate key update...", а затем ou устанавливает bRepeat в True для любого из них в предложении "on duplicate key update".
Тогда универсальная функция проста: (NB в моем случае было полезно передать уже открытое соединение с БД, но это явно не обязательно - зависит от вашего сценария. Возможно, вы также используете другой разъем БД - я использовал MySqlData.dll соединитель.)
Как я уже сказал, все это сработало хорошо - NB вам действительно нужно быть осторожным при создании своей коллекции, чтобы параметры NewParam были добавлены в правильном порядке.
''' <summary>
''' Generic database ExecuteNonQuery function
''' </summary>
''' <param name="sql">Parametized SQL query</param>
''' <param name="coll">Collection of clsParam parameters</param>
''' <param name="objConn">An OPEN database connection</param>
''' <remarks>Params in coll MUST be added in the correct order!</remarks>
Friend Sub UpdateDB(ByVal sql As String, ByVal coll As Collection, ByVal objConn As MySqlConnection)
Dim objCmd As New MySqlCommand
Try
objCmd.Connection = objConn
objCmd.CommandText = sql
If Not coll Is Nothing AndAlso coll.Count > 0 Then
Dim colR As New Collection
Dim cls As clsParam
Dim r As Integer
For r = 1 To coll.Count
cls = CType(coll(r), clsParam)
Select Case cls.eType
Case ParamType.eString
objCmd.Parameters.AddWithValue("@" & cls.sName, CStr(cls.sValue))
Case ParamType.eInteger
objCmd.Parameters.AddWithValue("@" & cls.sName, CInt(cls.sValue))
Case ParamType.eDecimal
objCmd.Parameters.AddWithValue("@" & cls.sName, CDec(cls.sValue))
Case ParamType.eDate
objCmd.Parameters.AddWithValue("@" & cls.sName, CDate(cls.sValue))
Case Else
objCmd.Parameters.AddWithValue("@" & cls.sName, DBNull.Value)
End Select
If cls.bRepeat Then
colR.Add(cls)
End If
Next
If colR.Count > 0 Then
For r = 1 To colR.Count
cls = CType(colR(r), clsParam)
Select Case cls.eType
Case ParamType.eString
objCmd.Parameters.AddWithValue("@b" & cls.sName, CStr(cls.sValue))
Case ParamType.eInteger
objCmd.Parameters.AddWithValue("@b" & cls.sName, CInt(cls.sValue))
Case ParamType.eDecimal
objCmd.Parameters.AddWithValue("@b" & cls.sName, CDec(cls.sValue))
Case ParamType.eDate
objCmd.Parameters.AddWithValue("@b" & cls.sName, CDate(cls.sValue))
Case Else
objCmd.Parameters.AddWithValue("@b" & cls.sName, DBNull.Value)
End Select
Next
End If
End If
objCmd.Prepare()
objCmd.ExecuteNonQuery()
Catch ex As Exception
' log the error
End Try
End Sub