Автор Тема: Работа с SQL через ADOBD(Получение данных из таблиц)  (Прочитано 13495 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Renz [?]

  • Осваивающий
  • **
  • Сообщений: 63
  • Репутация: 36
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Нижеприведенный код возвращает пустые значения, может кто-нибудь знает в чем причина? (в  Management Studio результат есть) Причем кол-во возвращаемых строк соответствует запросу.
Код: AutoIt [Выделить]
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


Русское сообщество AutoIt

Работа с SQL через ADOBD(Получение данных из таблиц)
« Отправлен: Февраль 13, 2011, 18:02:27 »

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 132
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Renz
Попробуй заменить
Код: AutoIt [Выделить]
    $code = $RezObj(0) ;$code = $RezObj("code")
    $name = $RezObj(1) ;$name = $RezObj("name")


вот на это
Код: AutoIt [Выделить]
    $code = $RezObj.Fields(0).Value ;$code = $RezObj("code")
    $name = $RezObj.Fields(1).Value ;$name = $RezObj("name")



Рожденный летать, висеть не может.

Джедаям запрещено участвовать в любых предприятиях, ставящих целью получение прибыли. Мы не можем извлекать выгоду из помощи, которую оказываем.

Оффлайн Renz [?]

  • Осваивающий
  • **
  • Сообщений: 63

  • Автор темы
  • Репутация: 36
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
во спс! работает
 :beer:
под свои нужды использовал другой метод
Код: AutoIt [Выделить]
$string = $RezObj.GetString(2,100000,";")
MsgBox(0,"",$string)

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

лови +  :ok:

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 132
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Renz
Можно еще так сделать
Код: AutoIt [Выделить]
#Include <Array.au3>

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


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

Русское сообщество AutoIt

Re: Работа с SQL через ADOBD(Получение данных из таблиц)
« Ответ #3 Отправлен: Февраль 15, 2011, 08:30:38 »

Оффлайн mechlab [?]

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


Erorr: The requested action with this objecct has filed.

В чем не прав?


Добавлено: Май 26, 2011, 16:45:27
или какую #include  опять не прикрутил?)))

или вообще обьясните тупорезу, желательно на пальцах... как подключится к sql 2000 )))
« Последнее редактирование: Май 26, 2011, 17:40:29 от mechlab, Причина: Объединение сообщений »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Возобновлю ка я тему, есть пару вопросов по ней.

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

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

Код: AutoIt [Выделить]
$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


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


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 132
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR  [?]
Цитировать
Действительно ли нужно делать два объекта?Т.е по сути достаточно только «ADODB.Connection», или я что то упускаю?
Достаточно и одного, в скрипте скорой всего оперчатка.

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

Можно попробовать так
Код: AutoIt [Выделить]
$sQuery = 'SELECT title FROM dle_post'
$aNames = $oDBConn.Execute($sQuery).GetRows()


Цитировать
чтобы обрабатывалось быстрее
а сколько времени занимает обработка запроса???
« Последнее редактирование: Ноябрь 20, 2012, 09:54:23 от XpycT »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7814
  • Репутация: 2282
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
XpycT  [?]
Цитировать
Достаточно и одного, в скрипте скорой всего оперчатка
Там есть объект «ADODB.Recordset», который позже присваивается объекту «ADODB.Connection» ($RezObj.ActiveConnection = $ConnObj), не думаю что это опечатка.

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

Русское сообщество AutoIt

Re: Работа с SQL через ADOBD(Получение данных из таблиц)
« Ответ #7 Отправлен: Ноябрь 20, 2012, 11:12:48 »

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 132
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR  [?]
Цитировать
не думаю что это опечатка
Да вы правы, я проглядел что там объект «ADODB.Recordset»

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

Код: AutoIt [Выделить]
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
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Подскажите, использую тот же вариант подключения к базе...
Читаю все значения из базы... Хочу запустить в цикл на чтение полученного результата построчно, подскажите как правильно это написать?
т.е. как узнать количество полученных строк из запроса, чтоб столько раз сделать вывод данных. И как перемещаться по строкам из результата SQL запроса?

Мой текущий код:
Код: AutoIt [Выделить]
;создание объекта для поключения к 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 [?]

  • Новичок
  • *
  • Сообщений: 34
  • Репутация: 5
    • Награды
  • Версия AutoIt: 3.3.12.0
как узнать количество полученных строк из запроса, чтоб столько раз сделать вывод данных. И как перемещаться по строкам из результата SQL запроса?

Как то так. Не проверял, возможно где-то ошибся...
(нажмите для показа/скрытия)

Оффлайн XpycT [?]

  • Скриптер
  • ****
  • Сообщений: 380
  • Репутация: 132
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
kristow13
Вот так
Код: AutoIt [Выделить]
;создание объекта для поключения к 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()


Русское сообщество AutoIt

Re: Работа с SQL через ADOBD(Получение данных из таблиц)
« Ответ #11 Отправлен: Сентябрь 29, 2014, 17:05:39 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
6048 Просмотров
Последний ответ Февраль 14, 2010, 17:59:12
от Garrett
22 Ответов
10981 Просмотров
Последний ответ Июль 16, 2011, 20:29:09
от madmasles
1 Ответов
3796 Просмотров
Последний ответ Март 02, 2012, 13:15:40
от ---Zak---
2 Ответов
4341 Просмотров
Последний ответ Октябрь 29, 2012, 13:07:03
от XpycT
0 Ответов
3643 Просмотров
Последний ответ Ноябрь 20, 2012, 00:31:01
от CreatoR
1 Ответов
1409 Просмотров
Последний ответ Май 20, 2015, 14:29:42
от alex33
6 Ответов
1227 Просмотров
Последний ответ Октябрь 28, 2015, 21:29:13
от alex33
3 Ответов
1537 Просмотров
Последний ответ Октябрь 30, 2015, 09:16:49
от Medic84
4 Ответов
1069 Просмотров
Последний ответ Май 11, 2016, 06:19:06
от ildar
2 Ответов
597 Просмотров
Последний ответ Август 21, 2017, 17:53:18
от Vitorio