Здравствуйте! Сегодня: Чт, 20 Июн 2019, Ваш IP: 18.215.161.19 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Общие вопросы программирования
+ Создать новую тему Страница: 1
Тема: Save in VB.NET · +  +  дата добавления: 28.04.2015 / 08:40
Автор темы:
rusiko
rusiko
тем: 104 / ответов: 25 / благодарностей: 0 / репутация: 3
ответов: 25
создал(а) тем: 104


Привет всем. Есть небольшая проблемка. Помогите пожалуйста. До этого, когда писал программы, пользовался мастером. Но заметил что процедуры работают намного быстрее и поэтому решил воспользоваться ими. Но вот не знаю как при этом сохранять данные в datagrid. Программа написана на VB.NET, а БД на SQL Server. Написал следущюю процедуру на sql, вызываю процедуру при каждом нажатии на кнопку.

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        DataGridView1.Visible = True
        Dim connetionString As String
        Dim connection As SqlConnection
        Dim adapter As SqlDataAdapter
        Dim command As New SqlCommand
        Dim ds As New DataSet
        connetionString = "Data Source=.;Initial Catalog=SirDB;User ID=sa;Password=123456"
        connection = New SqlConnection(connetionString)
        connection.Open()
        command.Connection = connection
        command.CommandType = CommandType.StoredProcedure
        command.CommandText = "Phones"
        adapter = New SqlDataAdapter(command)
        adapter.Fill(ds)
        Dim dt As New DataTable
        adapter.Fill(dt)
        DataGridView1.DataSource = dt
        connection.Close()
    End Sub
В данном случае при нажатии на кнопку вызывается процедура и загружаются данные из таблицы PhoneTable. И этот код вставил для click-а каждой кнопки, поменяв только название процедуры. Первая проблема: Можно ли как-то упростить этот код, чтобы не писать один и тот же код много раз. Ведь меняется там всего лишь название процедуры. А следующий код написал для сохранения данных:

Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        DataGridView1.AllowUserToAddRows = True
        DataGridView1.AllowUserToDeleteRows = True
        Dim cn As SqlConnection = New SqlConnection("Data Source=.;Initial Catalog=SirDB;User ID=sa;Password=123456")
        adapter = New SqlDataAdapter("select PhoneID, FirstName, [Address], City, Phone, Phone_2, Others  from PhoneTable", cn)
        Dim builder As New SqlCommandBuilder(adapter)
        adapter.InsertCommand = builder.GetInsertCommand()
        adapter.UpdateCommand = builder.GetUpdateCommand()
        adapter.DeleteCommand = builder.GetDeleteCommand()
        dt = New DataTable()
        adapter.Fill(dt)
        DataGridView1.DataSource = dt
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            adapter.Update(dt)
            MessageBox.Show("Saved successfully")
        Catch ex As Exception
            MessageBox.Show("Error updating database")
        End Try
    End Sub
Никаких ошибок не вылетает, но данные не сохранятся. Как могу сохранить данные. Спасибо заранее.
Технологии: Microsoft SQL Server, Visual Basic .NET
 
Ответ # 1 # · +  +  дата добавления: 28.04.2015 / 11:55
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


Можно ли как-то упростить этот код, чтобы не писать один и тот же код много раз. Ведь меняется там всего лишь название процедуры.
Конечно можно, и даже нужно.

У меня бы этот код, с моими вспомогательными классами, сейчас выглядел бы так:
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
  DataGridView1.Visible = True
  Using client As Nemiro.Data.Sql.SqlClient() 'строка соединения с базой автоматически берется из файла конфигурации
    client.CommandText = "Phones"
    DataGridView1.DataSource = client.GetTable()
  End Using
End Sub

Сейчас это уже не отдельные классы, а библиотека.

Исходный код библиотеки на данный момент закрыт.

Она хороша для получения DataSet, DataTable, DataRow и выполнения простых запросов.
Тип CommandText определяется автоматически, нет необходимости указывать, что это хранимая процедура или обычный запрос SQL.
Класс Nemiro.Data.Sql.SqlClient совмещает в себе SqlConnection и SqlCommand.
Есть встроенные механизмы кэширования данных, без чего в веб невозможно прожить.

Мне эта версия не нравится, но все мои и рабочие проекты используют эту библиотеку. Имя класса SqlClient неудачно выбрано, особенно заметно в VB.NET, где умная Visual Studio предлагает неправильные решения конфликтов :) (если путь к классу писать в сокращенном виде - SqlClient, то наверняка студия предложит импортировать System.Data.SqlClient) Но больше всего не нравится реализация ORM, для текущих проектов это не очень удобно (проекты сложные и требуют немного иных решений, чем те, которые предлагает библиотека Nemiro.Data).

Kbyte.Ru живет на самой первой версии. FoxTools.Ru, в особенности новый API использует последнюю версию.
Никаких ошибок не вылетает, но данные не сохранятся. Как могу сохранить данные.
Видимо запросы не прописаны в builder, либо неправильные.

Моя библиотека больше под web адаптирована. Элементы типа DataGridView я не использую, слишком много ресурсов потребляют (автоматизация; если делать все руками, то в принципе можно).
С Nemiro.Data пришлось бы циклом перебирать и сохранять каждую запись. Либо использовать ORM, но придется для коллекций писать код руками, по сути тоже с циклами. В прочем, массовое сохранение данных на практике я бы вряд ли стал использовать. Скорее предпочел бы сохранять сразу после изменения, либо сделал бы отдельную форму для редактирования отдельных записей и там сохранял. Последний вариант более удобен, в плане того, что не нужно выводить все данных в DataGridView, а только основные и форму редактирования проще сделать удобной для пользователя, т.к. по сути нет никаких ограничений (например, можно разделить данные на группы при помощи TabStrip, сделать проверку данных и т.п).

Установка через NuGet:

PM> Install-Package Nemiro.Data

Есть справочник на русском языке:
http://data.nemiro.net/guide/ru/

Вот страница описания основного класса:
http://data.nemiro.net/guide/ru/?topic=html/7f05f17d-32a3-a336-1b90-a70c54450331.htm

PS: Я уже потихоньку обдумываю новую версию. Исходный код скорее всего будет открыт. Реализация, как и текущей версии, будет на C#. А вот документация на русском наверное не осилю :)
 
Страница: 1 + Создать новую тему