25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
1

Как внести изменение в поле для конкретной строки

28.03.2012, 13:33. Показов 2931. Ответов 17
Метки нет (Все метки)

Есть обычная форма Supplier с датагридом, данные в который загружаются так: в коде формы этот код
VB.NET
1
2
3
Private Sub Supplier_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.DataGridView1.DataSource = GetDt(SqlQuery)
    End Sub
и создан модуль, в котором функция обрабатывает SQL-запросы и возвращает результат в эту форму при загрузке:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function GetDt(ByVal SqlQuery As String) As DataTable
        Dim dt As New DataTable
        Dim Con As New OleDb.OleDbConnection("Provider=Microsoft Office 12.0 Access Database Engine OLE DB Provider; Data Source=" _
        & My.Application.Info.DirectoryPath & "\Учебная.accdb") ' Переменная для подключения базы
        Dim SqlCom As OleDb.OleDbCommand ' Переменная OleDb-команды
        Dim DA As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса
        SqlCom = New OleDb.OleDbCommand(SqlQuery, Con) ' Указываем строку запроса и привязываем к соединению
        Con.Open() ' Открываем соединение
        SqlCom.ExecuteNonQuery() 'Выполняем запрос
        DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса
        DA.Fill(dt) ' Заполняем таблицу результатми
        Con.Close() ' Не понятно, будет ли в этом случае соединение закрываться?
        Return dt
    End Function
В результате открывается форма с набором данных. В наборе данных есть булево поле Status. Решил запрограммировать, чтобы при изменении значения поля это изменение вносилось в БД. Сделал это так:
VB.NET
1
2
3
4
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        SqlQuery = "UPDATE Suppliers SET [Status] = True"
        Me.DataGridView1.DataSource = GetDt(SqlQuery)
    End Sub
В результате попытки изменения значения поля Status с False на True изменяются значения всех строк этого поля, а не ячейки, в которой я изменил значение. Как исправить?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2012, 13:33
Ответы с готовыми решениями:

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

Поиск конкретной ячейки, которая находится на пересечении конкретного столбца и конкретной строки
Друзья, добрый день. Сейчас поясняю что имею виду. Есть конкретная ячейка, значение в которой мне...

Можно ли в Word задать поле (отступ) для конкретной буквы (слова)?
Например, есть фраза: "Привет как дела." Надо, чтобы расстояние между словом "как" и словом...

Dataset (после изменение конфигурации БД не могу внести изменение)
Использую типизированный dataset после изменение конфигурации бд не могу внести изменение.Dataset...

17
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 13:49 2
T-SQL
1
UPDATE Suppliers SET [Status] = True WHERE [другое поле] = значение
другое поле - это поле с уникальными значениями. Желательно ключевое
значение - значение ключевого поля в той же строке где надо изменить значение поля Status
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:50  [ТС] 3
Мне кажется, что ошибка в том, что сначала надо выбрать строки, в которых будет выполняться Update. Я подправил код, но запрос не выполняется:
VB.NET
1
2
3
4
5
6
7
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        sup = DataGridView1.CurrentRow.Cells(0).Value
        SqlQuery = "SELECT * FROM [Suppliers] WHERE IdSupplier = " & sup
        GetDt(SqlQuery)
        SqlQuery = "UPDATE Suppliers SET Status = True"
        GetDt(SqlQuery)
    End Sub
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 13:52 4
VB.NET
1
SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
а так?
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:54  [ТС] 5
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
UPDATE Suppliers SET [Status] = TRUE WHERE [другое поле] = значение
Понял.
И только сейчас дошло: ведь я могу значение поля менять не только с False на True, но и наоборот. Т.е, надо сначала сделать проверку, какое значение у поля, а потом присвоить ему противоположное значение. Опять делать запрос и с помощью конструкции If...Then это дело реализовывать?
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 13:55 6
смысл в том, что это:
VB.NET
1
SqlQuery = "SELECT * FROM [Suppliers] WHERE IdSupplier = " & sup
просто делает выборку из таблицы БД, но следующий далее запрос на обновление никак с результатами этой выборки не связан в нем надо отдельно указать условие отбора : ...Where...
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 13:56  [ТС] 7
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
Ага, буду пробовать, просто я не успеваю менять коды и отвечать на форуме
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 13:59 8
вот, полистай брошюрку из вложения. Там, правда, для MS SQL server но с аксесом различия синтаксиса минимальны.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 14:00  [ТС] 9
Я сейчас так сделал
VB.NET
1
2
3
sup = DataGridView1.CurrentRow.Cells(0).Value
        SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
        GetDt(SqlQuery)
но нифига не изменяется значение поля

Добавлено через 51 секунду
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
вот, полистай брошюрку из вложения.
Где ссылка?
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 14:01 10
Добавил вложение...
Вложения
Тип файла: rar sql.rar (142.8 Кб, 21 просмотров)
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 14:05 11
а в самой базе смотрел? А то у тебя в процедуре GetDT по запросу на Update возвращать нечего. По идее DA пустой останется. Базу смотри через аксес. Вроде должно отработать все
1
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 16:46  [ТС] 12
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
Добавил вложение...
Спасибо, мануал будет полезен надолго, буду разбираться

