Создание оператора вставки - Windows-приложение Vb.Net - PullRequest
1 голос
/ 26 декабря 2008

Я делаю приложение для Windows в vb.net. У меня есть объект клиента содержит метод сохранения. как создать запрос на вставку?

Мне нужно сохранить объект в реляционной базе данных (SQL-сервер). Мне нужно знать, какой правильный способ сделать вставку, т. Е. Внутри метода save я написал инструкцию SQL для сохранения объекта. Это правильный путь?

Спасибо

Ответы [ 6 ]

4 голосов
/ 26 декабря 2008

Простой оператор INSERT для SQL принимает следующую базовую форму:

INSERT INTO [tablename] ( [column1], [column2], ... ) VALUES ( [value1], [value2], ...)

Итак, нам, очевидно, нужно знать о таблице базы данных, которую вы используете: какие у нее столбцы. Нам также нужно знать о классе: какими свойствами он обладает. Наконец, нам нужно знать о типах данных для столбцов таблицы и свойств класса, а также о том, как свойства будут сопоставляться со столбцами. Для очень простых объектов имена и типы будут просто совпадать. Но в других случаях ваш класс может сам содержать коллекцию (или несколько), которая будет означать вставку данных в более чем одну таблицу.

После того, как все это определено, нам все еще нужны две вещи: информация о соединении для базы данных (обычно сводится в одну строку соединения ) и то, обеспокоены ли вы тем, что ваш экземпляр класса мог быть сохраненные ранее, и в этом случае вы хотите создать оператор UPDATE, а не INSERT.

Предполагая, что вы можете ответить на все это удовлетворительным образом, ваш код VB.Net будет выглядеть примерно так (конечно, при необходимости подставляя ваш конкретный столбец, свойство, тип и информацию о соединении):

Public Class Customer
    Public Sub Save()
        DAL.SaveCustomer(Me)
    End Sub

    '   ...'

End Class

.

' a VB Module is a C# static class'
Public Module DAL 
    Private ConnString As String = "Your connection string here"

    Public Sub SaveCustomer(ByVal TheCustomer As Customer)
        Dim sql As String = "" & _
        "INSERT INTO [MyTable] (" & _
            "[column1], [column2], ..." & _
        ") VALUES (" & _
            "@Column1, @Column2, ... )"

        Using cn As New SqlConnection(ConnString), _
              cmd As New SqlCommand(sql, cn)

            cmd.Parameters.Add("@column1", SqlDbTypes.VarChar, 50).Value = TheCustomer.Property1
            cmd.Parameters.Add("@column2", SqlDbTypes.VarChar, 1000).Value = TheCustomer.Property2

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

Я знаю, что вы уже слышали, что выделение кода вашей базы данных - это "правильная вещь", но я подумал, что вам также могут понадобиться более конкретные причины, почему вы хотели бы структурировать свой код таким образом:

  • Строка подключения хранится в одном месте, поэтому, если ваш сервер баз данных перемещается, вам нужно только сделать одно изменение. Еще лучше, если это собственная сборка или файл конфигурации.
  • Если вы когда-либо переходите на совершенно другой тип базы данных, вам нужно всего лишь изменить один файл, чтобы обновить программу.
  • Если у вас есть один разработчик или администратор базы данных, который особенно хорош в SQL, вы можете позволить ему выполнять большую часть обслуживания в этой части приложения.
  • Это делает код для ваших "реальных" объектов проще и, следовательно, его легче обнаружить, когда вы совершаете логическую ошибку проектирования.
  • Код DAL может в конечном итоге использоваться повторно, если другое приложение хочет установить связь с той же базой данных.
  • Если вы используете инструмент ORM, большая часть кода DAL написана для вас.
1 голос
/ 27 декабря 2008

Я согласен с Майком Хофером. Сохранение вашего класса, который выполняет поиск и сохранение объекта отдельно от ваших бизнес-классов, является ключом к гибкому и надежному дизайну. Это код, который вы хотите видеть на своем графическом интерфейсе или бизнес-уровне:

//Populate Customer Objects List with data
IList<Customer> customerList = new List<Customer>()
Customer newCustomer1 = new Customer();
newCustomer.Name = "New Name"
newCustomer.email ="abcd@abcd.com"
customerList.Add(newCustomer1)

//DAL calls
DataAccessClass dalClass = new DataAccessClass ();
dalClass.InsertCustomers(customerList);

