powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Полуение уникального ID
25 сообщений из 77, страница 2 из 4
Полуение уникального ID
    #36749026
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> по идее передавала бы себе в цикле каждый раз и нормально
> каждый раз по 7 параметров

Ты или перед каждум созданием параметров очищай коллекцию параметров(что не есть гуд :) ) или один раз создай параметры
и в цикле присваивай им разные значения(собственно это и есть основной плюс параметров :) )

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749076
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносТы или перед каждум созданием параметров очищай коллекцию параметров(что не есть гуд :) )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
For i =  1  To FlexGridPlus4.Rows -  1 
prm.Append comm.CreateParameter("d_id", adBigInt, adParamInput,  20 , naklnum)
prm.Append comm.CreateParameter("cl_id", adBigInt, adParamInput,  20 , Combo1.ItemData(Combo1.ListIndex))
prm.Append comm.CreateParameter("usl_id", adBigInt, adParamInput,  20 , FlexGridPlus4.TextMatrix( 1 ,  4 ))
prm.Append comm.CreateParameter("d_price", adInteger, adParamInput,  7 , massprice(FlexGridPlus4.TextMatrix( 1 ,  4 )))
prm.Append comm.CreateParameter("d_am", adInteger, adParamInput,  5 , FlexGridPlus4.TextMatrix( 1 ,  2 ))
prm.Append comm.CreateParameter("d_date", adDBDate, adParamInput, , Text2.Text)
prm.Append comm.CreateParameter("d_time", adDBTime, adParamInput, , Text3.Text)
comm.Execute
For k =  1  To comm.Parameters.Count
    comm.Parameters.Delete  0 
Next k
FlexGridPlus4.RemoveItem  1 
Next i
Игорь Горбоносили один раз создай параметры
и в цикле присваивай им разные значения(собственно это и есть основной плюс параметров :) )
щас буду пробовать )
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749120
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
блин, Адука, ну что же ты делаешь? давай ещё впендюрь туда пару циклов до милиона, что-бы показать пользователю как
"тяжела и неказиста, жизнь простого программиста"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Dim usl_id As ADODB.Parameter, d_am As ADODB.Parameter, d_price As ADODB.Parameter
   prm.Append comm.CreateParameter("d_id", adBigInt, adParamInput,  20 , naklnum)
    prm.Append comm.CreateParameter("cl_id", adBigInt, adParamInput,  20 , Combo1.ItemData(Combo1.ListIndex))
set usl_id =  comm.CreateParameter("usl_id", adBigInt, adParamInput,  20 )
prm.Append usl_id
set d_price = comm.CreateParameter("d_price", adInteger, adParamInput,  7 )
    prm.Append d_price
set d_am = comm.CreateParameter("d_am", adInteger, adParamInput,  5 )
prm.Append d_am
    prm.Append comm.CreateParameter("d_date", adDBDate, adParamInput, , Text2.Text)
    prm.Append comm.CreateParameter("d_time", adDBTime, adParamInput, , Text3.Text)
For i =  1  To FlexGridPlus4.Rows -  1 
usl_id.value = FlexGridPlus4.TextMatrix( 1 ,  4 )
d_am.value = FlexGridPlus4.TextMatrix( 1 ,  2 )
 d_price.value =  massprice(FlexGridPlus4.TextMatrix( 1 ,  4 ))
   comm.Execute
    FlexGridPlus4.RemoveItem  1 
Next i

Вот и вся проба

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749144
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
ваш код бомба вообще))
спасибо большое)
хотел еще спросить
читал что можно печатать с формы
причем на основании шаблона
так вот подскажите направление)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749333
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05adm,
Насчет печати формы, у самой формы есть метод Print, который выводит форму на принтер. Я им никогда не пользовался, потому что попробовал один раз, мне не подошло, и я сделал перенос картинки из PictureBox'а в вмр на диске и последующую вставку картинки в ворд с нужным текстом(мне нужно было коммерческое предложение делать) как бонус - получил возможность редактирования конечного файла перед печатью :)

Насчет шаблона не слышал, если что-то ещё помнишь, то по-подробнее плиз :)

З.Ы. Кстати практически у всех коллекций есть метод Clear который очищает всю коллекцию сразу и не нужно устраивать цикл по-элементного удаления ;)
Это к удалению параметров :)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749378
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Адука, не вникал в твои примеры, просто хочу подсказать....
У коллекции Command.Parameters есть такой метод Refresh
Он сам заполняет коллекцию параметров, запросив ее у сервера (соответственно, имя процедуры, тип и т.п. уже должно быть заполнено). После чего ты заполняешь коллекцию значениями и выполняешь процедуру.

С одной стороны - это лишний запрос к серверу, с другой стороны - не требуется мучиться с параметрами.
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749395
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProС одной стороны - это лишний запрос к серверу, с другой стороны - не требуется мучиться с параметрами.
из за этого и мучался , хотя refresh намного проще
Игорь Горбонос Насчет шаблона не слышал, если что-то ещё помнишь, то по-подробнее плиз :)
щас поищу здесь где то на форуме читал)
опять вопрос у меня возник)
создал две функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function get_conn() As ADODB.Connection
strconn = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=it; User=root;Password=506;Option=3;"
Set Conn = New ADODB.Connection
Conn.Open strconn
End Function
...
Public Function get_rs(strquery As String) As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open strquery, Conn, adCmdText
End Function
теперь когда обращаюсь к ним
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
strsql = "Select * from clients"
get_conn
get_rs (strsql)
k =  0 
If Not get_rs.EOF Then
    get_rs.MoveFirst
    Do Until get_rs.EOF
        a = get_rs.Fields("id").Value
        b = get_rs.Fields("name").Value
        Combo1.AddItem b, k
        Combo1.ItemData(Combo1.NewIndex) = a
        get_rs.MoveNext
        k = k +  1 
    Loop
