2016-07-18 2 views
0

Я делаю проект, связанный с Microsoft SQLServer, используемый для ввода, удаления, редактирования данных о клиентах и ​​заказах. Полная система работает, однако мне было рекомендовано использовать транзакции, а не регулярные операторы SQL для добавления/удаления/редактирования данных и т. Д.Оператор транзакции SQL в vb.net

Беда в том, что я не использовал их до и после моих исследований за последние Несколько часов, я не могу понять, как начать их.

Может кто-нибудь посоветует мне, как превратить следующий код в транзакцию?

Public Shared Function SaveNewPerson(ByVal firstName As String, lastName As String, ByVal age As Integer, ByVal postcode As String, m_cn As OleDbConnection) 

    Dim Dc As New OleDbCommand 
    Dc.Connection = m_cn 

    m_cn.Open() 

    Dc.CommandText = "INSERT INTO tblPerson([firstName], [lastName], [age], [postcode]) VALUES('" & firstName & "', '" & lastName & "', '" & age & "', '" & postcode & "')" 

    Dc.ExecuteNonQuery() 

    Dim personID As Integer 

    Dc.CommandText = "SELECT @@IDENTITY" 
    Dc.CommandType = CommandType.Text 
    personID = CType(Dc.ExecuteScalar(), Integer) 

    m_cn.Close() 

End Function 
+2

Прежде чем делать что-нибудь еще нужно, чтобы прочитать о, понять и начать использовать параметризированный код queries.Your широко открыт для SQL Вы также должны посмотреть на использование SCOPE_IDENTITY вместо @@ Identity. Надеемся, что вам посоветовали использовать параметризованные запросы. НЕ выполнять вставки и т. Д. –

+0

Вы также должны быть осторожны с функциями 'Shared', такими как' SaveNewPerson'. Если вы используете общие переменные, это может повредить систему многопоточности. –

+0

Еще одна рекомендация - хранить дату рождения вместо возраста. Возраст - это рассчитанное значение, основанное на текущем реальном времени, которое не хранится как факт в таблице. –

ответ

0

Я только учусь TSQL, увидеть, если этот вид кода будет работать для вас (обратите внимание, что вам нужно Dim tr (с другим именем переменной, если вам нравится) и использовать его в нескольких местах, но в отличие от некоторых языков, вам не нужно настроить объекты для различных методов.

Public Shared Function SaveNewIncident(ByVal clientName As String, dateStart As Date, dateEnd As Date, ByVal incidentProblem As String, ByVal timeStart As String, ByVal timeEnd As String, 
             ByVal incidentSolved As Boolean, ByVal incidentSolution As String, _con As OleDbConnection) 

    Dim tr As OleDbTransaction = Nothing 

    Try 

     Dim Dc As New OleDbCommand 
     Dc.Connection = _con 

     tr = _con.BeginTransaction() 

     Dc.CommandType = CommandType.Text 
     Dc.CommandText = "INSERT INTO dbo.tblIncidents VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)" 
     Dc.Transaction = tr 
     Dc.Parameters.Add("@clientName", OleDbType.VarChar).Value = clientName 
     Dc.Parameters.Add("@dateStart", OleDbType.Date).Value = dateStart 
     Dc.Parameters.Add("@dateEnd", OleDbType.Date).Value = dateEnd 
     Dc.Parameters.Add("@incidentProblem", OleDbType.LongVarChar).Value = incidentProblem 
     Dc.Parameters.Add("@timeStart", OleDbType.VarChar).Value = timeStart 
     Dc.Parameters.Add("@timeEnd", OleDbType.VarChar).Value = timeEnd 
     Dc.Parameters.Add("@incidentSolved", OleDbType.Boolean).Value = incidentSolved 
     Dc.Parameters.Add("@incidentSolution", OleDbType.LongVarChar).Value = incidentSolution 

     Dim personID As Integer 

     Dc.CommandText = "SELECT SCOPE_IDENTITY() AS personID" 
     Dc.CommandType = CommandType.Text 
     personID = CType(Dc.ExecuteScalar(), Integer) 

     tr.Commit() 

    Catch ex As Exception 

     tr.Rollback() 

     Throw 
    End Try 

End Function 
+0

Это сработало, как насчет параматизации кода, чтобы сделать его менее открытым для SQL-инъекции? –

+0

ПОЖАЛУЙСТА, не публикуйте ответы, которые широко открыты для SQL-инъекции, как это. Он должен быть параметризован. –

+1

@SeanLange Я только разместил это, чтобы помочь с первоначальной проблемой. Я сам не совсем уверен, как работает парамашизация, и это может быть по другому вопросу. Но кто говорит, что это будет программа, которая будет жить? Это может даже не беспокоиться об этом, если оно не используется и только для курса/степени и т. Д. – David

Смежные вопросы