Передать параметры в SQL Server вставить запрос из нескольких различных событий - PullRequest
0 голосов
/ 07 декабря 2018

Я пишу приложение Winforms в Visual Studio 2013, которое имеет несколько форм.Я добавляю журнал событий, чтобы увидеть, кто что использует, время входа в систему, время выхода из системы и т. Д. (Все безвредно, это инструмент управления для команды на работе).Я хочу упростить и уменьшить длину необходимого кода.

Прямо сейчас у меня есть код ниже в каждой подпрограмме события во всех формах.

 Dim connection As New SqlConnection("Server= server\instance; Database = db;
                                      User ID=uID;Password=pw")

 Private Sub btnAssociate_Click(sender As Object, e As EventArgs) Handles btnAssociate.Click
    Dim eLogCMD As New SqlCommand("sp_EventLog", connection)
    Me.connection.Open()
    eLogCMD.CommandType = CommandType.StoredProcedure
    eLogCMD.Parameters.AddWithValue("@Username", Login.UsernameTextBox.Text.ToString())
    eLogCMD.Parameters.AddWithValue("@Action", "AssociateArea")
    eLogCMD.Parameters.AddWithValue("@Comments", "Entered Associate Area")
    eLogCMD.ExecuteNonQuery()
    Me.connection.Close()

Есть несколько других подпрограмм, все содин и тот же код и несколько форм с одинаковым подключением, SqlCommand и объявленными параметрами;изменяются только значения параметров.Это работает, но должен быть более чистый путь.

Я хочу создать одну SqlConnection и SqlCommand в главной форме для вызова и передачи параметров из различных форм и подпрограмм событий.Я ищу что-то простое, как это:

Sub --Whatever Event
    Main.eLogCMD.ExecuteNonQuery(1stParameterValue, 2ndParameterValue, 3rdParameterValue)
End Sub

Отображение хранимой процедуры SQL Server:

CREATE PROCEDURE [dbo].[sp_EventLog]        
     @Username VARCHAR(50),
     @Action   VARCHAR(30),
     @Comments VARCHAR(100)     
AS       
BEGIN
    INSERT INTO AppEventLog ([Username], [Action], [Comments])
    VALUES (@Username, @Action, @Comments)      
END

1 Ответ

0 голосов
/ 07 декабря 2018

Не делайте эту часть какой-либо формы.Вместо этого вы можете поместить код в собственный модуль.Затем вызовите метод в модуле, используя только те аргументы, которые необходимы для записи журнала.

Не пытайтесь повторно использовать одно и то же соединение объект во всем приложении.Это будет мешать функции в ADO.Net под названием Connection Pooling.Вы можете (и должны) повторно использовать одну и ту же строку подключения, но она отличается.

Public Module Events 
    Private CnString As String = "Server= server\instance; Database = db; User ID=uID;Password=pw"

    Public Sub LogAction(User As String, ActionName As String, Comment As String)
        Using cn As New SqlConnection(CnString), _
              LogCmd As New SqlCommand("sp_EventLog", cn)

            LogCmd.CommandType = CommandType.StoredProcedure
            'AVOID ADDWITHVALUE()! It can cause significant performance problems
            'Instead, set these to match actual column types and lengths from the DB
            LogCmd.Parameters.Add("@Username", SqlDbType.NVarChar, 30).Value = User
            LogCmd.Parameters.Add("@Action", SqlDbType.NVarChar, 80).Value = ActionName
            LogCmd.Parameters.Add("@Comments", SqlDbType.NVarChar, 500).Value = Comment

            cn.Open()
            LogCMD.ExecuteNonQuery()
        End Using
    End Sub  
End Module

Тогда ваши существующие методы сводятся к использованию этого шаблона:

Private Sub btnAssociate_Click(sender As Object, e As EventArgs) Handles btnAssociate.Click
    Events.LogAction(Login.UsernameTextBox.Text, "AssociateArea", "Entered Associate Area")

    '...
End Sub

В идеале, ALL доступ к базе данных будет проходить через модуль, подобный этому, где события пользовательского интерфейса никогда напрямую не обращаются к базе данных, а вместо этого вызывают только методы в вашем модуле базы данных.

...