- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
''' <summary>
''' Функция взятия запроса как инструкции t/sql; рекордсет возвращается в виде oZap(,).
''' </summary>
''' <param name="eConnectString">Строка подключения к БД из списка.</param>
''' <param name="sText">Инструкция t/sql.</param>
''' <param name="oErr">Необязательная ошибка.</param>
''' <param name="oZap">Необязательный двумерный массив, содержащий рекордсет ― 1-ю таблицу датасета.</param>
''' <param name="iTimeout">Необязательное число секунд таймаута запроса.</param>
''' <returns>Число затронутых строк в таблице БД; если ноль, то нормально ещё, а если -1, то запрос не прошёл, если -2, то соединение не установилось.</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [Max Pro] 11.04.2007 Created
''' [Max Pro] 08.08.2008 Реабилитировал OleDb.
''' [Max Pro] 08.04.2009 Оптимизировал как надо ReDim Preserve и переполнение Integer.
''' [Max Pro] 27.08.2009 Исправил ошибку ReDim Preserve ― было больше на 1 элемент.
''' </history>
''' -----------------------------------------------------------------------------
Public Function iZap(ByVal eConnectString As ConnectString, ByVal sText As String, Optional ByRef oErr As Exception = Nothing, Optional ByRef oZap(,) As Object = Nothing, Optional ByVal iTimeout As Integer = -1) As Integer
'#region "var"
Dim iX As Integer
Dim lY As Long
Dim lYTemp As Long
Dim i As Integer
Dim iZapTemp As Integer
'var zap
Dim sConnectString As String = sConStrFromEnum(eConnectString)
Dim oConnection
Dim oCommand
Dim oReader
'#end region 'var
'#region ini
If sConnectString Like "*sqloledb*" Then
oConnection = New OleDbConnection
oCommand = New OleDbCommand
Else
oConnection = New SqlConnection
oCommand = New SqlCommand
End If
'#end region 'ini
iZap = -2
oErr = New Exception
oConnection.ConnectionString = sConnectString
Try
'попытка открытия соединения
oConnection.Open()
If oConnection.State Then iZap = -1 'if <>0
'присвоение параметров команды
If iTimeout >= 0 Then oCommand.CommandTimeout = iTimeout
oCommand.CommandType = CommandType.Text
oCommand.Connection = oConnection
oCommand.CommandText = sText
'попытка выполнения команды
oReader = oCommand.ExecuteReader()
iZap = 0
iX = oReader.FieldCount - 1
lY = -1
lYTemp = 255
ReDim oZap(iX, lYTemp)
While oReader.Read()
lY += 1
If lY < Integer.MaxValue Then '2 147 483 647-1(заменил <= на < чтобы число элементов iZap не зашкалило).
iZapTemp = lY + 1
If lY > lYTemp Then
lYTemp += 256
ReDim Preserve oZap(iX, lYTemp)
End If
For i = 0 To iX
If IsDBNull(oReader(i)) Then oZap(i, lY) = Nothing Else oZap(i, lY) = oReader(i)
Next i
End If
End While
oReader.Close()
oReader = Nothing
oCommand = Nothing
iZap = iZapTemp
ReDim Preserve oZap(iX, iZapTemp - 1)
If lY >= Integer.MaxValue Then
oErr = New Exception(lY.ToString("# ##0") & " строк >=" & Integer.MaxValue & " (Integer.MaxValue), но массив заполнен до предела Int32 и iZap=Integer.MaxValue.")
End If
Catch oError As Exception
oErr = oError
Finally
If IsNothing(oConnection) = False Then
oConnection.Close()
oConnection = Nothing
End If
End Try
End Function 'iZap
А так Максим Прохоров выполняет запросы. слабо?