7 / 7 / 2
Регистрация: 31.07.2015
Сообщений: 27
1

Некорректная работа SQL запросов при выводе данных из БД в DGV

15.10.2015, 13:53. Показов 456. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, одна из задач моей прогрмаммы это выводить таблицу из аксесс в dgv. Выполняю это следующим образом:
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
Sub RefreshAbon()
        If IsNothing(AbonSrc) = False Then AbonSrc.Clear()
        AbonSrc = RfrshAbon(Application.StartupPath)
        If IsNothing(AbonSrc) = True Then Exit Sub
        AbonDT.DataSource = AbonSrc
        AbonDT.Columns("Код").Visible = False ' момент №1
        AbonDT.Columns("Дни").Visible = False
        Dim mass(AbonSrc.Rows.Count - 1) As String
        For i As Integer = 0 To AbonSrc.Rows.Count - 1
            mass(i) = AbonSrc.Rows(i)("Абонемент").ToString
        Next
        System.IO.File.WriteAllLines(Application.StartupPath & "\src\abon.txt", mass, System.Text.UnicodeEncoding.UTF8)
        mnAbonName.DataSource = System.IO.File.ReadAllLines(Application.StartupPath & "\src\abon.txt", System.Text.UnicodeEncoding.UTF8)
    End Sub
 
Shared Function LoadAbon(ByVal path As String, ByVal abon As String)
        Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path & "\atl.mdb")
        SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Abon] WHERE([Абонемент]='" & abon & "')", Con)
        Try
            DT.Clear()
            Con.Open()
            SqlCom.ExecuteNonQuery()
            DA = New OleDb.OleDbDataAdapter(SqlCom)
            DA.Fill(DT)
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return Nothing
            Exit Function
        Finally
            Con.Close()
        End Try
        Return DT
    End Function
 
Private Sub mnAbonName_TextChanged(sender As Object, e As EventArgs) Handles mnAbonName.TextChanged
        Dim dt As Data.DataTable = LoadAbon(Application.StartupPath, mnAbonName.Text)
        If IsNothing(dt) = True Then Exit Sub
        abonprice(0) = dt.Rows(0)("Цена").ToString
        abonprice(1) = dt.Rows(0)("Цена (Акция)").ToString
        Dim Sogodni As Date = Today
        Dim D As String = dt.Rows(0)("Длительность (Дней)").ToString
        Dim M As String = dt.Rows(0)("Длительность (Месяцев)").ToString
        Dim Y As String = dt.Rows(0)("Длительность (Лет)").ToString
        If D <> "" Then
            Sogodni = DateAdd(DateInterval.Day, CInt(D), Sogodni)
        End If
        If M <> "" Then
            Sogodni = DateAdd(DateInterval.Month, CInt(M), Sogodni)
        End If
        If Y <> "" Then
            Sogodni = DateAdd(DateInterval.Year, CInt(Y), Sogodni)
        End If
        mnAbonDataEnd.Text = Sogodni
    End Sub
основную часть функций пишу в отдельной dll. первая функция находится в основном коде, ее задача обновлять dgv вызывая вторую функцию (она находится в dll), которая возвращает всю таблицу в переменной dt. я отметил коментарием "Момент №1". думаю там все ясно, колонка "Код" не должна быть видна в dgv, и она не видна если не выполнять третью функцию (если убрать последнюю строчку из первой функции в общем), а если она выполнится, то столбец "Код" остается видимым, хоть я к нему и не обращаюсь.
но это еще пол беды. если выполнить вот это действие на другом контроле:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
Sub KlntShow(ByVal FIO)
        Dim mass(108) As String
        mass = KlntLoad(Application.StartupPath, FIO, True)
        If IsNothing(mass) = True Then Exit Sub
        TabControl2.Enabled = True
        Kod = mass(0)
        balans = CDbl(mass(11))
        mnName.Text = mass(3)
        mnSrname.Text = mass(2)
        mnBirth.Text = mass(5)
        mnPhone.Text = mass(6)
        mnIP.Text = mass(17)
        mnBalans.Text = mass(11)
        mnAbon.Text = mass(10)
        mnDataend.Text = mass(9)
        mnTrenV.Text = mass(16)
        mnTrenM.Text = mass(95)
        RichTextBox2.Text = mass(107)
 'далее еще есть код, но все что я там делаю, это из массива передаю значеня в контролы
End Sub
 
Shared Function KlntLoad(ByVal path As String, ByVal Krit As String, ByVal B As Boolean)
        Dim Con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path & "\atl.mdb")
        If B = True Then
            SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Klienty] WHERE ([Имя Фамилия] = '" & Krit & "')", Con)
        Else
            SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Klienty] WHERE ([Штрихкод] = '" & Krit & "')", Con)
        End If
 
        Try
            DT.Clear()
            Con.Open()
            SqlCom.ExecuteNonQuery()
            DA = New OleDb.OleDbDataAdapter(SqlCom)
            DA.Fill(DT)
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return Nothing
            Exit Function
        Finally
            Con.Close()
        End Try
 
        Dim mass(108) As String
        Try
            mass(0) = DT.Rows(0)("Код").ToString
            mass(1) = DT.Rows(0)("Штрихкод").ToString
            'далее идет код где в массив вносятся еще 106 значений, по понятным причинам я это не включил сюда
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return Nothing
            Exit Function
        End Try
'код далее я думал не включать, так как он явно ни на что не влияет, но пусть будет, на всякий случай.
 
Dim s As String = ""
        If CInt(mass(11)) < 0 Then
            s = s & "Клиент имеет задолженость в размере " & mass(11) & " грн." & vbCrLf
        End If
        If mass(15) <> "" Then
            If CInt(mass(15)) = 1 Then
                s = s & "Архивный клиент." & vbCrLf
            End If
        End If
        Dim Z As String = ""
        If s <> "" Then Z = "*"
 
 
        If B = True Then
            mass(107) = s
            Return mass
        Else
            If CInt(Mid(mass(14), 4, 2)) <> CInt(Mid(Today, 4, 2)) Then
                mass(100) = mass(99)
                mass(99) = mass(98)
                mass(98) = mass(97)
                mass(97) = mass(96)
                mass(96) = mass(95)
                mass(95) = "1"
            Else
                mass(95) = CInt(mass(95)) + 1
            End If
            Try
                SqlCom = New OleDb.OleDbCommand("UPDATE [Klienty] SET [Последняя тренировка]='" & Today & "', [Кол-во Трен всего]='" & CInt(mass(16)) + 1 _
                                            & "', [Тренировки 1]='" & mass(95) & "', [Тренировки 2]='" & mass(96) & "', [Тренировки 3]='" & mass(97) _
                                            & "', [Тренировки 4]='" & mass(99) & "', [Тренировки 5]='" & mass(99) & "', [Тренировки 6]='" & mass(100) _
                                            & "' WHERE ([Код]=" & mass(0) & ")", Con)
                Con.Open()
                SqlCom.ExecuteNonQuery()
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
                Exit Function
            Finally
                Con.Close()
            End Try
 
            Try
                SqlCom = New OleDb.OleDbCommand("INSERT INTO [Today] ([Время], [ИФ], [Код], [Символ], [Предупреждение]) VALUES ('" & TimeOfDay & "','" & mass(4) _
                                                & "','" & mass(0) & "','" & Z & "','')", Con)
                Con.Open()
                SqlCom.ExecuteNonQuery()
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
                Exit Function
            Finally
                Con.Close()
            End Try
            DT.Clear()
            Try
                SqlCom = New OleDb.OleDbCommand("SELECT * FROM [Today] ORDER BY [Время] DESC", Con)
                Con.Open()
                SqlCom.ExecuteNonQuery()
                DA = New OleDb.OleDbDataAdapter(SqlCom)
                DA.Fill(DT)
                Return DT
            Catch ex As Exception
                MsgBox(ex.ToString)
                Return Nothing
                Exit Function
            Finally
                Con.Close()
            End Try
        End If
    End Function
то после выполнения этих двух процедур, в dgv появляются поля из другой таблицы, хотя я к dgv даже не обращался! в общем в dgv должна быть только таблица Abon, а не гибрид Abon и Klienty. соответственно вопрос: как эти процедуры влияют на то что столбец "код" остается видимый, хотя там явно написано обратное и конечно же как мне получить одну таблицу в dgv, а не ту кашу как сейчас?
спасибо за помощь!

Добавлено через 2 часа 19 минут
Удалось локализовать проблему, она в функции refreshabon
VB.NET
1
AbonDT.DataSource = AbonSrc
Если убрать эту строку, то программа работает нормально, а если оставить, начинает подписать + сам dgv отображает не совсем корректно. Но это уж совсем странно. Какая проблемма может быть с этой строкой?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2015, 13:53
Ответы с готовыми решениями:

Ошибка при выводе данных из базы MS SQL Server
Доброе время суток! Пишу программу, которая должна из MS SQL Server вывести таблицу на экран. Но в...

Некорректная работа запросов (дублирование) бд КАДРЫ И ВЫПЛАТЫ
Добрый вечер. Только начинаю работать с Access и пока трудно все освоить, ближе к делу: я...

MS SQL. Преобразование значений при выводе данных из столбца datetime
Добрый день! Подскажите, пожалуйста, никак не могу разобраться. Уже несколько часов пытаюсь...

Некорректная работа cin.fail() при вводе смешанных данных
Дарова, у меня есть код, где присутствует проверка на ввод неправильных данных(в моем случае всяких...

1
356 / 295 / 78
Регистрация: 02.10.2013
Сообщений: 476
Записей в блоге: 5
17.10.2015, 10:23 2
VB.NET
1
2
3
4
5
AbonDT.Columns("Код").Visible = False
AbonDT.Columns("Код").DataPropertyName="Код"
AbonDT.Columns("Дни").Visible = False
AbonDT.Columns("Дни").DataPropertyName = "Дни"
AbonDT.DataSource = AbonSrc
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2015, 10:23
Помогаю со студенческими работами здесь

Вывод данных в БД Access 2003 при использование SQL запросов. Delphi
Добрый день или вечер Камрады, столкнулся с проблемой при использование структуры &quot;insert into&quot;,...

Некорректная работа команды continue в цикле при проверке корректности введенных данных
Доброго времени суток, уважаемые форумчане. Есть программа для определения количества купюр (монет)...

Работа с циклами при вводе и выводе значений из базы данных
Всем доброго времени суток! У меня появилось несолько вопросов по поводу работы с mysql. Попрошу...

Изменение данных в БД SQL через ячейки DGV
Здравствуйте! На форме лежит dataGridView1 - отражает данные SQL таблицы public void...


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

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

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