End If
conn_rs_comma_close ( 2 )
conn_rs_comma_close ( 1 )
выходит ошибка argument not optional
и еще спросить хотел , создал процедуру которая закрывает соединения, рекордсет и комманд
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Sub conn_rs_comma_close(des As Integer)
Select Case des
    Case  0 
    Set rs = Nothing
    Set Conn = Nothing
    Set comm = Nothing
    Case  1 
    Set Conn = Nothing
    Case  2 
    Set rs = Nothing
    Case  3 
    Set comm = Nothing
End Select
End Sub
так вот необязательно же делать close ? хватает же просто nothing?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36749404
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
самый простой способ))
и видимо то что мне запомнилось
Игорь ГорбоносЗ.Ы. Кстати практически у всех коллекций есть метод Clear который очищает всю коллекцию сразу и не нужно устраивать цикл по-элементного удаления ;)
Это к удалению параметров :)
это у меня на автомате так )
в интернете нашел пример по очистке LISTBOX(цикл) и понеслось)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750379
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADO Connection & Recordset Functions
сделал по данному примеру и все заработало
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750418
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> и ... заработало

А что хоть, не работало?!?!

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750546
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
было так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
strsql = "Select * from clients"
get_conn
get_rs (strsql)
k =  0 
If Not get_rs.EOF Then
    get_rs.MoveFirst
    Do Until get_rs.EOF
        a = get_rs.Fields("id").Value
        b = get_rs.Fields("name").Value
        Combo1.AddItem b, k
        Combo1.ItemData(Combo1.NewIndex) = a
        get_rs.MoveNext
        k = k +  1 
    Loop
End If
conn_rs_comma_close ( 2 )
conn_rs_comma_close ( 1 )

сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
strsql = "Select * from clients"
Set cn = get_conn
Set rs = get_rs(cn, strsql)
k =  0 
If Not rs.EOF Then
    rs.MoveFirst
    Do Until rs.EOF
        a = rs.Fields("id").Value
        b = rs.Fields("name").Value
        Combo1.AddItem b, k
        Combo1.ItemData(Combo1.NewIndex) = a
        rs.MoveNext
        k = k +  1 
    Loop
End If
CloseRs rs
CloseCn cn

ну и функции подправил
было
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Public Function get_conn() As ADODB.Connection
strconn = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=it; User=root;Password=506;Option=3;"
Set Conn = New ADODB.Connection
Conn.Open strconn
End Function
...
Public Function get_rs(strquery As String) As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open strquery, Conn, adCmdText
End Function

стало)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function get_comm(get_conn As ADODB.Connection, proc As String) As ADODB.Command
Set comm = New ADODB.Command
comm.ActiveConnection = get_conn
comm.CommandType = adCmdStoredProc
comm.CommandText = proc
Set get_comm = comm
Set comm = Nothing
End Function
......
Public Function get_rs(get_conn, strquery) As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
End Function

aduka05admвыходит ошибка argument not optional
в этом проблема была
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750827
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> автор: aduka05adm
> было так
> сделал так

ну, особой разницы не заметил, учитывая дальнейший комментарий. см. ниже :)

> ну и функции подправил
> было
> стало)

то что ты подправил свои функции работы с коннекшином и рекордсетом это похвально, НО!
я ни в одной из функций не вижу обработки ошибок :)
И если вдруг что-то случится, вся программа скажет "до свидания" :)
Это и правильно :) При ошибках нужно так и делать :)

Класс, которым я пользуюсь в VBA, если нужно что-то вытащить из какой-нить базы Option Explicit

Private cn As New ADODB.Connection
Private cmd As New ADODB.Command

Private bIsOpen As Boolean

'Private mProgramSettings As CProgramSettings


'***********************************************************************
'* Открывает коннест к базе
'***********************************************************************
Function OpenConnect(sConnectionString As String) As Boolean
Dim sErrDesc As String
OpenConnect = False
bIsOpen = False
On Error GoTo labErr

'cn.Provider = "LCPI.IBProvider"
cn.Open sConnectionString
'cn.State
cmd.ActiveConnection = cn
OpenConnect = True
bIsOpen = True
'cn.BeginTrans
Exit Function
labErr:
'OpenConnect = False
sErrDesc = Err.Description
sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
'Call OutputErrorMessage(sErrDesc, , , "OpenConnect")
End Function

'***********************************************************************
'* Закрывает коннест к базе
'***********************************************************************
Private Sub CloseConnect()
On Error GoTo labErr
'cn.CommitTrans

labErr:
cn.Close
Set cn = Nothing
Set cmd = Nothing

End Sub

'Private Sub CreateProgramSettings()
' Set mProgramSettings = New CProgramSettings
'
' ' Set property settings to determine where the settings will
' ' be saved. In this example, the settings to into the same location
' ' used by the VB SaveSetting/GetSettings routines. This could be your
' ' company name, or the name of another known company such as "Microsoft"
'
' With mProgramSettings
' .RootKey = psrHKEY_LOCAL_MACHINE
' .MainBranch = "SOFTWARE"
' .RegBase = "ECUS"
' .Program = "DBOptions"
' .Section = ""
'
' End With
'
'End Sub

'***********************************************************************
'* Выполняет запрос подготовленный заранее
'***********************************************************************
Public Function ExecQueryBase(sSql As String) As Boolean
Dim sErrDesc As String
Dim erCur As ADODB.Error
On Error GoTo labErr

ExecQueryBase = False
If Not bIsOpen Then
' If Not OpenConnect Then
Exit Function
' End If
End If
'If cn.State = adStateClosed Then Exit Function

cn.BeginTrans
cmd.CommandText = sSql
cmd.Prepared = True
cmd.Execute
cn.CommitTrans
ExecQueryBase = True
Exit Function

labErr:
On Error Resume Next
If cn.State <> adStateClosed Then
cn.RollbackTrans
End If

sErrDesc = "" 'Err.Description & " <-> "


' Get the ADO errors.
If cn.Errors.count > 0 Then
For Each erCur In cn.Errors
sErrDesc = sErrDesc & erCur.Source & ": " & erCur.Description & " | "
Next erCur
End If

sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
Call OutputErrorMessage(sErrDesc, , , "ExecQueryBase", cmd.CommandText)
End Function

'***********************************************************************
'* Выполняет запрос подготовленный заранее
'***********************************************************************
Public Function ExecQueryBaseRS(sSql As String) As ADODB.Recordset
Dim sErrDesc As String
Dim erCur As ADODB.Error

Set ExecQueryBaseRS = Nothing
'If Not bIsOpen Then
' If Not OpenConnect Then
' Exit Function
' End If
'End If

'cn.BeginTrans
On Error GoTo labErr
cmd.CommandText = sSql
cmd.Prepared = True
Set ExecQueryBaseRS = cmd.Execute.NextRecordset
'cn.CommitTrans
Exit Function
labErr:

If cn.State <> adStateClosed Then
cn.RollbackTrans
End If

sErrDesc = "" 'Err.Description & " <-> "

On Error Resume Next

' Get the ADO errors.
If cn.Errors.count > 0 Then
For Each erCur In cn.Errors
sErrDesc = sErrDesc & erCur.Source & ": " & erCur.Description & " | "
Next erCur
End If
sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
Call OutputErrorMessage(sErrDesc, , , "GetID", cmd.CommandText)
End Function


'***********************************************************************
'* Получает из базы значения генераторов
'* для вставки данных в базу
'***********************************************************************
'Public Function GetId(val As TypeID) As Long
'Dim sErrDesc As String
'Dim erCur As ADODB.Error
'
''If Not bIsOpen Then
'' If Not OpenConnect Then
'' Exit Function
'' End If
''End If
'
'On Error GoTo labErr
'cn.BeginTrans
'Select Case val
'Case ID_PHONE
' cmd.CommandText = "execute procedure SP_GEN_INF_PHONE_ID"
'Case ID_SUBSCRIBER
' cmd.CommandText = "execute procedure SP_GEN_INF_SUBSCRIBER_ID"
'Case ID_DIVISION
' cmd.CommandText = "execute procedure SP_GEN_INF_DIVISION_ID"
'End Select
' 'automating defining of parameters ----------------------------------------------
''cmd.Parameters.Refresh
'cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamOutput)
'cmd.Execute
'GetId = cmd.Parameters("ID").Value
'cmd.Parameters.Delete (0)
'cn.CommitTrans
'Exit Function
'labErr:
'cmd.Parameters.Delete (0)
'If cn.State <> adStateClosed Then
' cn.RollbackTrans
'End If
'
'sErrDesc = "" 'Err.Description & " <-> "
'
'On Error Resume Next
'
'' Get the ADO errors.
'If cn.Errors.Count > 0 Then
' For Each erCur In cn.Errors
' sErrDesc = sErrDesc & erCur.Source & ": " & erCur.Description & " | "
' Next erCur
'End If
'sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
'Call OutputErrorMessage(sErrDesc, , , "GetID", cmd.CommandText)
'Err.Raise 70, "GetID"
'End Function

Public Sub ClearDataInBD()
' Очищаем БД от данных
'If Not bIsOpen Then
' If Not OpenConnect Then
' If g_iRowError > 2 Then
' If Not shErr Is Nothing Then
' shErr.Visible = xlSheetVisible
' shErr.Select
' Set shErr = Nothing
' g_iRowError = 2
' End If
' End If
' Exit Sub
' End If
'End If
Call ExecQueryBase("delete from INF_SUBSCRIBER")
Call ExecQueryBase("delete from INF_DIVISION")
Call ExecQueryBase("delete from INF_PHONE")
Call ExecQueryBase("delete from INF_LINK_PDS")
Call ExecQueryBase("delete from CATEG")
End Sub


Private Sub Class_Initialize()
'If Not OpenConnect Then
' Err.Raise vbObjectError + 1, "clsDataBaseWork : Class_Initialize", _
' , ThisWorkbook.Path & "\Создание_справочника.chm"
'End If
End Sub

Private Sub Class_Terminate()
Call CloseConnect
End Sub


Класс изначально ориентировался на работу с FireBird'ом и обладал некоторой спецификой, сейчас, выродился в простую
установку соединения и выполнения каких-то коммандных запросов, типа вставок или удалений, или выполнение запросов
возвращающих рекордсет.

Вот пример заливки данных их екселя в БД, причем в виде мастер-детаил :)
Option Explicit
Dim g_BD As clsDataBaseWork
Dim v As Variant
Dim mCol As Collection
Dim sh As Worksheet, shOut As Worksheet

