Что нового

Работа с SQL через ADOBD(Получение данных из таблиц)

Renz

Осваивающий
Сообщения
63
Репутация
36
Нижеприведенный код возвращает пустые значения, может кто-нибудь знает в чем причина? (в Management Studio результат есть) Причем кол-во возвращаемых строк соответствует запросу.
Код:
Dim $server, $db, $username, $password,$ConnObj,$RezObj 
$server = "\SQLEXPRESS"
$db = "arktica"
$username = "sa"
$password = "******"

;создание объекта для поключения к SQl
$ConnObj = ObjCreate("ADODB.Connection")
If $ConnObj = 0 Then
	MsgBox(0,"","Error create ADODB.Connection",2)
	Exit
EndIf
;создание объекта для получения данных из SQl
$RezObj = ObjCreate("ADODB.Recordset")
If $RezObj = 0 Then
	MsgBox(0,"","Error create ADODB.Connection",2)
	Exit
EndIf
;подключение к SQL
$ConnObj.Open("DRIVER={SQL Server};SERVER=" & $server & ";DATABASE=" & $db & ";uid=" & $username & ";pwd=" & $password & ";")
;обработать ошибку
If $ConnObj.State = 0 Then
	MsgBox(0,"","Error create Connect SQL",2)
	Exit
EndIf
;определить активное подключение
$RezObj.ActiveConnection = $ConnObj

;запрос к базе с возвратом результата
$sqlString = "Select code,name From spr_000 Where tname = 'spr_'"
$QueryRez = $RezObj.Open($sqlString)

;обработка результата
While $RezObj.EOF <> "False"
	$code = $RezObj(0) ;$code = $RezObj("code")
	$name = $RezObj(1) ;$name = $RezObj("name")
	  MsgBox(0,"","code: "&$code&" name: "&$name,2)
      $RezObj.MoveNext
WEnd
  
;закрываем соединение с sql  
$ConnObj.Close
 

XpycT

Скриптер
Сообщения
380
Репутация
132
Renz
Попробуй заменить
Код:
$code = $RezObj(0) ;$code = $RezObj("code")
    $name = $RezObj(1) ;$name = $RezObj("name")


вот на это
Код:
$code = $RezObj.Fields(0).Value ;$code = $RezObj("code")
    $name = $RezObj.Fields(1).Value ;$name = $RezObj("name")
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
36
во спс! работает
:beer:
под свои нужды использовал другой метод
Код:
$string = $RezObj.GetString(2,100000,";")
MsgBox(0,"",$string)

без цикла, возвращает результат в виде строки

лови + :ok:
 

XpycT

Скриптер
Сообщения
380
Репутация
132
Renz
Можно еще так сделать
Код:
#Include <Array.au3>

$array = $RezObj.GetRows()
_ArrayDisplay($array)


В этом случае результат возвращается в виде массива
 

mechlab

Новичок
Сообщения
19
Репутация
0
а у меня что то валится на
Код:
$ConnObj.Open("DRIVER={SQL Server};SERVER=" & $server & ";DATABASE=" & $db & ";uid=" & $username & ";pwd=" & $password & ";")


Erorr: The requested action with this objecct has filed.

В чем не прав?


Добавлено:
Сообщение автоматически объединено:

или какую #include опять не прикрутил?)))

или вообще обьясните тупорезу, желательно на пальцах... как подключится к sql 2000 )))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Возобновлю ка я тему, есть пару вопросов по ней.

Действительно ли нужно делать два объекта?
Т.е по сути достаточно только «ADODB.Connection», или я что то упускаю?

И ещё, получаю массив колонки из определённой таблицы базы:

Код:
$sDBHost = 'server.ru' ;Адрес сервера
$sDBName = 'database' ;Название Базы Данных
$sDBUser = 'user' ;Пользователь
$sDBPass = 'pass' ;Пароль

$oDBConn = ObjCreate('ADODB.Connection')

$sDBConnStr = ''
$sDBConnStr &= 'DRIVER={MySQL ODBC 5.1 Driver};SERVER=' & $sDBHost & ';DATABASE=' & $sDBName & ';'
$sDBConnStr &= 'UID=' & $sDBUser & ';PWD=' & $sDBPass

$oDBConn.Open($sDBConnStr)

If Not $oDBConn.State Then
	Exit -1 ;Can not Connect To Database!
EndIf

$sQuery = 'SELECT title FROM dle_post'
$oExec = $oDBConn.Execute($sQuery)
$aNames = $oExec.GetRows

$oDBConn.Close


Вопрос в том, сколько в данном варианте будет запросов в БД? Один?
Может можно как то упростить запрос, чтобы обрабатывалось быстрее?
 

XpycT

Скриптер
Сообщения
380
Репутация
132
CreatoR [?]
Действительно ли нужно делать два объекта?Т.е по сути достаточно только «ADODB.Connection», или я что то упускаю?
Достаточно и одного, в скрипте скорой всего оперчатка.