Внутри вашего DALClass должен быть метод с именем InsertCustomers (клиенты IList), и он должен иметь следующий код:

      Public Function InsertCustomers(ByVal objectList As IList(Of Customer)) As Integer
        Dim command As IDbCommand = Nothing
        Dim rowsAffected As Integer = 0
        Dim connection As IDbConnection = New System.Data.SqlClient.SqlConnection(Me.ConnectionString)
        Try 
            connection.Open
            Dim e As IEnumerator = objectList.GetEnumerator

            Do While e.MoveNext

                command = connection.CreateCommand
                command.CommandText = "insert into dbo.Customer(CustomerID,CustomerGUID,RegisterDate,Password,SiteID,Las"& _ 
                    "tName,FirstName,Email,Notes,BillingEqualsShipping,BillingLastName) values (@Cust"& _ 
                    "omerID,@CustomerGUID,@RegisterDate,@Password,@SiteID,@LastName,@FirstName,@Email"& _ 
                    ",@Notes,@BillingEqualsShipping,@BillingLastName)"
                System.Console.WriteLine("Executing Query: {0}", command.CommandText)
                Dim paramCustomerID As IDbDataParameter = command.CreateParameter
                paramCustomerID.ParameterName = "@CustomerID"
                command.Parameters.Add(paramCustomerID)
                Dim paramCustomerGUID As IDbDataParameter = command.CreateParameter
                paramCustomerGUID.ParameterName = "@CustomerGUID"
                command.Parameters.Add(paramCustomerGUID)
                Dim paramRegisterDate As IDbDataParameter = command.CreateParameter
                paramRegisterDate.ParameterName = "@RegisterDate"
                command.Parameters.Add(paramRegisterDate)
                Dim paramPassword As IDbDataParameter = command.CreateParameter
                paramPassword.ParameterName = "@Password"
                command.Parameters.Add(paramPassword)
                Dim paramSiteID As IDbDataParameter = command.CreateParameter
                paramSiteID.ParameterName = "@SiteID"
                command.Parameters.Add(paramSiteID)
                Dim paramLastName As IDbDataParameter = command.CreateParameter
                paramLastName.ParameterName = "@LastName"
                command.Parameters.Add(paramLastName)
                Dim paramFirstName As IDbDataParameter = command.CreateParameter
                paramFirstName.ParameterName = "@FirstName"
                command.Parameters.Add(paramFirstName)
                Dim paramEmail As IDbDataParameter = command.CreateParameter
                paramEmail.ParameterName = "@Email"
                command.Parameters.Add(paramEmail)
                Dim paramNotes As IDbDataParameter = command.CreateParameter
                paramNotes.ParameterName = "@Notes"
                command.Parameters.Add(paramNotes)
                Dim paramBillingEqualsShipping As IDbDataParameter = command.CreateParameter
                paramBillingEqualsShipping.ParameterName = "@BillingEqualsShipping"
                command.Parameters.Add(paramBillingEqualsShipping)
                Dim paramBillingLastName As IDbDataParameter = command.CreateParameter
                paramBillingLastName.ParameterName = "@BillingLastName"
                command.Parameters.Add(paramBillingLastName)
                Dim modelObject As Customer = CType(e.Current,Customer)
                paramCustomerID.Value = modelObject.CustomerID
                paramCustomerGUID.Value = modelObject.CustomerGUID
                paramRegisterDate.Value = modelObject.RegisterDate
                If IsNothing(modelObject.Password) Then
                    paramPassword.Value = System.DBNull.Value
                Else
                    paramPassword.Value = modelObject.Password
                End If
                paramSiteID.Value = modelObject.SiteID
                If IsNothing(modelObject.LastName) Then
                    paramLastName.Value = System.DBNull.Value
                Else
                    paramLastName.Value = modelObject.LastName
                End If
                If IsNothing(modelObject.FirstName) Then
                    paramFirstName.Value = System.DBNull.Value
                Else
                    paramFirstName.Value = modelObject.FirstName
                End If
                If IsNothing(modelObject.Email) Then
                    paramEmail.Value = System.DBNull.Value
                Else
                    paramEmail.Value = modelObject.Email
                End If
                If IsNothing(modelObject.Notes) Then
                    paramNotes.Value = System.DBNull.Value
                Else
                    paramNotes.Value = modelObject.Notes
                End If
                paramBillingEqualsShipping.Value = modelObject.BillingEqualsShipping
                If IsNothing(modelObject.BillingLastName) Then
                    paramBillingLastName.Value = System.DBNull.Value
                Else
                    paramBillingLastName.Value = modelObject.BillingLastName
                End If
                rowsAffected = (rowsAffected + command.ExecuteNonQuery)

            Loop
        Finally
            connection.Close
            CType(connection,System.IDisposable).Dispose
        End Try
        Return rowsAffected
    End Function