Sub LoopInData()
If g_BD Is Nothing Then
Set g_BD = New clsDataBaseWork
End If
Set mCol = New Collection
'Set sh = Application.Worksheets("Лист3")
Set sh = Application.Worksheets("Лист1")
' Если база не открылась, работать дальше нельзя
If Not g_BD.OpenConnect("Provider=sqloledb;Data Source=igor;Initial Catalog=ttt;Integrated Security=SSPI;") Then
Set g_BD = Nothing
Exit Sub
End If
Dim nRow As Long, nCol As Long, i As Long
nRow = 1
nCol = 1
For nRow = 2 To 666
sh.Cells(nRow, 15).Value = InsertRec(nRow)
Next nRow
Set g_BD = Nothing
Set mCol = Nothing
Set sh = Nothing
Set shOut = Nothing
End Sub

Function InsertRec(nRow As Long) As String
Dim s As String, sCode As String, rs As Recordset
s = "INSERT INTO [ttt].[dbo].[objects](code_owher, name, land_tipe, number, code_land, adres) VALUES(" & _
CStr(sh.Cells(nRow, 1).Value) & ", '" & Trim(CStr(sh.Cells(nRow, 3).Value)) & "', " & _
CStr(sh.Cells(nRow, 4).Value) & ", " & CStr(sh.Cells(nRow, 5).Value) & ", " & _
CStr(sh.Cells(nRow, 6).Value) & ", " & CStr(sh.Cells(nRow, 7).Value) & ", " & _
vbCrLf & "SELECT SCOPE_IDENTITY() AS code"
Set rs = g_BD.ExecQueryBaseRS(s)
'rs.MoveFirst
sCode = CStr(rs.Fields("code").Value)
Set rs = Nothing
InsertRec = sCode
s = "INSERT INTO [ttt].[dbo].[objects_plus_directions](code_directions, code_objects) VALUES(" & _
CStr(sh.Cells(nRow, 14).Value) & ", " & sCode & ")"
Call g_BD.ExecQueryBase(s)

'Call g_BD.ExecQueryBase(s)
'rs.MoveFirst
Debug.Print s
End Function


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750913
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Класс, которым я пользуюсь в VBA, если нужно что-то вытащить из какой-нить базы
Код: plaintext
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.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
Option Explicit
Private cn As New ADODB.Connection
Private cmd As New ADODB.Command

Private bIsOpen As Boolean

'Private mProgramSettings As CProgramSettings


'***********************************************************************
'* Открывает коннест к базе
'***********************************************************************
Function OpenConnect(sConnectionString As String) As Boolean
Dim sErrDesc As String
OpenConnect = False
bIsOpen = False
On Error GoTo labErr

'cn.Provider = "LCPI.IBProvider"
cn.Open sConnectionString
'cn.State
cmd.ActiveConnection = cn
OpenConnect = True
bIsOpen = True
'cn.BeginTrans
Exit Function
labErr:
'OpenConnect = False
sErrDesc = Err.Description
sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
'Call OutputErrorMessage(sErrDesc, , , "OpenConnect")
End Function

'***********************************************************************
'* Закрывает коннест к базе
'***********************************************************************
Private Sub CloseConnect()
On Error GoTo labErr
'cn.CommitTrans

labErr:
cn.Close
Set cn = Nothing
Set cmd = Nothing

End Sub

'Private Sub CreateProgramSettings()
'  Set mProgramSettings = New CProgramSettings
'
'  ' Set property settings to determine where the settings will
'  ' be saved. In this example, the settings to into the same location
'  ' used by the VB SaveSetting/GetSettings routines. This could be your
'  ' company name, or the name of another known company such as "Microsoft"
'
'  With mProgramSettings
'    .RootKey = psrHKEY_LOCAL_MACHINE
'    .MainBranch = "SOFTWARE"
'    .RegBase = "ECUS"
'    .Program = "DBOptions"
'    .Section = ""
'
'  End With
'
'End Sub

'***********************************************************************
'* Выполняет запрос подготовленный заранее
'***********************************************************************
Public Function ExecQueryBase(sSql As String) As Boolean
Dim sErrDesc As String
Dim erCur As ADODB.Error
On Error GoTo labErr

ExecQueryBase = False
If Not bIsOpen Then
'    If Not OpenConnect Then
        Exit Function
'    End If
End If
'If cn.State = adStateClosed Then Exit Function

cn.BeginTrans
cmd.CommandText = sSql
cmd.Prepared = True
cmd.Execute
cn.CommitTrans
ExecQueryBase = True
Exit Function

labErr:
On Error Resume Next
If cn.State <> adStateClosed Then
    cn.RollbackTrans
End If

sErrDesc = "" 'Err.Description & " <-> "


' Get the ADO errors.
If cn.Errors.count >  0  Then
    For Each erCur In cn.Errors
        sErrDesc = sErrDesc & erCur.Source  ": " & erCur.Description & " | "
    Next erCur
End If

sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
Call OutputErrorMessage(sErrDesc, , , "ExecQueryBase", cmd.CommandText)
End Function

'***********************************************************************
'* Выполняет запрос подготовленный заранее
'***********************************************************************
Public Function ExecQueryBaseRS(sSql As String) As ADODB.Recordset
Dim sErrDesc As String
Dim erCur As ADODB.Error

Set ExecQueryBaseRS = Nothing
'If Not bIsOpen Then
'    If Not OpenConnect Then
'        Exit Function
'    End If
'End If

'cn.BeginTrans
On Error GoTo labErr
cmd.CommandText = sSql
cmd.Prepared = True
Set ExecQueryBaseRS = cmd.Execute.NextRecordset
'cn.CommitTrans
Exit Function
labErr:

If cn.State <> adStateClosed Then
    cn.RollbackTrans
End If

sErrDesc = "" 'Err.Description & " <-> "

On Error Resume Next

' Get the ADO errors.
If cn.Errors.count >  0  Then
    For Each erCur In cn.Errors
        sErrDesc = sErrDesc & erCur.Source & ": " & erCur.Description & " | "
    Next erCur
End If
sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
Call OutputErrorMessage(sErrDesc, , , "GetID", cmd.CommandText)
End Function


'***********************************************************************
'* Получает из базы значения генераторов
'* для вставки данных в базу
'***********************************************************************
'Public Function GetId(val As TypeID) As Long
'Dim sErrDesc As String
'Dim erCur As ADODB.Error
'
''If Not bIsOpen Then
''    If Not OpenConnect Then
''        Exit Function
''    End If
''End If
'
'On Error GoTo labErr
'cn.BeginTrans
'Select Case val
'Case ID_PHONE
'    cmd.CommandText = "execute procedure SP_GEN_INF_PHONE_ID"
'Case ID_SUBSCRIBER
'    cmd.CommandText = "execute procedure SP_GEN_INF_SUBSCRIBER_ID"
'Case ID_DIVISION
'    cmd.CommandText = "execute procedure SP_GEN_INF_DIVISION_ID"
'End Select
' 'automating defining of parameters ----------------------------------------------
''cmd.Parameters.Refresh
'cmd.Parameters.Append cmd.CreateParameter("ID", adInteger, adParamOutput)
'cmd.Execute
'GetId = cmd.Parameters("ID").Value
'cmd.Parameters.Delete (0)
'cn.CommitTrans
'Exit Function
'labErr:
'cmd.Parameters.Delete (0)
'If cn.State <> adStateClosed Then
'    cn.RollbackTrans
'End If
'
'sErrDesc = "" 'Err.Description & " <-> "
'
'On Error Resume Next
'
'' Get the ADO errors.
'If cn.Errors.Count > 0 Then
'    For Each erCur In cn.Errors
'        sErrDesc = sErrDesc & erCur.Source & ": " & erCur.Description & " | "
'    Next erCur
'End If
'sErrDesc = Replace(sErrDesc, vbLf, " | ", , , vbTextCompare)
'Call OutputErrorMessage(sErrDesc, , , "GetID", cmd.CommandText)
'Err.Raise 70, "GetID"
'End Function

Public Sub ClearDataInBD()
' Очищаем БД от данных
'If Not bIsOpen Then
'    If Not OpenConnect Then
'        If g_iRowError > 2 Then
'            If Not shErr Is Nothing Then
'                 shErr.Visible = xlSheetVisible
'                 shErr.Select
'                 Set shErr = Nothing
'                 g_iRowError = 2
'            End If
'        End If
'        Exit Sub
'    End If
'End If
Call ExecQueryBase("delete from INF_SUBSCRIBER")
Call ExecQueryBase("delete from INF_DIVISION")
Call ExecQueryBase("delete from INF_PHONE")
Call ExecQueryBase("delete from INF_LINK_PDS")
Call ExecQueryBase("delete from CATEG")
End Sub


Private Sub Class_Initialize()
'If Not OpenConnect Then
'    Err.Raise vbObjectError + 1, "clsDataBaseWork : Class_Initialize", _
'        , ThisWorkbook.Path & "\Создание_справочника.chm"
'End If
End Sub

Private Sub Class_Terminate()
Call CloseConnect
End Sub


щас будем разбираться спасибо вам)

Вот пример заливки данных их екселя в БД, причем в виде мастер-детаил :)
Код: plaintext
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.
Option Explicit
Dim g_BD As clsDataBaseWork
Dim v As Variant
Dim mCol As Collection
Dim sh As Worksheet, shOut As Worksheet

Sub LoopInData()
If g_BD Is Nothing Then
    Set g_BD = New clsDataBaseWork
End If
Set mCol = New Collection
'Set sh = Application.Worksheets("Лист3")
Set sh = Application.Worksheets("Лист1")
' Если база не открылась, работать дальше нельзя
If Not g_BD.OpenConnect("Provider=sqloledb;Data Source=igor;Initial Catalog=ttt;Integrated Security=SSPI;") Then
    Set g_BD = Nothing
    Exit Sub
End If
Dim nRow As Long, nCol As Long, i As Long
nRow =  1 
nCol =  1 
For nRow =  2  To  666 
    sh.Cells(nRow,  15 ).Value = InsertRec(nRow)
Next nRow
Set g_BD = Nothing
Set mCol = Nothing
Set sh = Nothing
Set shOut = Nothing
End Sub

Function InsertRec(nRow As Long) As String
Dim s As String, sCode As String, rs As Recordset
s = "INSERT INTO [ttt].[dbo].[objects](code_owher, name, land_tipe, number, code_land, adres) VALUES(" & _
    CStr(sh.Cells(nRow,  1 ).Value) & ", '" & Trim(CStr(sh.Cells(nRow,  3 ).Value)) & "', " & _
    CStr(sh.Cells(nRow,  4 ).Value) & ", " & CStr(sh.Cells(nRow,  5 ).Value) & ", " & _
    CStr(sh.Cells(nRow,  6 ).Value) & ", " & CStr(sh.Cells(nRow,  7 ).Value) & ", " & _
    vbCrLf & "SELECT SCOPE_IDENTITY() AS code"
Set rs = g_BD.ExecQueryBaseRS(s)
'rs.MoveFirst
sCode = CStr(rs.Fields("code").Value)
Set rs = Nothing
InsertRec = sCode
s = "INSERT INTO [ttt].[dbo].[objects_plus_directions](code_directions, code_objects) VALUES(" & _
    CStr(sh.Cells(nRow,  14 ).Value) & ", " & sCode & ")"
 Call g_BD.ExecQueryBase(s)

'Call g_BD.ExecQueryBase(s)
'rs.MoveFirst
Debug.Print s
End Function

это так для читабельности)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36750953
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно вопросы )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Function OpenConnect(sConnectionString As String) As Boolean
..........
OpenConnect = False ' это че функция типо не выполняется?
.................
OpenConnect = True ' а здесь пустили на выполнение?
....................
End Function
и еще
Код: plaintext
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.
Function OpenConnect(sConnectionString As String) As Boolean
...............
bIsOpen = False
.............
bIsOpen = True
...............
End Function
...............
Public Function ExecQueryBase(sSql As String) As Boolean
Dim erCur As ADODB.Error
...............
f Not bIsOpen Then ' прикольно замутили )
'    If Not OpenConnect Then
        Exit Function
'    End If
End If
................
cn.BeginTrans ' как раз искал пример , он же работает только в пределах
cmd.CommandText = sSql ' одного connection?
cmd.Prepared = True
cmd.Execute
cn.CommitTrans
..............
labErr:
On Error Resume Next
If cn.State <> adStateClosed Then
    cn.RollbackTrans ' а если я в пределах одного connection делаю несколько
End If ' запросов со вставкой и обн-ем они все отменятся?
....................
' Get the ADO errors.
If cn.Errors.count >  0  Then
    For Each erCur In cn.Errors ' тоже прикольно
        sErrDesc = sErrDesc & erCur.Source  ": " & erCur.Description & " | "
    Next erCur
End If
...................
Call OutputErrorMessage(sErrDesc, , , "GetID", cmd.CommandText)' а это где)?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36751009
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admможно вопросы )
это че функция типо не выполняется?
.................
а здесь пустили на выполнение?
....................

нет :)
т.к. функция возвращает логическое значение показателя удачности установки соединения, то для экономии, изначально предполагается что функция не выполнится и поэтому присваиваем False. Если установка соединения произошла успешно, тогда изменяем возвращаемое значение на True

aduka05adm
и еще
...............
f Not bIsOpen Then ' прикольно замутили )
................

Там изначально была проверка на неоткрытость соединения с БД и попытка установить соединение, а потом из-за чего-то переделал как сейчас

aduka05adm
как раз искал пример , он же работает только в пределах
одного connection?
а если я в пределах одного connection делаю несколько
запросов со вставкой и обн-ем они все отменятся?
Да, все что будет выполненно между BeginTrans и CommitTrans будет считатся атомарной операцией, и если что-то пойдет не так, откатится всё что было выполненно с момента подачи команды BeginTrans
aduka05admтоже прикольно
:) это из МСДН, пример обработки ошибок
aduka05adm
а это где)?

а вот оно :)
Недостающий остаток для примера заливки данных
Код: plaintext
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.
Option Explicit

Public Const sSqlDelim = ", "

' Данные для вывода ошибок
'Const iColErr = 15 ' Столбец для ошибок
Public shErr As Worksheet
Public g_iRowError As Long

Public g_lFillCountRows As Long ' Общее количество строк с записями



'Путь к базе данных, глобальный для вывода на лист Full
Public sDBPath As String

' Объект для работы с БД
Public g_BD As clsDataBaseWork

Enum StructErr
    seColErr =  1    '"Ошибка"
    seColSheet =  2  '"Лист"
    seColRow =  3    '"Строка с ошибкой"
    seColFunc =  4   '"Функция"
    seColText =  5   '"Текст"
End Enum

Public Function OutputErrorMessage(sErrMess As String, Optional sSheet As String = "", _
    Optional iRow As Long =  0 , Optional sFunc As String = "", Optional sTxt As String = "")
If shErr Is Nothing Then
    Set shErr = CheckSheetError
End If
On Error GoTo labErr
With shErr
    .Cells(g_iRowError, seColErr).Value = sErrMess
    .Cells(g_iRowError, seColSheet).Value = sSheet
    .Cells(g_iRowError, seColRow).Value = iRow
    .Cells(g_iRowError, seColFunc).Value = sFunc
    .Cells(g_iRowError, seColText).Value = sTxt
End With
g_iRowError = g_iRowError +  1 
Exit Function

labErr:

End Function

'***********************************************************************
'* Проверяет наличие в книге листа для вывода ошибок.
'* Если листа нет - создает
'***********************************************************************
Private Function CheckSheetError() As Worksheet
Dim s As String
On Error GoTo labErr

' Инициализируем номер строки для вывода ошибок
' По номеру строки будем проверять наличие ошибок
' Если больше 2, значит были ошибки и нужно показать лист с ошибками
g_iRowError =  2 

Set CheckSheetError = Sheets("Ошибки")

CheckSheetError.Cells.ClearContents
CheckSheetError.Cells( 1 , seColErr).Value = "Ошибка"
CheckSheetError.Cells( 1 , seColSheet).Value = "Лист"
CheckSheetError.Cells( 1 , seColRow).Value = "Строка с ошибкой"
CheckSheetError.Cells( 1 , seColFunc).Value = "Функция"
CheckSheetError.Cells( 1 , seColText).Value = "Текст"

Exit Function
labErr:
If Err.Number =  9  Then
    With ActiveWorkbook.Sheets.Add
        .Name = "Ошибки"
        .Visible = xlSheetHidden
    End With
'    Sheets(s).Select
    Set CheckSheetError = Sheets("Ошибки")
    CheckSheetError.Cells.ClearContents
    CheckSheetError.Cells( 1 , seColErr).Value = "Ошибка"
    CheckSheetError.Cells( 1 , seColSheet).Value = "Лист"
    CheckSheetError.Cells( 1 , seColRow).Value = "Строка с ошибкой"
    CheckSheetError.Cells( 1 , seColFunc).Value = "Функция"
    CheckSheetError.Cells( 1 , seColText).Value = "Текст"
End If
End Function

Public Function ShowError()
If g_iRowError >  2  Then
    If Not shErr Is Nothing Then
         shErr.Visible = xlSheetVisible
         shErr.Select
         Set shErr = Nothing
         g_iRowError =  2 
    End If
End If
End Function
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36751018
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
спасибо )) будем думать и учиться
Игорь ГорбоносНедостающий остаток для примера заливки данных
это вы так лог ведете?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36751031
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> это вы так лог ведете?

Для екселя, да. А вообще там может быть и запись в файл, и в базу и ещё куда нить :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36751301
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
доработал
Код: plaintext
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.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
Option Explicit
Private strquery As String, proc As String
Private strconn As String
Private conn As ADODB.Connection
Private comm As ADODB.Command
Private prm As ADODB.Parameters
Private rs As ADODB.Recordset
Private i As Integer
Dim err_num As Integer
Private bIsOpen As Boolean
Public sErrDesc As String
Private erCur As ADODB.Error
''''''''''''''''''''''''''''''''''''''''''''''
' Создаем connection
''''''''''''''''''''''''''''''''''''''''''''''
Public Function get_conn() As ADODB.Connection
On Error GoTo My_Err
bIsOpen = False
strconn = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Database=it; User=root;Password=506;Option=3;"
Set conn = New ADODB.Connection
conn.Open strconn
bIsOpen = True
Set get_conn = conn
Set conn = Nothing
Exit Function
My_Err:
sErrDesc = ""
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "connection", err_num
End Function
''''''''''''''''''''''''''''''''''''''''''''''
' Заполняем grid
''''''''''''''''''''''''''''''''''''''''''''''
Public Sub flexname(get_rs As ADODB.Recordset, gridname As FlexGridPlus)
On Error GoTo My_Err
gridname.Cols = get_rs.Fields.Count
gridname.Rows =  1 
For i =  0  To get_rs.RecordCount -  1 
    gridname.TextMatrix( 0 , i) = get_rs.Fields(i).Name
Next i
Do While Not get_rs.EOF
    gridname.Rows = gridname.Rows +  1 
    For i =  0  To get_rs.Fields.Count -  1 
    If Not get_rs.Fields(i) = "" Then
        gridname.TextMatrix(gridname.Rows -  1 , i) = get_rs.Fields(i)
    End If
    Next i
get_rs.MoveNext
Loop
Set gridname = Nothing
Exit Sub
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "grid", err_num
End Sub
''''''''''''''''''''''''''''''''''''''''''''''
' создаем command для работы с хранимыми процедурами
'''''''''''''''''''''''''''''''''''''''''''''''
Public Function get_comm(get_conn As ADODB.Connection, proc As String) As ADODB.Command
On Error GoTo My_Err
If Not bIsOpen Then
    Exit Function