Добавлено через 2 часа 38 минут
VB.NET
1
2
3
4
5
6
7
8
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        sup = DataGridView1.CurrentRow.Cells(0).Value
        If DataGridView1.CurrentRow.Cells(2).Value = 0 Then
            SqlQuery = "UPDATE Suppliers SET Status = False WHERE IdSupplier = " & sup
        Else : SqlQuery = "UPDATE Suppliers SET Status = True WHERE IdSupplier = " & sup
        End If
        GetDt(SqlQuery)
    End Sub
Так всё работает.
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 17:06 13
Цитата Сообщение от paa66 Посмотреть сообщение
If DataGridView1.CurrentRow.Cells(2).Value = 0 Then
немного не понял, а в самой БД поле IdSupplier допускает пустые значения?
Просто, если ты пользуешься им как ключом, это нежелательно, т.к. не обеспечивается уникальность значений в данном поле.
И еще: результаты запросов показываются в DataGridView, надо понимать, имена полей тоже из БД в шабках столбцов DGV пишутся. Почему бы не почитать про псевдонимы (Alias). Так оно конечному юзеру будет приятнее. Или в БД столбцы поименовать кириллицей (даже с пробелами). А в запросах обязательно окружай имя поля с пробелами в []. Тогда алиасы не нужны будут и в то же время нормальные имена столбцов поимеешь в DGV.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 17:14  [ТС] 14
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
в самой БД поле IdSupplier допускает пустые значения?
Почему такой вывод? Это поле - автосчётчик, в коде это поле обозначено как DataGridView1.CurrentRow.Cells(0) (т.е. первое поле таблицы), а вот булево поле Status может быть равным 0, это поле в коде обозначено как DataGridView1.CurrentRow.Cells(2) (т.е. третье поле в таблице)
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 19:01 15
а, ну да. Не досмотрелся. Просто привык уже индексы столбцов извлекать из них самих:
VB.NET
1
DataGridView1.CurrentRow.Cells(me.IdSupplier.Index).Value
тут IdSupplier - столбец (объект DataGridViewColumn). Когда работаешь с DGV, заполняемой вручную, то нет проблем присвоить столбцу не только HeaderText, но и Name.
А когда столбцы приходят в пустой DGV, то имя столбца в нем присваивается по имени столбца с данными, прилетевшими из БД. Но на стадии разработки этих столбцов нет! Зато зная, с каким именем прилетит он из БД, можно и обратиться по имени:
VB.NET
1
DataGridView1.CurrentRow.Cells("IdSupplier").Value
C одной стороны, это кажется гемором, но! Присваивая интуитивно понятные имена, легче писать код, да и потом читать его тоже. Плюс не надо держать в голове (или лазить в БД за этим) порядок следования столбцов. И если через время ты захочешь изменить структуру таблицы (внедрить столбцы или изменить порядок следования имеющихся) не будет нужды шарится по всему коду и рихтовать индексы, введенные как фиксированные числа.
Кроме того, читая мануал по SQL ты мог заметить, что порядок следования и количество столбцов в выборке можно регулировать самим запросом: вместо * (все столбцы в порядке их следования в таблице БД) можно написать:
SQL
1
SELECT [столбец5], [столбец1], [столбец2],[столбец8],[столбец4] FROM...
т.е. отобрать только те столбцы, в которых есть надобность и показать их в желаемом порядке. А попробуй так сотворить с кодом, в котором индексы жестко зафиксированы...
Если хочешь, попробуй этот способ - потом не откажешься
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
28.03.2012, 19:44  [ТС] 16
Попробовал я вставить
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
DataGridView1.CurrentRow.Cells("IdSupplier").Value
и выдало ошибку в дэбуге, когда закрыл дочернюю форму, что Column named IdSupplier cannot be found. Хотя, конечно же, столбец под таким названием есть. Но буду иметь в виду такой метод обращения к полю.
0
1704 / 1192 / 227
Регистрация: 23.12.2010
Сообщений: 1,526
28.03.2012, 19:56 17
Цитата Сообщение от paa66 Посмотреть сообщение
столбец под таким названием есть
а попробуй после выборки запроси циклом имена столбцов. только Name.
Странная ошибка сама по себе... я именно так всегда стараюсь обращаться.
0
25 / 26 / 4
Регистрация: 12.12.2011
Сообщений: 197
29.03.2012, 06:53  [ТС] 18
Ошибка вот в чём была: я делал запрос к БД в виде
VB.NET
1
SqlQuery = "SELECT IdSupplier as [№ п\п],..FROM [Suppliers]"
Датагрид уже не содержит имя поля IdSupplier, а поле носит имя [№ п\п]. Теперь это имя и надо использовать и получится так:
VB.NET
1
sup = DataGridView1.CurrentRow.Cells("№ п\п").Value
Теперь всё работает
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2012, 06:53
Помогаю со студенческими работами здесь

Добавление значения для конкретной строки
Например, есть таблица с двумя столбцами - nickname и email. 1 строка 1 колонки уже заполнена -...

Изменение строки в поле
Хочу изменить значение строки для поля, но он этого не делает, хотя все вроде делаю правильно...

Как переставить цифры даты так чтобы её можно внести в поле DATE mysql?
Я отправляю через input дату dd.mm.yyyy, как переставить местами цифры и отправить дату в бд вот...

Изменение строки в табличном поле
Добрый день! Подскажите, пожалуйста, как изменить данные в строке табличного поля на форме?...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru