Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/32: Рейтинг темы: голосов - 32, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69

Синхронизация datagridview и БД ms sql server 2008

24.01.2014, 15:45. Показов 6731. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет, подскажите как быть:

завел на форму datagridview, загрузил таблицу по аналогии как в FAQ(Загрузка таблицы в DataGridView) т.е. FAQ я читал соответственно с похожими темами ознакомился, но актуальность вопрос не потерял((.

Вопрос: как настроить datagridview так, что бы работал без кнопок. Добавили новую запись в гриде она добавилась в таблице, изменили содержание ячейки в гриде - поменялась в таблице и так далее.

Грубо сделать datagridview по функциям аналогом ленточной формы(access) но не для mdb файла, а для таблице к которой подключены в бд(ms sql server)

спасибо.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2014, 15:45
Ответы с готовыми решениями:

Внедрение Windows server 2008+MS SQL Server 2008+1C:SQL
Приветствую Вас,Друзья по разуму!:handshake:Столкнулся с такой темой впервые!Очень прошу поделиться опытом:help:Был бы очень...

Настройка SQL Server 2008 для работы с SQL Server Management Studio
Доброго времени суток. Подскажите пожалуйста, что нужно сделать для того, чтобы SQL Server Management Studio соединялось с SQL сервером ?...

Чем отличается Microsoft® SQL Server® 2008 Express with Tools от Microsoft® SQL Server® 2008 Express with Adva
Друзья! Есть две СУБД, как я понимаю: Microsoft® SQL Server® 2008 Express with Tools Microsoft® SQL Server® 2008 Express with...

35
 Аватар для Юпатов Дмитрий
1722 / 1209 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.01.2014, 14:43
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Студворк — интернет-сервис помощи студентам
Код из моего примера? Там на строке вывода месиджа возникает исключение (tostring не отрабатывает, яже писал) и строкой resume next переходит выполнение дальше

Добавлено через 28 минут
Вроде так все работает корректно.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim we_need_update_row As Boolean = True
 
    Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        If Not we_need_update_row Then
            MsgBox("Мы эту строку только что создали в БД")
            we_need_update_row = True
        Else
            MsgBox("Пошел запрос на Update строки со значением первого столбца = " & sender.item(0, e.RowIndex).value & " в таблице БД")
        End If
    End Sub
 
    Private Sub DataGridView1_RowsAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowsAddedEventArgs) Handles DataGridView1.RowsAdded
        MsgBox("пошел запрос на добавление строки в БД.")
        we_need_update_row = False
    End Sub
 
    Private Sub DataGridView1_UserDeletingRow(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles DataGridView1.UserDeletingRow
        MsgBox("пошел запрос на удаление строки со значением первого столбца = " & e.Row.Cells(0).Value & " из таблицы БД")
    End Sub
Хотя тут вот еще какая проблема: если у нас в таблице БД несколько полей по своим свойствам должны быть не пусты (как ключ, но не только ключевое поле а еще хотя бы одно), то запрос на добавление строки не выполнится - мы же не можем в новой строке одновременно несколько полей заполнять... т.е. запрос в обработчике RowsAdded вернет исключение из БД, при этом строка не добавится, а потом делать Update будет не для чего. Так что тут нам будет грозить куча проверок, или же надо на этапе соединения с таблицей БД считывать свойства полей в таблице и соответственно им назначать свойства столбцов в DGV. Только не спрашивай как эти свойства читать...
Короче тут что-то много получается проблем, ИМХО...
1
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
28.01.2014, 15:04  [ТС]
Логику понял, спасибо.
По удалению, пишет:
Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.

VB.NET
1
2
3
4
5
6
 
   Private Sub DataGridView1_UserDeletingRow(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles DataGridView1.UserDeletingRow
 
Me.DataGridView1.DataSource = sql(SQL:="DELETE FROM table WHERE key =" & e.Row.Cells(0).Value)
 
End Sub
Сталкивался с таким? Есть возможные варианты решения?
Возможно как-то получить набор e.Row.Cells(0).Value в виде 1,3,4,6 ?
0
 Аватар для Юпатов Дмитрий
1722 / 1209 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.01.2014, 16:45
Цитата Сообщение от vej00522 Посмотреть сообщение
Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.
Подозреваю, что в DGV почему-то нет столбцов...
Цитата Сообщение от vej00522 Посмотреть сообщение
Возможно как-то получить набор e.Row.Cells(0).Value в виде 1,3,4,6 ?
что такое 1,3,4,6 - это ряд значений из нулевого столбца?
так e.Row.Cells(0).Value - возвращает значение нулевого столбца строки, которая подлежит удалению...
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
28.01.2014, 17:12  [ТС]
Столбцы есть, они формируются при загрузке формы из sql server - select'ом
1,3,4,6 - это key из select запроса(в datagridview это как раз нулевой столбец)

Т.е. запрос на удаление делаю такой: delete from table where key = e.Row.Cells(0).Value - выводит ошибку.
Если e.Row.Cells(0).Value поместить в какую-то переменную в виде 1,3,4,6 то по логике(могу ошибаться)
можно будет удалить выбранные строки через where key in(какая-то переменная)
0
 Аватар для Юпатов Дмитрий
1722 / 1209 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.01.2014, 17:25
Цитата Сообщение от vej00522 Посмотреть сообщение
Если e.Row.Cells(0).Value поместить в какую-то переменную в виде 1,3,4,6 то по логике(могу ошибаться)
можно будет удалить выбранные строки
Что значит поместить? Значения там уже должны быть после загрузки данных из БД. Как это у вас ключевое поле умудрилось быть с пустыми значениями? Оно должно иметь свойства primary key, NotNull. А если это простое поле, которое вы на уровне БД не идентифицировали как ключ - поимели геморрой.
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
28.01.2014, 17:45  [ТС]
Возможно меня не так понял)
Ещё раз:
datagridview - заполнена из select имеет вид(пример):
key
1
2
3
4
5
6

выделили 4,5,6 нажали delete

e.Row.Cells(0).Value - открывается 3 msgbox сначала 4 потом 5 потом 6 - на все жмем ок.

Всё верно?

получается должен отработаться запрос 3 раза DELETE FROM table WHERE key =" & e.Row.Cells(0).Value верно?

Удаления не происходит пишет ошибку: "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции."

Подскажите пожалуйста, понимаю, что за сегодня "замучал" уже(
0
 Аватар для Юпатов Дмитрий
1722 / 1209 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.01.2014, 18:02
Надо полагать происходит следующее:
После удаления строки с ключом 3 происходит перезаполнение DGV. При этом DGV полностью очищается от строк и столбцов. А потом уже она снова заполняется. Но, поскольку ROW передается по ссылке, а не по значению, фактически ми теряем объект Row для следующего удаления (тк. очищается выделение и параметр e тоже черти чего содержит)
Производите только удаление из БД, не обновляя DGV. Она у вас сама по себе уже удаляет из себя строки.
А сейчас вы фрагментом Me.DataGridView1.DataSource обновляете ее. Т.е. фактически чистите от всего, а потом снова наполняете.
Помните - сложные типы передаются по ссылке, а не по значению.
Пример:
В1 as Datagridviewrow = me.dgv1.rows(1)
B2 as Datagridviewrow = B1

Если изменим me.dgv1.rows(1), то изменится и B2, т.к. В2 всего лишь содержит ссылку на me.dgv1.rows(1).

Пример 2
VB.NET
1
2
3
4
dim a as integer =2
dim b as integer = a
a = 4
msgbox(b)
тут месидж вернет 2, т.к. простой тип передается по значению.
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
28.01.2014, 19:12  [ТС]
При нажатии delet если выбраны три строчки открываются 3 msgbox после нажатия 3 раза ок, обновляется datagridview без этих 3х строк. По datagridview - всё норм.
Не работает лишь часть с sql delete. Как мне взять цифры из этих 3 msgbox и вложить их в одну переменную вида 1,2,3 ?

Добавлено через 35 минут
Удаление происходит, но пишет "Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции."

При этом если выбраны несколько строк то удаляет только первую.

VB.NET
1
Me.DataGridView1.DataSource = sql.msSQLserver(msSQL:="DELETE FROM table WHERE key =" & e.Row.Cells(0).Value)
Может нужен какой-то цикл ?
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
28.01.2014, 19:30
Используйте DataAdapter он как раз предназначен для этого,
если его корректно настроить для обновления конкретной таблицы, не будет ни каких проблем
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
28.01.2014, 19:41  [ТС]
Примеры корректного использования для удаления можно?
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
28.01.2014, 20:41
Настройка DataAdapter для обновления DataGridView

Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Imports System.Data.SqlClient
Public Class Form1
    Public daDataGrid As SqlDataAdapter
    Private tblTable1 As New DataTable
    Private СтрокаПодключения As String
 
    Private Function GetDataAdapter(ByVal ConnectionDB As SqlConnection) As SqlDataAdapter
        Dim dAdapter As New SqlDataAdapter
        Dim param As New SqlParameter
        dAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
        dAdapter.SelectCommand = New SqlCommand("SELECT * FROM Table1", ConnectionDB)
        dAdapter.UpdateCommand = New SqlCommand()
        With dAdapter.UpdateCommand
            .CommandText = "UPDATE Table1 SET NameUser=@NameUser, LastDate=@LastDate " & _
                           "WHERE  IDCode=@IDCode"
            .Connection = ConnectionDB
 
            param = .Parameters.Add(New SqlParameter("@NameUser", SqlDbType.VarChar, 255))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "NameUser"
            param.SourceVersion = DataRowVersion.Current
 
            param = .Parameters.Add(New SqlParameter("@LastDate", SqlDbType.DateTime))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "LastDate"
            param.SourceVersion = DataRowVersion.Current
 
            param = .Parameters.Add(New SqlParameter("@IDCode", SqlDbType.BigInt))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "IDCode"
            param.SourceVersion = DataRowVersion.Current
        End With
 
        dAdapter.InsertCommand = New SqlCommand()
        With dAdapter.InsertCommand
            .CommandText = "INSERT INTO Table1(IDCode, NameUser, LastDate) " & _
                           "VALUES (IDCode, NameUser, LastDate) "
            .Connection = ConnectionDB
 
            param = .Parameters.Add(New SqlParameter("@IDCode", SqlDbType.BigInt))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "IDCode"
            param.SourceVersion = DataRowVersion.Current
 
            param = .Parameters.Add(New SqlParameter("@NameUser", SqlDbType.VarChar, 255))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "NameUser"
            param.SourceVersion = DataRowVersion.Current
 
            param = .Parameters.Add(New SqlParameter("@LastDate", SqlDbType.DateTime))
            param.Direction = ParameterDirection.Input
            param.SourceColumn = "LastDate"
            param.SourceVersion = DataRowVersion.Current
        End With
 
        dAdapter.DeleteCommand = New SqlCommand()
        With dAdapter.DeleteCommand
            .CommandText = "DELETE FROM Table1 WHERE IDCode=@IDCode"
            .Connection = ConnectionDB
        End With
        param = dAdapter.UpdateCommand.Parameters.Add(New SqlParameter("@IDCode", SqlDbType.BigInt))
        param.Direction = ParameterDirection.Input
        param.SourceColumn = "IDCode"
        param.SourceVersion = DataRowVersion.Original
        Return dAdapter
    End Function
 
    Private Sub FillDataGrid() ' Заполняем DGV
        Dim cnn As New SqlConnection(СтрокаПодключения)
        Dim rows As Integer
        daDataGrid = GetDataAdapter(cnn)
        rows = daDataGrid.Fill(tblTable1)
        DataGridView1.DataSource = tblTable1
    End Sub
 
    Private Sub UpdateDataGrid() ' Обновляем базу данных
        Dim rows As Integer
        rows = daDataGrid.Update(tblTable1)
    End Sub
 
 
End Class
1
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
29.01.2014, 13:58  [ТС]
А в какой момент вызывать UpdateDataGrid() ?

Добавлено через 31 минуту
Прописал всё, в form_load запускаем FillDataGrid() верно?
В datagridview1 подгружается табличка, как настроить, что бы изменения внесенные в dgv применялись к таблице в бд?

Добавлено через 59 минут
p.s. не через кнопку...

Добавлено через 1 час 5 минут
Сделал кнопку
При изменении/добавлении новых записей нажимаем кнопку и она обновляет/изменяет таблицу(ms sql server)
При удалении: сначала выделил строку нажал delet строка исчезает, потом нажал на кнопку выдало ошибку rows = daDataGrid.Update(tblTable1) - пишет "Необходимо объявить скалярную переменную "@..."
Что делаю не так?

Добавлено через 39 минут
С Удалением справился. Скажите как сделать, что бы создании новой стоки, при заполнении пользователем отображались данные в первой ячейки из бд ? Первый столбец key нажали на последнюю строку(что бы создать новую) отображались данные из sql запроса(select max(key)+1 from table) в строке столбца key? И что бы эту строку пользователь не редактировал
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
29.01.2014, 19:44
Самый простой способ назначить в БД столбцу Key свойство AutoIncriment=True
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
30.01.2014, 18:28  [ТС]
У кого нибудь есть готовое решение работы с datagridview с ms sql БЕЗ КНОПОК ? Не куски кода,а нормально функционирующий код как у вас в программе. Пример оформления тут
Только без всяких selectов и подключения к бд - этого полно в интернете, в книгах и всяких статьях.
А четкое выполнение решения update|insert|delete

Добавлено через 1 час 49 минут
Может за бабки кто поможет?
0
 Аватар для dimsaratov
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
30.01.2014, 19:24
Проблема не в DGV, а в логике твоей программы.
Какой смысл делать мгновенное обновление БД?
Для того чтобы копить в ней ошибки, а потом геройски их искать?
На оборот нужно делать кнопку по которой будет выполняться Message с вопросом:
"Сохранить изменения?" и желательно два раза и только потом будет происходить обновление БД
0
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 69
04.02.2014, 15:24  [ТС]
Да сделал уже) кто внес ошибки сам их и будет исправлять!!! Просто делаю аналог ленточной формы да и всё)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.02.2014, 15:24

Можно использовать бд созданную в SQL server 2012 на SQL server 2008?
Можно использовать бд созданную в SQL server 2012 на SQL server 2008? если да,то как ее подключить?

Нужна помошь в подключении SQL Server 2008 и Visual Studio 2008
Добрый день уважаемые форумчане... Мне нужна ВАША помощь... Я искал в инете кучу информации о подключении удаленного доступа.. Но там...

Отличие VS 2008 от VS 2008 в SQL Server 2008
Здравствуйте только начал изучать SQL! До этого работал в Visual Studio 2008(с++) и установил SQL Server 2008 В него входит пакет...

OC Window Server 2008(64)+1CV81 Сервер(64)+SQL 2008 (EXPRESS)
Все ставил по умолчанию т.е. на C:\ Установил 1СV81 платформу - полет нормальный Установил 1СV81 сервер – полет нормальный Установил...

Visual Studio 2008+ MS SQL Server 2008 добавления записей
Доброго времени суток господа! У меня возникла такая проблема : ключевое поле в таблице у меня индексированное с автоматическим приращением...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru