Что нового

StdoutRead isql.exe (FB)

zumers

Новичок
Сообщения
8
Репутация
0
Добрый день!
Подскажите пожалуйста как довести до ума это:
Код:
$StdOut = ""
$FBIsql = "C:\Program Files (x86)\Firebird\FireBird_1_5\bin\isql.exe"
$IPServer = "localhost"
$PathDB = "C:\Program Files (x86)\Firebird\FireBird_1_5\examples\EMPLOYEE.FDB"
$UserName = "SYSDBA"
$PID = Run('"' & $FBIsql & '"', '', @SW_HIDE, 3)
StdinWrite($PID, 'connect "' & $IPServer & ':' & $PathDB & '" user ' & $UserName & ' password m;' & @CRLF & 'quit;' & @CRLF)
While 1
	$sRead = StdoutRead($PID)
	If @error Then ExitLoop
	$StdOut &= _OEM2ANSI($sRead)
WEnd
iF $StdOut = 'SQL> Database:  "' & $IPServer & ':' & $PathDB & '", User: ' & $UserName & @CRLF & 'SQL> ' Then
	Return True
Else
	MsgBox(8192 + 16, "Ошибка подключения к БД", 'Ответ сервера:' & @CRLF & $StdOut)
	Return False
EndIf

получается так: если соединение удачно - StdoutRead считывает ответ сервера ("Database: "localhost:C:\Program Files (x86)\Firebird\FireBird_1_5\examples\EMPLOYEE.FDB", User: SYSDBA"), а если нет - ответ "SQL> SQL> " и в панели output SciTe выдает ответ сервера:
>Running:(3.3.14.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\Users\zimovnov\AppData\Local\Temp\test.au3"
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
Use CONNECT or CREATE DATABASE to specify a database
Statement failed, SQLCODE = -902

Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
+>10:10:14 AutoIt3.exe ended.rc:0
+>10:10:14 AutoIt3Wrapper Finished.
Подскажите пожалуйста как его считать (StderrRead пустой).
Спасибо.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Run('"' & $FBIsql & '"', '', @SW_HIDE,8)
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
sngr сказал(а):
Код:
Run('"' & $FBIsql & '"', '', @SW_HIDE,8)
Спасибо, прогресс есть удалось считать только первую строку "Use CONNECT or CREATE DATABASE to specify a database", но дальше ни в какую
И был бы очень благодарен за объяснение или ссылочку про 8, а то по справке максимум только 7 (1 - $STDIN_CHILD, 2 - $STDOUT_CHILD, 4 - $STDERR_CHILD)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
7 = 1 + 2 + 4, они складываются, т.е 7 это - читать $STDIN_CHILD и $STDOUT_CHILD и $STDERR_CHILD


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

Нужно читать и StdoutRead и StderrRead, можно в разные переменные.
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
inververs сказал(а):
7 = 1 + 2 + 4, они складываются, т.е 7 это - читать $STDIN_CHILD и $STDOUT_CHILD и $STDERR_CHILD


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

Нужно читать и StdoutRead и StderrRead, можно в разные переменные.



Я про это и говорю что 7, а по рекомендации sngr нужно указывать 8. Проверил с 7 не считывает ни чего, а с 8 - первую строку.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Понял. Вот все флаги из справки:
Код:
[optional] Controls various options related to how the parent and child process interact.
    0x1 ($STDIN_CHILD) = Provide a handle to the child's STDIN stream
    0x2 ($STDOUT_CHILD) = Provide a handle to the child's STDOUT stream
    0x4 ($STDERR_CHILD) = Provide a handle to the child's STDERR stream
    0x8 ($STDERR_MERGED) = Provides the same handle for STDOUT and STDERR. Implies both $STDOUT_CHILD and $STDERR_CHILD.
    0x10 ($STDIO_INHERIT_PARENT) = Provide the child with the parent's STDIO streams. This flag can not be combined with any other STDIO flag. This flag is only useful when the parent is compiled as a Console application.
    0x10000 ($RUN_CREATE_NEW_CONSOLE) = The child console process should be created with it's own window instead of using the parent's window. This flag is only useful when the parent is compiled as a Console application.
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
В панели output SciTe выдает же ответ сервера:
>Running:(3.3.14.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\Users\zimovnov\AppData\Local\Temp\test.au3"
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
Use CONNECT or CREATE DATABASE to specify a database
Statement failed, SQLCODE = -902

Your user name and password are not defined. Ask your database administrator to set up a Firebird login.
+>10:10:14 AutoIt3.exe ended.rc:0
+>10:10:14 AutoIt3Wrapper Finished.
Как же получить остальную часть сообщения?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
У вас в коде нету consolewrite, как она вам в консоль scite пишет? Может это scite мешает и перехватывает? Запустите тогда без редактора, двойным нажатием. Поставьте в коде msgbox и туда выводите $StdOut
 

ildar

Осваивающий
Сообщения
252
Репутация
29
В свое время делал вывод команды dsget в массив
Код:
$iPID = Run(@ComSpec & ' /C dsget .....' , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    If Not $iPID Then
        MsgBox(16, 'Error', 'Error')
        Exit
    EndIf

    While 1
        $sRead &= StdoutRead($iPID)
        ;$sRead = _Encoding_866To1251($sRead)
        If @error Then ExitLoop
        Sleep(10)        
        $aRead = StringSplit($sRead,@CRLF,3)

    WEnd
Все прекрасно работало
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
inververs сказал(а):
У вас в коде нету consolewrite, как она вам в консоль scite пишет? Может это scite мешает и перехватывает? Запустите тогда без редактора, двойным нажатием. Поставьте в коде msgbox и туда выводите $StdOut
Я так полагаю из-за ключа /ErrorStdOut в: "C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "D:\...\AppData\Local\Temp\test.au3" /UserParams
Запуск exe'шника тоже ни чего не дал
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А так?
Код:
$StdOut  = Binary('')
While 1
    $StdOut &= StdoutRead($PID, False, True)
    If @error Then ExitLoop
WEnd
MsgBox(0, 1, BinaryToString($StdOut, 1))
MsgBox(0, 2, BinaryToString($StdOut, 2))
MsgBox(0, 3, BinaryToString($StdOut, 3))
MsgBox(0, 4, BinaryToString($StdOut, 4))

Или StderrRead
 
Автор
Z

zumers

Новичок
Сообщения
8
Репутация
0
ildar сказал(а):
В свое время делал вывод команды dsget в массив
Код:
$iPID = Run(@ComSpec & ' /C dsget .....' , '', @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    If Not $iPID Then
        MsgBox(16, 'Error', 'Error')
        Exit
    EndIf

    While 1
        $sRead &= StdoutRead($iPID)
        ;$sRead = _Encoding_866To1251($sRead)
        If @error Then ExitLoop
        Sleep(10)        
        $aRead = StringSplit($sRead,@CRLF,3)

    WEnd
Все прекрасно работало
Не помогло.


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

В общем строка "Use CONNECT or CREATE DATABASE to specify a database" попадает в консоль сразу после запуска "C:\Program Files (x86)\Firebird\FireBird_1_5\bin\isql.exe" следовательно с чего начал на том и остановился.
При
Код:
Run('"' & $FBIsql & '"', '', @SW_HIDE,3)

если соединение удачно - StdoutRead считывает ответ сервера ("Database: "localhost:C:\Program Files (x86)\Firebird\FireBird_1_5\examples\EMPLOYEE.FDB", User: SYSDBA"), а если соединение не удачно (например пароль не верный) - ответ считывается не полностью "SQL> SQL> " (при этом StderrRead пустой), но в панели output SciTe выдает правильный полный ответ сервера:
>Running:(3.3.14.2):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\Users\zimovnov\AppData\Local\Temp\test.au3"
--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop
Use CONNECT or CREATE DATABASE to specify a database
Statement failed, SQLCODE = -902

Your user name and password are not defined. Ask your database administrator to set up a Firebird login.

+>10:10:14 AutoIt3.exe ended.rc:0
+>10:10:14 AutoIt3Wrapper Finished.
, а при
Код:
Run('"' & $FBIsql & '"', '', @SW_HIDE,8)

в любом случае считывает только "Use CONNECT or CREATE DATABASE to specify a database"


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

Всем спасибо, разобрался (не только понедельник день тяжелый :stars:smile:!
Код:
$PID = Run('"' & $FBIsql & '"', '', @SW_HIDE, 7)
StdinWrite($PID, 'connect "' & $IPServer & ':' & $PathDB & '" user ' & $UserName & ' password ma;' & @CRLF & 'quit;' & @CRLF)
While 1
	$sRead = StderrRead($PID)
	If @error Then ExitLoop
	$StdErr &= _OEM2ANSI($sRead)
WEnd
 
Верх