сколько в данном варианте будет запросов в БД?
Один

Можно попробовать так
Код:
$sQuery = 'SELECT title FROM dle_post'
$aNames = $oDBConn.Execute($sQuery).GetRows()


чтобы обрабатывалось быстрее
а сколько времени занимает обработка запроса???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
XpycT [?]
Достаточно и одного, в скрипте скорой всего оперчатка
Там есть объект «ADODB.Recordset», который позже присваивается объекту «ADODB.Connection» ($RezObj.ActiveConnection = $ConnObj), не думаю что это опечатка.

сколько времени занимает обработка запроса?
Минуту, может две. Размер базы ~400 mb.
Или это нормально при таком размере?
 

XpycT

Скриптер
Сообщения
380
Репутация
132
CreatoR [?]
не думаю что это опечатка
Да вы правы, я проглядел что там объект «ADODB.Recordset»

Если в скрипте не будет использоваться RecordCount (возвращает кол-во записей в обьекте после открытия запроса методом Open), то объект «ADODB.Recordset» можно и не создавать.

Код:
Global $oDBConn = ObjCreate("ADODB.Connection")
Global $oDBRSet = ObjCreate("ADODB.Recordset")

$oDBConn.CursorLocation = 3 ; 1: UseNone, 2: UserServer, 3: UseClient
$oDBRSet.ActiveConnection = $oDBConn
$oDBRSet.CursorType = 3 ; -1: Unspecified, 0: OpenForwardOnly, 1: OpenKeyse, 2: adOpenDynamic, 3: OpenStatic

$sQuery = 'SELECT title FROM dle_post'
$oDBRSet.Open($sQuery)

If $oDBRSet.RecordCount Then
    ConsoleWrite("Результат запроса: " & $oDBRSet.RecordCount & " записей" & @CR)
Else
    ConsoleWrite("Пустой результат запроса" & @CR)
EndIf
$oDBRSet.Close


Минуту, может две. Размер базы ~400 mb.
Или это нормально при таком размере?
Насчет времени, пока сказать не могу.
 

kristow13

Новичок
Сообщения
76
Репутация
0
Подскажите, использую тот же вариант подключения к базе...
Читаю все значения из базы... Хочу запустить в цикл на чтение полученного результата построчно, подскажите как правильно это написать?
т.е. как узнать количество полученных строк из запроса, чтоб столько раз сделать вывод данных. И как перемещаться по строкам из результата SQL запроса?

Мой текущий код:
Код:
;создание объекта для поключения к SQl
$ConnObj = ObjCreate("ADODB.Connection")
If $ConnObj = 0 Then
    MsgBox(0,"","Error create ADODB.Connection",2)
    Exit
EndIf
;создание объекта для получения данных из SQl
$RezObj = ObjCreate("ADODB.Recordset")
If $RezObj = 0 Then
    MsgBox(0,"","Error create ADODB.Connection",2)
    Exit
EndIf
;подключение к SQL
$ConnObj.Open("as1")
;обработать ошибку
If $ConnObj.State = 0 Then
    MsgBox(0,"","Error create Connect SQL",2)
    Exit
EndIf
;определить активное подключение
$RezObj.ActiveConnection = $ConnObj

   $QueryRez = $RezObj.Open("SELECT TOP 10 * FROM PC_Values where InrCnt > 1 order by InrCnt asc")
   $m_Dat = StringRegExpReplace( $RezObj.Fields(11).Value, "([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})", "\3.\2.\1 \4:\5" )
   $IntrCnt = $RezObj.Fields(0).Value
   $Serial = $RezObj.Fields(1).Value
   $Num = $RezObj.Fields(3).Value
   $G = $RezObj.Fields(14).Value
   $Vplus = $RezObj.Fields(12).Value
   $Vmin = $RezObj.Fields(13).Value
   ConsoleWrite("d1 ="&$m_Dat & @LF)
   ConsoleWrite("d2 ="&$G & @LF)
   ConsoleWrite("d3 ="&$Vplus & @LF)

   $QueryRez = $RezObj.Close()
 

SlavaS