End If
Set comm = New ADODB.Command
comm.ActiveConnection = get_conn
comm.CommandType = adCmdStoredProc
comm.CommandText = proc
Set get_comm = comm
Set comm = Nothing
Exit Function
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "command", err_num
End Function
''''''''''''''''''''''''''''''''''''''''''''''''''''
' создаем recordset
''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function get_rs(get_conn, strquery) As ADODB.Recordset
On Error GoTo My_Err
If Not bIsOpen Then
    Exit Function
End If
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
Exit Function
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "recordset", err_num
End Function
'''''''''''''''''''''''''''''''''''''''''''''''''
' закрываем recordset
'''''''''''''''''''''''''''''''''''''''''''''''
Public Sub CloseRs(get_rs As ADODB.Recordset)
    On Error Resume Next
    If IsObject(get_rs) Then
        If get_rs.State =  1  Then: get_rs.Close
    End If
    'If Err.Number <> 0 Then strErr = strErr & Err.Number & " / " & Err.Description & "<br>"
    Set get_rs = Nothing
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''
' закрываем connection
''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub CloseCn(get_conn As ADODB.Connection)
    On Error Resume Next
    If IsObject(get_conn) Then
        If get_conn.State =  1  Then: get_conn.Close
    End If
    'If Err.Number <> 0 Then strErr = strErr & Err.Number & " / " & Err.Description & "<br>"
    Set get_conn = Nothing
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''
' закрываем command
'''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub CloseComm(get_comm As ADODB.Command)
    On Error Resume Next
'    If IsObject(get_comm) Then
'        If get_comm.State = 1 Then: get_comm.Cancel
'    End If
    'If Err.Number <> 0 Then strErr = strErr & Err.Number & " / " & Err.Description & "<br>"
    Set get_comm = Nothing
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''
' записываем ошибки в таблицу errors
' используя command и хранимую процедуру
'''''''''''''''''''''''''''''''''''''''''''''''''
Public Sub OutputErrorMessage(err_des As String, from As String, num As Integer)
'On Error GoTo My_Err
Set conn = get_conn
Set comm = get_comm(conn, "add_to_err")
Set prm = comm.Parameters
prm.Append comm.CreateParameter("my_err", adVarChar, adParamInput,  200 , err_des)
prm.Append comm.CreateParameter("fr", adVarChar, adParamInput,  45 , from)
prm.Append comm.CreateParameter("num", adBigInt, adParamInput,  40 , num)
comm.Execute
CloseComm comm
CloseCn conn
Exit Sub
My_Err:
End Sub

гляньте когда время будет , может че неправильно делаю или попроще можно сделать
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36751788
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: aduka05adm
> +доработал

Это у тебя класс или просто набор функций в модуле?
Если это класс, то я не вижу смысла в приватных переменных strquery, proc, strconn уровня класса без свойств Let и Get.
Можно понять если бы ты, объявил константой строку подключения, но ты этого не сделал :) .Вынесено объявление парметров,
такой-же вопрос - для чего они на уровне класса, без соответствующих свойств для чтения/установки по имени/номеру.
Рекордсет - зачем он для всего класса? Запрос выполнили, получили в результате рекордсет, отдали его вызывавшему и
забыли, зачем хранить его в переменной? Это лишняя связь удерживающая ресурсы, пока этой переменной не присвоить Nothing
или новый рекордсет, старый будет "болтатся" в памяти. Не понятно, что делает функция заполнения грида в классе работы с
SQL server'ом ?

Это если у тебя класс, теперь если у тебя модуль и просто набор функций, но эти вопросы касаются и класса :)
Мне не понравились имена параметров функций, совпадающие с именами функций. Читая код не понятно, ты используешь
параметр или вызываешь функцию.

Теперь просто критика :)
Не во всех функциях у параметров указаны типы данных, и в функции вывода лога в БД не предусмотренна обработка ошибок и
ни в одной из функций не предусмотренна проверка корректности передаваемых параметров. Вполне возможен случай(у меня
зачастую бывает :) ) создал таблицу, заполнил её данными, а потом пишу селект из клиентского приложения, а мне в ответ
ошибка. Потому, что забыл дать права на селект. Так вот, у тебя соединение установится, а при попытке выполнить запрос
может свалится и функция вернёт не рекордсет, а Nothing а т.к. проверок нет, вывалится :(


Это, то что сразу бросилось в глаза :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752284
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь ГорбоносЭто у тебя класс или просто набор функций в модуле?
набор функций в модуле
Игорь ГорбоносЕсли это класс, то я не вижу смысла в приватных переменных strquery, proc, strconn уровня класса без свойств Let и Get.
я даже не в курсе как надо в классе че делать , надо поинтересоваться как с ним работать
Игорь ГорбоносМожно понять если бы ты, объявил константой строку подключения, но ты этого не сделал :)
верно , я вообще константы никогда не использую )
Игорь ГорбоносРекордсет - зачем он для всего класса? Запрос выполнили, получили в результате рекордсет, отдали его вызывавшему и
забыли, зачем хранить его в переменной?
Код: plaintext
1.
2.
3.
4.
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
я же его закрываю
если имеете ввиду эту строку
Код: plaintext
Set get_rs = rs
то я думал так надо , взял из той ссылки, пример , уберу если она не нужна
Игорь ГорбоносМне не понравились имена параметров функций, совпадающие с именами функций
думал понятней будет , получилось наоборот )
Игорь ГорбоносТеперь просто критика :)
тоже думал это поправить
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752516
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admИгорь ГорбоносРекордсет - зачем он для всего класса? Запрос выполнили, получили в результате рекордсет, отдали его вызывавшему и
забыли, зачем хранить его в переменной?
Код: plaintext
1.
2.
3.
4.
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
я же его закрываю

а теперь представим ситуацию, что во время выполнения произошла ошибка и эта строка не выполняется, а выполняется код:
Код: plaintext
1.
2.
3.
4.
5.
6.
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "recordset", err_num
End Function
а здесь нет освобождения рекордсета, а он создан по New :)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752534
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбоносaduka05admИгорь ГорбоносРекордсет - зачем он для всего класса? Запрос выполнили, получили в результате рекордсет, отдали его вызывавшему и
забыли, зачем хранить его в переменной?
Код: plaintext
1.
2.
3.
4.
Set rs = New ADODB.Recordset
rs.Open strquery, get_conn, adOpenDynamic
Set get_rs = rs
Set rs = Nothing
я же его закрываю

а теперь представим ситуацию, что во время выполнения произошла ошибка и эта строка не выполняется, а выполняется код:
Код: plaintext
1.
2.
3.
4.
5.
6.
My_Err:
sErrDesc = ""
err_num =  0 
sErrDesc = Err.Description
err_num = Err.Number
OutputErrorMessage sErrDesc, "recordset", err_num
End Function
а здесь нет освобождения рекордсета, а он создан по New :)

если переменная rs объявлена в рамках ф-ии/процедуры, то ничего не страшно, а вот если глобально, то да, могут быть проблемы
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752704
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,
Игорь Горбоноса здесь нет освобождения рекордсета, а он создан по New :)
надо будет туда тоже добавить)
Код: plaintext
1.
Set get_rs = rs
а это мы передаем объект правильно же ?)
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752717
Фотография aduka05adm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
Konst_Oneесли переменная rs объявлена в рамках ф-ии/процедуры, то ничего не страшно
а что с ним будет происходить тогда в данном случае?
...
Рейтинг: 0 / 0
Полуение уникального ID
    #36752724
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aduka05admKonst_One,
Konst_Oneесли переменная rs объявлена в рамках ф-ии/процедуры, то ничего не страшно
а что с ним будет происходить тогда в данном случае?


уничтожится
...
Рейтинг: 0 / 0
25 сообщений из 77, страница 2 из 4
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Полуение уникального ID
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]