Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
1

Как создать DataAdapter для возможности сохранения (обновления) данных

15.11.2011, 16:47. Показов 2645. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Делаю так, отдельной процедурой гружу таблицы в Dataset:

VB.NET
1
2
3
4
5
6
7
8
9
    Private Sub LoadTable(ByVal TableName As String)
        Dim DA As New SqlDataAdapter("SELECT * FROM " & TableName, Connection)
        Dim BLD As New SqlCommandBuilder(DA)
        DA.DeleteCommand = BLD.GetDeleteCommand
        DA.InsertCommand = BLD.GetInsertCommand
        DA.UpdateCommand = BLD.GetUpdateCommand
        DA.FillSchema(DS, SchemaType.Mapped, TableName)
        DA.Fill(DS, TableName)
    End Sub
Загрузил. Связал с датагрид. Но теперь, чтобы сохранить изменения, надо вызвать DA.Update.
Вопрос: где мне DataAdapter для таблицы брать?
У меня есть только DS.Tables("Выплаты"). Получается, нужно сохранить где-то в отдельной переменной DataAdapter?


полный код ниже

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Imports System.Data.SqlClient
 
Public Class frmMain
    Dim ConnectionString As String
    Dim Connection As SqlConnection
    Dim DS As New DataSet
 
    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Show()
        ConnectionString =
            "Data Source='server';" &
            "Initial Catalog='payto';" &
            "User Id='sa';" &
            "Password='sa';"
        Connection = New SqlConnection(ConnectionString)
 
        LoadTable("Списки")
        dgvСписки.DataSource = DS
        dgvСписки.DataMember = ("Списки")
 
        LoadTable("Выплаты")
        DS.Relations.Add("Списки2Выплаты", DS.Tables("Списки").Columns("id"), DS.Tables("Выплаты").Columns("Список"))
        dgvВыплаты.DataSource = DS
        dgvВыплаты.DataMember = "Списки.Списки2Выплаты"
 
        'устанавливаем формат для полей с деньгами 0.00
        dgvВыплаты.Columns("Сумма").DefaultCellStyle.Format = "0.00"
        dgvСписки.Columns("Сумма").DefaultCellStyle.Format = "0.00"
 
        'скрываем ненужные столбцы
        dgvВыплаты.Columns("id").Visible = False
        dgvСписки.Columns("id").Visible = False
    End Sub
 
    Private Sub LoadTable(ByVal TableName As String)
        Dim DA As New SqlDataAdapter("SELECT * FROM " & TableName, Connection)
        Dim BLD As New SqlCommandBuilder(DA)
        DA.DeleteCommand = BLD.GetDeleteCommand
        DA.InsertCommand = BLD.GetInsertCommand
        DA.UpdateCommand = BLD.GetUpdateCommand
        DA.FillSchema(DS, SchemaType.Mapped, TableName)
        DA.Fill(DS, TableName)
    End Sub
 
    Private Sub tsAddList_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsAddList.Click
        Dim nr As DataRow = DS.Tables("Списки").NewRow
        DS.Tables("Списки").Rows.Add(nr)
    End Sub
 
    Private Sub tsAddPay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsAddPay.Click
        Dim nr As DataRow = DS.Tables("Выплаты").NewRow
        nr.Item("Список") = dgvСписки.CurrentRow.Cells("id").Value
        DS.Tables("Выплаты").Rows.Add(nr)
    End Sub
 
    Private Sub СохранитьToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsSaveLists.Click
 
    End Sub
 
    Private Sub tsSavePays_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsSavePays.Click
        dgvВыплаты.EndEdit()
        DS.Tables("Выплаты")
    End Sub
End Class
Возможно кто-то более удобный способ подскажет. Поделитесь сурсами. Меня раздражает то, что нельзя в одном месте хранить все объекты для работы таблицей.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2011, 16:47
Ответы с готовыми решениями:

Оптимизация изображения для сохранения (и очень частого обновления) в БД
Всем привет, Предистория: На днях я загорелся идеей изобретения велосипеда :) А именно решил...

Как указать место для сохранения данных в txt
с помощью параметра командной строки? Заранее спасибо!

Как создать цикл для обновления картинки в TImage?
Здравствуйте. Создал форму,на неё поставил TImage,на неё процедура: procedure...

Как вы делаете Update данных в БД (при использовании DataGridView, DataSet, DataAdapter)
Доброго дня, форумчане. Отдельный привет знакомым форумчанам. Решил поднять я старую наболевшую...

4
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
16.11.2011, 09:42 2
Цитата Сообщение от cergew Посмотреть сообщение
Вопрос: где мне DataAdapter для таблицы брать?
ну так вот же ты создаешь адаптер
Цитата Сообщение от cergew Посмотреть сообщение
Dim DA As New SqlDataAdapter("SELECT * FROM " & TableName, Connection)
Только он у тебя объявлен в методе и универсален для всех таблиц, я бы рекомендовал использовать для каждой таблицы собственный адаптер.

