Что нового

AutoIt + firebird

furia

Новичок
Сообщения
8
Репутация
0
Привет. читаю документацию не могу сообразить, как подключиться к firebird.

или как проверить, что подключение прошло успешно. Подключаюсь через ODBC driver


Код:
$Connect =  "DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; DBNAME=C:\COUPONS.FDB"
$query = "SELECT code FROM coupons ORDER BY code"
$adoCon = ObjCreate("ADODB.Connection")
$adoCon.Open($Connect)
$adoRs = ObjCreate("ADODB.Recordset")
$adoRs.Open($query , $adoCon)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
furia
http://msdn.microsoft.com/en-us/library/windows/desktop/ms675068%28v=vs.85%29.aspx

Оно? Сам никогда не сталкивался...
 
Автор
F

furia

Новичок
Сообщения
8
Репутация
0
как можно проверить подключение к базе ? подключился я через odbc или нет.

upd:

Нашел вот такой скрипт, пишу вот такой запрос "select code from coupons", возвращает пустой результат... мне кажется подключение к базе не проходит... ошибок тоже нет :(

Код:
#include <GUIConstants.au3>

Dim $result = 0;
Dim $status=" Disconnected "

$gui = GuiCreate("ODBC Query", 704, 488, 490,360 ,BitOR($WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS))
; --- Menu for future use ----
$filemenu = GUICtrlCreateMenu ("&File")
$fileitem = GUICtrlCreateMenuitem ("Open",$filemenu)
GUICtrlSetState(-1,$GUI_DEFBUTTON)
$helpmenu = GUICtrlCreateMenu ("?")
$saveitem = GUICtrlCreateMenuitem ("Save",$filemenu)
GUICtrlSetState(-1,$GUI_DISABLE)
$infoitem = GUICtrlCreateMenuitem ("Info",$helpmenu)
$exititem = GUICtrlCreateMenuitem ("Exit",$filemenu)
$recentfilesmenu = GUICtrlCreateMenu ("Recent Files",$filemenu,1)

$separator1 = GUICtrlCreateMenuitem ("",$filemenu,2); create a separator line
$viewmenu = GUICtrlCreateMenu("View",-1,1); is created before "?" menu
$viewstatusitem = GUICtrlCreateMenuitem ("Statusbar",$viewmenu)
GUICtrlSetState(-1,$GUI_CHECKED)
$l_statusbar = GUICtrlCreateLabel ($status,1,450,700,18,BitOr($SS_SIMPLE,$SS_SUNKEN))

$tab=GUICtrlCreateTab (1,1, 700,440)

$tab_conn=GUICtrlCreateTabitem (" Connection ")
;   GUICtrlSetState(-1,$GUI_SHOW)  ; will be display first
    $dsn_list = GUICtrlCreateListView("DSN|Type|Description", 20, 50, 550, 350)
    ODBCsources($dsn_list,"HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources" , "USER"  )
    ODBCsources($dsn_list,"HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources", "SYSTEM")
    $bt_conn   = GUICtrlCreateButton("Connect"   , 600,  70, 70, 20)
    $bt_discon = GUICtrlCreateButton("Disconnect", 600, 110, 70, 20)
    GUICtrlSetState($bt_discon, $GUI_DISABLE )

$tab_query=GUICtrlCreateTabitem (" Query ")
    $ed_qry = GUICtrlCreateEdit("", 20, 50, 550, 350)
    $bt_run = GUICtrlCreateButton("Run"  , 600,  70, 70, 20)
    $bt_clr = GUICtrlCreateButton("Clear", 600, 110, 70, 20)

$tab_result=GUICtrlCreateTabitem (" Result ")
    $result = GUICtrlCreateListView("Result", 20, 50, 550, 350)
    $bt_new = GUICtrlCreateButton("New query"  , 600,  70, 80, 20)
GUICtrlCreateTabitem ("")

GUISetState ()

While 1
    $msg = GUIGetMsg()
    if $msg <> 0 then
        Select
        Case $msg = $GUI_EVENT_CLOSE
            ExitLoop
          Case $msg = $fileitem
            $file = FileOpenDialog("Choose file...",@TempDir,"SQLfiles (*.sql)|All (*.*)")
            If @error <> 1 Then GUICtrlCreateMenuitem ($file,$recentfilesmenu)
        Case $msg = $viewstatusitem
            If BitAnd(GUICtrlRead($viewstatusitem),$GUI_CHECKED) = $GUI_CHECKED Then
                GUICtrlSetState($viewstatusitem,$GUI_UNCHECKED)
                GUICtrlSetState($l_statusbar,$GUI_HIDE)
            Else
                GUICtrlSetState($viewstatusitem,$GUI_CHECKED)
                GUICtrlSetState($l_statusbar,$GUI_SHOW)
            EndIf
        Case $msg = $infoitem
            Msgbox(0,"Info","ODBC Query version 0.1")
        Case $msg = $bt_conn
            $dsnarray = StringSplit((GUICtrlRead(GUICtrlRead($dsn_list), 2)), "|")
            if $dsnarray[1] <> "" Then
                $dsn = "DSN=" & $dsnarray [1]
                $adoCon = ObjCreate ("ADODB.Connection")
                $adoCon.Open ($DSN)
                GUICtrlSetState($bt_conn  , $GUI_DISABLE )
                GUICtrlSetState($bt_discon, $GUI_ENABLE  )
                GUICtrlSetData($l_statusbar,"Connected to "&$dsn)
                GUICtrlSetState($tab_query, $GUI_SHOW )     ; show query tab
                GUICtrlSetState($ed_qry, $GUI_FOCUS )       ; select edit field
            Endif
        Case $msg = $bt_discon
            $adoCon.Close
            GUICtrlSetState($bt_conn  , $GUI_ENABLE )
            GUICtrlSetState($bt_discon, $GUI_DISABLE  )
            GUICtrlSetData($l_statusbar,"Disconnected")
        Case $msg = $bt_run
            GUICtrlSetState($tab_result, $GUI_SHOW )        ; show result tab
            GuiSwitch($gui,$tab_result)
            GuiCtrlDelete($result)
            ODBCquery(GUICtrlRead($ed_qry))
            GUICtrlCreateTabItem("")
            GUICtrlSetState($result,$GUI_FOCUS)
            GUISetState (@SW_SHOW,$gui)
        Case $msg = $bt_clr
            GUICtrlSetData($ed_qry, "" )                ; clear data
            GUICtrlSetState($result,$GUI_FOCUS)
        Case $msg = $bt_new
            GUICtrlSetState($tab_query, $GUI_SHOW )     ; show query tab
            GUICtrlSetState($ed_qry, $GUI_FOCUS )       ; select edit field
        Case $msg = $tab_query
            GUICtrlSetState($tab_query, $GUI_SHOW )     ; show query tab
            GUICtrlSetState($ed_qry, $GUI_FOCUS )       ; select edit field
      EndSelect
    EndIf
WEnd
GUIDelete()
Exit

Func ODBCsources($h_controlID, $s_RegEntry, $s_Type)
    Local $s_List, $i_dsncount, $s_VarNm, $s_Value
    $i_dsncount = 1
    $s_VarNm = RegEnumVal($s_RegEntry,  $i_dsncount)
    $s_Value = RegRead($s_RegEntry, $s_Varnm)
    While $s_VarNm <> ""
        $s_VarNm = RegEnumVal($s_RegEntry,  $i_dsncount)
        $s_Value = RegRead($s_RegEntry, $s_Varnm)
        If $s_Varnm <> "" Then
            GUICtrlCreateListViewItem($s_VarNm & "|" & $s_Type & "|" & $s_Value, $h_controlID)
            $i_dsncount += 1
        EndIf
    Wend
EndFunc

Func ODBCquery($s_Qry)
    $adoSQL = $s_Qry
    $adoRs = ObjCreate ("ADODB.Recordset")
    $adoRs.CursorType = 2
    $adoRs.LockType = 3
    $adoRs.Open ($adoSql, $adoCon)
    $cmboVal = ""

    With $adoRs
      $cols=""                              ; Get information about Fields collection
      For $n = 0 To .Fields.Count - 1
         $cols = $cols & .Fields ($n).Name & "|"
      Next
      $result = GUICtrlCreateListView($cols, 20, 50, 550, 350, $LVS_REPORT, $LVS_EX_GRIDLINES)

      If .RecordCount Then
         $count = 0
         While Not .EOF
            $count = $count + 1
            For $colum = 0 To .Fields.Count - 1
               $cmboVal = $cmboVal & "" & .Fields ($colum).Value & "|"
            Next
            $cmboVal = StringTrimRight($cmboVal, 1) & @CR
            GUICtrlCreateListViewItem($cmboVal, $result)
            $cmboVal = ""
            .MoveNext
         WEnd
      EndIf
   EndWith
EndFunc

Upd2:
Получается подключение приходит.
запрос с представлениями, получаю имя таблиц. А как получить строки ?

Код:
select a.RDB$RELATION_NAME,a.RDB$FIELD_ID,a.RDB$OWNER_NAME, Max(b.RDB$FORMAT)
  from RDB$RELATIONS a, RDB$FORMATS b
  where a.RDB$RELATION_ID = b.RDB$RELATION_ID and a.RDB$SYSTEM_FLAG = 0
        and (a.rdb$view_source is null)
  group by a.RDB$RELATION_NAME, a.RDB$FIELD_ID, a.RDB$OWNER_NAME
  order by 4 desc;
 
Автор
F

furia

Новичок
Сообщения
8
Репутация
0
решено, все действия были проделаны правильно.

проблема оказалась в кавычках.
вместо
Код:
"Select * From coupons"
надо было
Код:
"Select * From ""Coupons"""

З.Ы. Проверить подключение ADO можно следующее
Код:
$adoCon = ObjCreate("ADODB.Connection")
   $adoCon.Open($Connect)
   if ($adoCon.State == 1) Then
	  GUICtrlSetData($StatusBar, 'подключена база ' & $fDataBase)
   Else
	  GUICtrlSetData($StatusBar, 'ошибка подключения')
   EndIf
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
furia [?]
З.Ы. Проверить подключение ADO можно следующее
На сколько я знаю, такая проверка проходит только в случае первого соединения к бд. Если же база отключит клиента принудительно, например по тайм ауту, то $adoCon.State все равно будет равно 1, и клиент (т.е ваша программа) никак не узнает что произошел обрыв, т.к нету метода ping.
Лучше ищите на офф сайте библиотеку которая работает через dll и без ODBC
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
furia

Рекомендую, чтобы в дальнейшем не путаться с этими кавычками, использовать для определения начала и конца переменной другие кавычки (' или " или `):

Код:
$query = 'SELECT * FROM "coupons"'

Код:
$query = 'SELECT "code" FROM "coupons" ORDER BY "code"'


PS: т.е. если используешь " кавычки внутри строки, то начинать присвоение переменной с '

PSS: Использование библиотеки ADO
 
Автор
F

furia

Новичок
Сообщения
8
Репутация
0
спасибо за помощь. разобрался. даже работает, но очень медленно :(

может кто подскажет, как можно оптимизировать ?

Код:
Func LoadFile()

   Local $count = 0

   $FileLoad = FileOpen($PathLoadName & $FileLoadName, 0)
   if $FileLoad = -1 Then
	  MsgBox(4096, "Ошибка", "Невозможно открыть файл или отсутвует.")
   EndIf

   $adoRs = ObjCreate("ADODB.Recordset")
   $adoSQL = $query
   $adoRs.CursorType = 2
   $adoRs.LockType = 3
   $CountLines = _FileCountLines($PathLoadName & $FileLoadName)
   For $i= 0 To $CountLines Step + 1
	  $count = $count + 1
	  $sLine = FileReadLine($FileLoad)
	  If @error = -1 Then ExitLoop
          $query = 'UPDATE "Coupons" SET "Active" = 0 WHERE "Code" =' & $sLine	  
	  $adoSQL = $query
          $adoRs.Open($adoSQL, $adoCon)

	  GUICtrlSetData($sCountLines, 'Количество строк в файле: ' & $CountLines)
	  GUICtrlSetData($StatusBar, 'Загружается: ' & ' строка: ' & $count & ' номер: ' & $sLine)

	  _GUICtrlListView_AddItem($iListView, $count, 0)
	  _GUICtrlListView_AddSubItem($iListView, $i, $sLine, 1)
   Next

   GUICtrlSetData($StatusBar, 'Загруженно!')
   FileClose($FileLoad)
   $adoCon.Close

EndFunc

База размер 1,2гб. количество элементов в ней 10,5млн. Select работает нормально, терпимо еще. а вот UPDATE кошмар медленно :(
или может ADO сама по себе очень медленная штука ?


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

Возможно ли это из за того, что висит индекс на поле "Active" ?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
я могу начать ;D

furia [?]
$FileLoad = FileOpen($PathLoadName & $FileLoadName, 0)
if $FileLoad = -1 Then
MsgBox(4096, "Ошибка", "Невозможно открыть файл или отсутвует.")
EndIf

Что тут не так: стоите вы на 18 этаже, нажимаете кнопку лифта, открывается дверь. Появляется надпись "Ошибка"! Лифт не приехал!. Вы говорите громкно ХОРОШО, и заходите внутрь.
 
Автор
F

furia

Новичок
Сообщения
8
Репутация
0
ну такие бантики можно и потом исправить :smile:
с ними проблем нет.

сам запрос очень долго отрабатывает, :(

Код:
$query = 'UPDATE "Coupons" SET "Active" = 0 WHERE "Code" =' & $sLine    
$adoSQL = $query
$adoRs.Open($adoSQL, $adoCon)
 
Верх