Знающий
Сообщения
35
Репутация
5
kristow13 сказал(а):
как узнать количество полученных строк из запроса, чтоб столько раз сделать вывод данных. И как перемещаться по строкам из результата SQL запроса?
Как то так. Не проверял, возможно где-то ошибся...
Код:
Local $aData = 0
	; Получаем кол-во столбцов в таблице
	Dim $iColCount = 0
	$oColCountQuery = $RezObj.Execute("SHOW COLUMNS IN `PC_Values`")
	With $oColCountQuery
		While Not .EOF
			$iColCount += 1
			.MoveNext
		WEnd
	EndWith
	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iColCount = ' & $iColCount & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

 	; Получаем кол-во строк в таблице
	Dim $iRowCount = 0
	$oRowCountQuery = $RezObj.Execute("SELECT COUNT(*) FROM PC_Values where InrCnt > 1 order by InrCnt asc")
	With $oRowCountQuery
		While Not .EOF
			$iRowCount += $oRowCountQuery.Fields(0).Value
			.MoveNext
		WEnd
	EndWith
	ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iRowCount = ' & $iRowCount & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

	; Получаем значения из таблицы
	Dim $r = 1
	Dim $aData[$iRowCount + 1][$iColCount] = [[$iRowCount, ""]]; Создаем массив для хранения данных
	$sQuery = "SELECT * FROM PC_Values where InrCnt > 1 order by InrCnt asc"
	Dim $oGetRecords = $RezObj.Execute($sQuery)
	With $oGetRecords
		While Not .EOF
			For $c = 0 To $iColCount - 1
				 ReDim $aData[$r + 1][$iColCount]
				$aData[0][0] = $r
				$aData[$r][$c] = $oGetRecords.Fields($c).Value ; Заносим данные в массив
			Next
			$r += 1
			.MoveNext
		WEnd
	EndWith
	_ArrayDisplay($aData)
 

XpycT

Скриптер
Сообщения
380
Репутация
132
kristow13
Вот так
Код:
;создание объекта для поключения к SQl
$ConnObj = ObjCreate("ADODB.Connection")
If $ConnObj = 0 Then
    MsgBox(0,"","Error create ADODB.Connection",2)
    Exit
EndIf
;создание объекта для получения данных из SQl
$RezObj = ObjCreate("ADODB.Recordset")
If $RezObj = 0 Then
    MsgBox(0,"","Error create ADODB.Connection",2)
    Exit
EndIf
;подключение к SQL
$ConnObj.Open("as1")
;обработать ошибку
If $ConnObj.State = 0 Then
    MsgBox(0,"","Error create Connect SQL",2)
    Exit
EndIf
;определить активное подключение
$RezObj.ActiveConnection = $ConnObj

   $QueryRez = $RezObj.Open("SELECT TOP 10 * FROM PC_Values where InrCnt > 1 order by InrCnt asc")

   ConsoleWrite("Результат запроса: " & $RezObj.RecordCount & " записей" & @CR)

   ; Вариант 1
   While Not $RezObj.EOF
      $m_Dat = StringRegExpReplace( $RezObj.Fields(11).Value, "([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})", "\3.\2.\1 \4:\5" )
      $IntrCnt = $RezObj.Fields(0).Value
      $Serial = $RezObj.Fields(1).Value
      $Num = $RezObj.Fields(3).Value
      $G = $RezObj.Fields(14).Value
      $Vplus = $RezObj.Fields(12).Value
      $Vmin = $RezObj.Fields(13).Value
      ConsoleWrite("d1 ="&$m_Dat & @LF)
      ConsoleWrite("d2 ="&$G & @LF)
      ConsoleWrite("d3 ="&$Vplus & @LF)

      $RezObj.MoveNext ; Переход на следующую запись
   WEnd

   ; Вариант 2
   For $i = 0 To $RezObj.RecordCount - 1
      $m_Dat = StringRegExpReplace( $RezObj.Fields(11).Value, "([\d]{4})([\d]{2})([\d]{2})([\d]{2})([\d]{2})([\d]{2})", "\3.\2.\1 \4:\5" )
      $IntrCnt = $RezObj.Fields(0).Value
      $Serial = $RezObj.Fields(1).Value
      $Num = $RezObj.Fields(3).Value
      $G = $RezObj.Fields(14).Value
      $Vplus = $RezObj.Fields(12).Value
      $Vmin = $RezObj.Fields(13).Value
      ConsoleWrite("d1 ="&$m_Dat & @LF)
      ConsoleWrite("d2 ="&$G & @LF)
      ConsoleWrite("d3 ="&$Vplus & @LF)

      $RezObj.MoveNext ; Переход на следующую запись
   Next

   $QueryRez = $RezObj.Close()
 

Sergio

Новичок
Сообщения
25
Репутация
1
Еще раз подниму вопрос по данной теме. Структура запроса ясна. Но вот возникла необходимость получить доступ к базе на удаленном сервере, на порт 1521. Битый час бьюсь, не выходит ничего. Только The requested action with this object has failed.:
сам запрос как было в теме выше
Код:
$ConnObj.Open("DRIVER={SQL Server};SERVER=" & $server & ";DATABASE=" & $db & ";uid=" & $username & ";pwd=" & $password & ";")
 

Sergio

Новичок
Сообщения
25
Репутация
1
во всех примерах нужен уже установленный sql драйвер. А как сделать так, чтобы можно было драйвер держать в папке с автоит и использовать его на любом компьютере? Ведь в таком случае он не будет зарегистрирован в системе
 
Верх