Member 13550326 Ответов: 1

Как создать модуль для добавления, сохранения, удаления записей обновления в различных формах


Мне интересно,можно ли создать модуль,который будет добавлять, удалять, обновлять записи на разных формах.

С моим небольшим знанием программирования я думаю,что это невозможно, так как разные формы будут иметь разное количество текстовых полей, combobox или сеток с разными именами и разными таблицами/полями, связанными с ними.

Что я уже пробовал:

Я ничего не пробовал по этому поводу, но думал попробовать. Я подумал, что было бы неплохо сначала посоветоваться с каким-нибудь экспертом.

1 Ответов

Рейтинг:
0

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