Всё получилось, всё работает с запросами любой длины
Объявления
КодКод:(*------------------------------------------------------------------------------------------------------------------- Перед использованием нужно добавить в файл /etc/freetds.conf секции: //(в рамках примера в сервере collation = Cyrillic_General_CI_AS) // //[read] // host = <IP-адрес сервера> (например, host = 10.2.7.70) // port = 1433 // tds version = 7.3 // client charset = WINDOWS-1251 (кодировка выбирается в зависимости от конкретной задачи) // //[write] // host = <IP-адрес сервера> // port = 1433 // tds version = 7.3 // client charset = UTF-8 // //где: //host - IP-адрес сервера БД (например, host = 10.2.7.70) //client charset - используемая кодировка (выбирается в зависимости от настроек и содержимого БД) -------------------------------------------------------------------------------------------------------------------*) FUNCTION_BLOCK My_MsSQL_CLIENT_Write (*ФБ для использования MsSQL-клиента. Запись*) //Входы-Выходы VAR_IN_OUT xExecute: BOOL; //Запуск END_VAR //Входы VAR_INPUT sSqlStatement : WSTRING(65535); //Текст SQL-запроса sBD_Name : WSTRING(255); //Имя БД END_VAR //Выходы VAR_OUTPUT //Стандартные выходы xDone : BOOL; //Признак конца работы xBusy : BOOL; //Признак занятости xError : BOOL; //Признак ошибки END_VAR //Внутренние параметры VAR //R-триггер для фиксации запуска работы ФБ fbRiseEdge: R_TRIG; //Команда отправки на контроллерную консоль sCommand_Real: STRING(255); //Текст SQL-запроса в UTF8 sSqlStatement_UTF8: STRING(65535); //Имя БД в UTF8 sBD_Name_UTF8: STRING(255); //ФБ для отправки команд на контроллерную консоль fbSe4: CmpSysExec.SysExecute4; //Немножко магии для работы с файлом pResult : POINTER TO SysFile.SysTypes.RTS_IEC_RESULT; hFile : POINTER TO SysFile.SysTypes.RTS_IEC_HANDLE; END_VAR //Константы VAR CONSTANT //Команда отправки на контроллерную консоль sCommand: STRING(255) := 'bsqldb -S write -U sa -P Password -D #BD_NAME# -i /home/SQL.txt'; END_VAR
Код://Проверяем признак запуска fbRiseEdge(CLK := xExecute); xExecute := FALSE; //Если появился признак запуска... IF fbRiseEdge.Q THEN //Имя БД в правильной кодировке UTF8 STU.ConvertUTF16toUTF8(ADR(sBD_Name), ADR(sBD_Name_UTF8), SIZEOF(sBD_Name_UTF8), FALSE); sCommand_Real := OSU.ReplaceSubstring(sCommand, '#BD_NAME#', sBD_Name_UTF8); //Текст SQL-запроса в правильной кодировке UTF8 STU.ConvertUTF16toUTF8(ADR(sSqlStatement), ADR(sSqlStatement_UTF8), SIZEOF(sSqlStatement_UTF8), FALSE); //Пишем файл перед отправкой самого SQL-запроса hFile := SysFile.SysFileOpen('/home/SQL.txt', SysFile.ACCESS_MODE.AM_WRITE, pResult); SysFile.SysFileWrite(hFile, ADR(sSqlStatement_UTF8), TO_UDINT(StrLenA(ADR(sSqlStatement_UTF8))), pResult); //Пишем SysFile.SysFileClose(hFile); END_IF //Блок отправки команды через контроллерную консоль fbSe4 ( xExecute := fbRiseEdge.Q, //Запуск на исполнение по переднему фронту sCommand := sCommand_Real, //Команда Linux - например 'ls /' xAbort := FALSE, //Аварийный останов процесса sOutput => , //Массив строк для сохранения вывода процесса cntReadStr => , //Количество считанных строк вывода процесса xOverFlow => , //Признак переполнения массива sOutput xDone => xDone, //Признак завершённости процесса и/или того, что в данный момент не выполняется процесс Linux xAborted => , //Признак прерывания по пользовательской команде xError => xError, //Признак невозможности запуска из-за возникновекния ошибки xBusy => xBusy, //Процесс выполняется eErrorCode => //Код ошибки );




Ответить с цитированием