Цитата Сообщение от cergew Посмотреть сообщение
Меня раздражает то, что нельзя в одном месте хранить все объекты для работы таблицей.
Кто тебе такое сказал?
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
16.11.2011, 14:35  [ТС] 3
Цитата Сообщение от nio Посмотреть сообщение
ну так вот же ты создаешь адаптер?
Спасибо. Я осознаю, что создаю ДатаАдаптер, только вот это локальная "переменная" и она уничтожается после end sub.

VB.NET
1
2
3
dgvВыплаты.DataSource = Выплаты.DT
...
Выплаты.DA.Update
Я видимо как-то неправильно объяснил что мне нужно. А наверное, я и сам не знаю, что мне нужно

Сделал пока так:
Создал структуру Table, чтобы хранить в ней и адаптер, и таблицу. Объявил соответствующие переменные с типом данных Table
VB.NET
1
2
3
4
5
6
7
    Private Structure Table
        Dim DT As DataTable
        Dim DA As SqlDataAdapter
    End Structure
 
    Dim Выплаты As Table
    Dim Списки As Table
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
    Private Sub LoadTable(ByVal TableName As String, ByRef Dest As Table)
        Dim DA As New SqlDataAdapter("SELECT * FROM " & TableName, Connection)
        Dim BLD As New SqlCommandBuilder(DA)
        DA.DeleteCommand = BLD.GetDeleteCommand
        DA.InsertCommand = BLD.GetInsertCommand
        DA.UpdateCommand = BLD.GetUpdateCommand
        Dest.DA = DA
        Dest.DT = New DataTable
        Dest.DA.FillSchema(Dest.DT, SchemaType.Mapped)
        Dest.DA.Fill(Dest.DT)
        DS.Tables.Add(Dest.DT)
    End Sub
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Show()
        ConnectionString =
            "Data Source='srvsitex';" &
            "Initial Catalog='pavlov_payto';" &
            "User Id='sa';" &
            "Password='@dm!n#1rai';"
        Connection = New SqlConnection(ConnectionString)
 
        LoadTable("Списки", Списки)
        dgvСписки.DataSource = DS
        dgvСписки.DataMember = "Списки"
 
        LoadTable("Выплаты", Выплаты)
        DS.Relations.Add("Списки2Выплаты", DS.Tables("Списки").Columns("id"), DS.Tables("Выплаты").Columns("Список"))
        dgvВыплаты.DataSource = DS
        dgvВыплаты.DataMember = "Списки.Списки2Выплаты"
 
        'устанавливаем формат для полей с деньгами 0.00
        dgvВыплаты.Columns("Сумма").DefaultCellStyle.Format = "0.00"
        dgvСписки.Columns("Сумма").DefaultCellStyle.Format = "0.00"
 
        'скрываем ненужные столбцы
        dgvВыплаты.Columns("id").Visible = False
        dgvСписки.Columns("id").Visible = False
    End Sub
Это вообще, нормально? Или я изобрёл какой-то велосипед?
Вот теперь я могу вызвать спокойно Выплаты.DA.Update
VB.NET
1
2
3
4
    Private Sub tsSavePays_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsSavePays.Click
        dgvВыплаты.EndEdit()
        Выплаты.DA.Update(Выплаты.DT)
    End Sub
Всё хорошо: и в базу сохраняется, и я счастлив - потому что мне надо помнить в коде только название таблицы. Просто без таких танцев с бубном, когда много таблиц будет, что для каждой создавать три переменные?

Добавлено через 13 минут
Надо как-то ещё умнее это делать, ещё проще. А вот как...

Добавлено через 1 час 30 минут
Кстати, тему переименовал модератор, не знаю зачем. Как создать датаадаптер я знаю ))
0
6048 / 3457 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
16.11.2011, 16:19 4
Цитата Сообщение от cergew Посмотреть сообщение
Кстати, тему переименовал модератор, не знаю зачем
почитай правила(п.2.3 и п.2.4), поймешь
0
Крутой форумчанин
154 / 154 / 8
Регистрация: 09.01.2011
Сообщений: 298
21.11.2012, 13:22  [ТС] 5
Цитата Сообщение от cergew Посмотреть сообщение
Надо как-то ещё умнее это делать, ещё проще. А вот как...
Прошу прощения за некропостинг, но - я потом нашёл способ сделать всё гораздо проще и удобнее - это LINQ и Entity Framework. Рекомендую.
0
21.11.2012, 13:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.11.2012, 13:22
Помогаю со студенческими работами здесь

Создать базу данных используя только возможности консольного приложения
Здравствуйте, нужна помощь по созданию базы данных используя только возможно консольного...

Создать базу данных используя только возможности консольного приложения
Предметная область: Учет программного обеспечения на кафедре ИВС Схема базы данных: Учет ПО (ID,...

Как создать диалог выбора файла для чтения и сохранения файла?
Добрый день! Написал простейший текстовый редактор для Windows. Все работает, текст читает из...

Запись данных в базу данных mdb с использованием DataAdapter и DataSet
Попробовал сделать Update для таблицы контактов: private void Form1_Load(object sender,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru