Некорректная работа 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
|