Больно писать код DAL вручную, но вы будете иметь полный контроль над своим кодом DAL, SQL и Mapping, и в будущем изменение любого из них будет быстрым делом.

Если вам не хочется писать весь код DAL вручную, вы можете получить CodeGenerator, например Orasis Mapping Studio , чтобы сгенерировать точно такой же код, который показан без написания чего-либо. Вам просто нужно встроить свой SQL в инструмент, сопоставить свойства с параметрами, и все готово. Это сгенерирует все остальное для вас.

Удачи и счастливого кодирования DAL!

1 голос
/ 26 декабря 2008

Здесь есть несколько вопросов. Во-первых, где именно вы сохраняете это? Вы говорите SQL, но это SQL Server, экземпляр SQL Express, локальный кэш данных (SQL CE 3.5) или сохранение через веб-службу для связи с вашим SQL SERVER. Эти разные источники данных имеют разные параметры / требования к подключению, а в случае SQL CE есть несколько других «ошибок», связанных с самим SQL.

Во-вторых, вы уверены, что хотите сохранить данные в реляционном хранилище данных, таком как SQL Server? Учтите, что вместо этого вы можете использовать XML, файл данных (текст, CSV и т. Д.) Или даже пользовательский двоичный тип файла.

Поскольку вы работаете с приложением Windows, у вас есть множество вариантов, где и как сохранить данные. Пока вы не знаете, куда хотите поместить данные, нам будет сложно помочь вам сделать это.

0 голосов
/ 27 декабря 2008

Не совсем уверен, о чем спрашивает ОП.

Вам необходимо точно определить, что вы делаете, в методе «Сохранить»

  • Если вы создаете новую запись в методе Save, вам нужно использовать оператор INSERT.
  • Если вы обновляете существующую запись в методе Save, вам необходимо использовать инструкцию UPDATE.

Методы «сохранения» обычно подразумевают, что оба случая обрабатываются процедурой.

Лучше было бы иметь методы («Создать» или «Вставить») и («Обновить» или «Сохранить»).

Или, может быть, есть одна процедура, которая обрабатывает оба.

0 голосов
/ 26 декабря 2008

Я предпочитаю идею Майка Хофера: иметь хранимый процесс на стороне SQL Server для обработки актуальных обновлений данных, а также иметь отдельный класс для переноса вызовов к этим хранимым процессам. Просто мои 0,02 $

0 голосов
/ 26 декабря 2008

Я со Стивеном Райтоном. Здесь много переменных и много вопросов без ответов. Если это SQL, это даже Microsoft диалект SQL? Это Оракул? MySQL? Что-то еще?

В любом случае, я предпочитаю избегать встраивания SQL в приложение, если могу, и вызывать хранимую процедуру даже для вставок и обновлений. Затем я передаю аргументы для процедуры объекту команды ADO.NET. У меня в голове есть безумная идея, что SQL принадлежит базе данных. Возможно, это происходит из-за того времени, которое я потратил на отладку ужасно написанного кода ASP, который соединял вместе строки SQL еще в эпоху Dot Com. (Никогда больше.)

Если вы чувствуете, что это абсолютно необходимо, познакомьтесь с классом System.Text.StringBuilder . Узнать его. Любить это. Сделай это своим лучшим другом.

UPDATE: Увидев ваш ответ, теперь я вижу, что вы работаете с SQL Server. Это делает вещи намного лучше.

Я бы порекомендовал разделить ваш код SQL на отдельный класс, в отличие от реального бизнес-класса. Некоторые могут не согласиться с этим, но это сохранит ЦЕЛЬ занятий ясной. (См. Разделение проблем .)

Вы хотите, чтобы ваш бизнес-объект обрабатывал бизнес-логику, а также отдельный класс, который обрабатывает работу по вводу данных в базу данных и из нее. Таким образом, если у вас есть проблемы с логикой сериализации, у вас будет гораздо лучшее представление о том, где искать, и ваши шансы потерять бизнес-логику значительно уменьшатся. Это также значительно упрощает понимание вашего приложения.

Немного предварительных усилий по написанию еще нескольких классов принесут ОГРОМНОЕ вознаграждение в будущем.

Но это только мое мнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...