diff --git a/src/addins/mssql/dependencies.log b/src/addins/mssql/dependencies.log index 78b41dd2c1..d9973e5815 100644 --- a/src/addins/mssql/dependencies.log +++ b/src/addins/mssql/dependencies.log @@ -1,13 +1,13 @@ "MAIN ---" - linux-vdso.so.1 (0x00007ffd92bc9000) - libssl.so.3 => /lib64/libssl.so.3 (0x00007741c0c00000) - libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007741c0400000) - libm.so.6 => /lib64/libm.so.6 (0x00007741c0000000) - libpthread.so.0 => /lib64/libpthread.so.0 (0x00007741bfc00000) - libc.so.6 => /lib64/libc.so.6 (0x00007741bf800000) - libdl.so.2 => /lib64/libdl.so.2 (0x00007741bf400000) - /lib64/ld-linux-x86-64.so.2 (0x00007741c1200000) - libz.so.1 => /lib64/libz.so.1 (0x00007741bf000000) + linux-vdso.so.1 (0x00007ffdc9db0000) + libssl.so.3 => /lib64/libssl.so.3 (0x00007a6a61c00000) + libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007a6a61400000) + libm.so.6 => /lib64/libm.so.6 (0x00007a6a61000000) + libpthread.so.0 => /lib64/libpthread.so.0 (0x00007a6a60c00000) + libc.so.6 => /lib64/libc.so.6 (0x00007a6a60800000) + libdl.so.2 => /lib64/libdl.so.2 (0x00007a6a60400000) + /lib64/ld-linux-x86-64.so.2 (0x00007a6a62200000) + libz.so.1 => /lib64/libz.so.1 (0x00007a6a60000000) GLIBC_2.2.5 GLIBC_2.12 GLIBC_2.3 diff --git a/src/addins/mssql/src/component/backend.rs b/src/addins/mssql/src/component/backend.rs index d9edc3f9ba..db48a937ff 100644 --- a/src/addins/mssql/src/component/backend.rs +++ b/src/addins/mssql/src/component/backend.rs @@ -169,8 +169,11 @@ impl MSSQLBackend { None => return Self::format_json_error("Parameters must be a JSON array"), }; - if query.trim_start().to_uppercase().starts_with("SELECT") || force_result { - match client.simple_query(query).await { + let normalized_query = query.trim_start().to_uppercase(); + let params_refs: Vec<&dyn ToSql> = params_array.iter().map(|b| b.as_ref()).collect(); + + if normalized_query.starts_with("SELECT") || force_result { + match client.query(query, ¶ms_refs).await { Ok(stream) => { let rows = match stream.into_results().await { Ok(rows) => rows.into_iter().flatten().collect(), @@ -180,8 +183,18 @@ impl MSSQLBackend { }, Err(e) => Self::format_json_error(&e.to_string()), } + } else if normalized_query == "BEGIN TRAN" + || normalized_query == "COMMIT;" + || normalized_query == "ROLLBACK;" + || normalized_query == "BEGIN TRANSACTION"{ + + match client.simple_query(query).await { + Ok(_) => json!({"result": true}).to_string(), + Err(e) => Self::format_json_error(&e.to_string()), + } + } else { - let params_refs: Vec<&dyn ToSql> = params_array.iter().map(|b| b.as_ref()).collect(); + match client.execute(query, ¶ms_refs).await { Ok(_) => json!({"result": true}).to_string(), Err(e) => Self::format_json_error(&e.to_string()), @@ -215,43 +228,30 @@ impl MSSQLBackend { fn from_sql_to_json(row: &Row, index: usize, column: &Column) -> Value { match column.column_type() { ColumnType::Null => Value::Null, - ColumnType::Bit => { - row.try_get::(index) - .ok() - .flatten() - .map(Value::Bool) - .unwrap_or(Value::Null) + ColumnType::Bit | ColumnType::Bitn => { + match try_get_any_bit(row, index){ + Some(i) => Value::Number(i.into()), + None => Value::Null, + } }, - ColumnType::Bitn => { - row.try_get::(index) - .ok() - .flatten() - .and_then(|n| Number::from_u128(n as u128)) - .map(Value::Number) - .unwrap_or(Value::Null) - } ColumnType::Int1 | ColumnType::Int2 | ColumnType::Int4 | ColumnType::Int8 | ColumnType::Intn => { - row.try_get::(index) - .ok() - .flatten() - .and_then(|n| Number::from_i128(n as i128)) - .map(Value::Number) - .unwrap_or(Value::Null) + match try_get_any_int(row, index){ + Some(i) => Value::Number(i.into()), + None => Value::Null, + } }, ColumnType::Float4 | ColumnType::Float8 | ColumnType::Floatn | ColumnType::Money | ColumnType::Money4 => { - row.try_get::(index) - .ok() - .flatten() - .and_then(|f| Number::from_f64(f)) - .map(Value::Number) - .unwrap_or(Value::Null) + match try_get_any_float(row, index) { + Some(i) => Number::from_f64(i).map(Value::Number).unwrap_or(Value::Null), + None => Value::Null, + } }, ColumnType::Decimaln | ColumnType::Numericn => { row.try_get::(index) .ok() .flatten() .and_then(|f| Number::from_f64(f64::try_from(f).unwrap_or(0.0))) - .map(Value::Number) + .map(|num| Value::Number(num)) .unwrap_or(Value::Null) }, ColumnType::Daten => { @@ -295,6 +295,13 @@ impl MSSQLBackend { .flatten() .map(|u| Value::String(u.to_string())) .unwrap_or(Value::Null) + }, + ColumnType::Xml => { + row.try_get::<&XmlData, _>(index) + .ok() + .flatten() + .map(|d| Value::String(d.clone().into_string())) + .unwrap_or(Value::Null) } _ => { row.try_get::<&str, _>(index) @@ -452,6 +459,30 @@ impl MSSQLBackend { } } +fn try_get_any_int(row: &Row, index: usize) -> Option { + row.try_get::(index) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x))) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x as i64))) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x as i64))) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x as i64))) + .ok() + .flatten() +} + +fn try_get_any_bit(row: &Row, index: usize) -> Option { + row.try_get::(index) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x as u8))) + .ok() + .flatten() +} + +fn try_get_any_float(row: &Row, index: usize) -> Option { + row.try_get::(index) + .or_else(|_| row.try_get::(index).map(|v| v.map(|x| x as f64))) + .ok() + .flatten() +} + impl Drop for MSSQLBackend { fn drop(&mut self) { diff --git a/src/en/OInt/addins/OPI_MSSQL.zip b/src/en/OInt/addins/OPI_MSSQL.zip index a01da74a4b..81619ee51b 100644 Binary files a/src/en/OInt/addins/OPI_MSSQL.zip and b/src/en/OInt/addins/OPI_MSSQL.zip differ diff --git a/src/en/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin b/src/en/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin index a01da74a4b..81619ee51b 100644 Binary files a/src/en/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin and b/src/en/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin differ diff --git a/src/ru/OInt/addins/OPI_MSSQL.zip b/src/ru/OInt/addins/OPI_MSSQL.zip index a01da74a4b..81619ee51b 100644 Binary files a/src/ru/OInt/addins/OPI_MSSQL.zip and b/src/ru/OInt/addins/OPI_MSSQL.zip differ diff --git a/src/ru/OPI/src/CommonModules/OPI_MSSQL/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_MSSQL/Module.bsl index b6bdd073ed..5f3b83d4ed 100644 --- a/src/ru/OPI/src/CommonModules/OPI_MSSQL/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_MSSQL/Module.bsl @@ -559,6 +559,7 @@ Особенности.Вставить("МаркерПараметров" , "@P"); Особенности.Вставить("СУБД" , "mssql"); Особенности.Вставить("ПолеКолонки" , "COLUMN_NAME"); + Особенности.Вставить("НачалоТранзакции" , "BEGIN TRAN"); Возврат Особенности; diff --git a/src/ru/OPI/src/CommonModules/OPI_MySQL/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_MySQL/Module.bsl index 188b9869c2..4623124181 100644 --- a/src/ru/OPI/src/CommonModules/OPI_MySQL/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_MySQL/Module.bsl @@ -530,6 +530,7 @@ Особенности.Вставить("МаркерПараметров" , "?"); Особенности.Вставить("СУБД" , "mysql"); Особенности.Вставить("ПолеКолонки" , "COLUMN_NAME"); + Особенности.Вставить("НачалоТранзакции" , "BEGIN"); Возврат Особенности; diff --git a/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl index 65a985d333..829f013662 100644 --- a/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_PostgreSQL/Module.bsl @@ -559,6 +559,7 @@ Особенности.Вставить("МаркерПараметров" , "$"); Особенности.Вставить("СУБД" , "postgres"); Особенности.Вставить("ПолеКолонки" , "column_name"); + Особенности.Вставить("НачалоТранзакции" , "BEGIN"); Возврат Особенности; diff --git a/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl index 6b74a5bf88..6c8e4a3130 100644 --- a/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_SQLite/Module.bsl @@ -463,6 +463,7 @@ Особенности.Вставить("МаркерПараметров" , "?"); Особенности.Вставить("СУБД" , "sqlite"); Особенности.Вставить("ПолеКолонки" , "name"); + Особенности.Вставить("НачалоТранзакции" , "BEGIN"); Возврат Особенности; diff --git a/src/ru/OPI/src/CommonModules/OPI_ЗапросыSQL/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ЗапросыSQL/Module.bsl index be2c9fa7c0..59f8f22bc4 100644 --- a/src/ru/OPI/src/CommonModules/OPI_ЗапросыSQL/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_ЗапросыSQL/Module.bsl @@ -1,4 +1,4 @@ -// OneScript: ./OInt/tools/Modules/OPI_ЗапросыSQL.os +// OneScript: ./OInt/tools/Modules/OPI_ЗапросыSQL.os // MIT License @@ -702,13 +702,31 @@ Фильтры = Схема["filter"]; Сортировка = Схема["order"]; Количество = Схема["limit"]; + СУБД = Схема["dbms"]; - ШаблонSQL = "SELECT %1 FROM %2 - |%3;"; + ШаблонSQL = "SELECT %1 %2 FROM %3 + |%4 + |%5 + |%6;"; - БлокНастроек = СформироватьТекстНастроекSelect(Фильтры, Сортировка, Количество); + ТекстФильтра = СформироватьТекстФильтра(Фильтры); + ТекстСортировки = СформироватьТекстСортировки(Сортировка); + + Если СУБД = "mssql" Тогда + ТекстТопа = СформироватьТекстТопа(Количество); + ТекстЛимита = ""; + Иначе + ТекстТопа = ""; + ТекстЛимита = СформироватьТекстКоличества(Количество); + КонецЕсли; - ТекстSQL = СтрШаблон(ШаблонSQL, СтрСоединить(Поля, ", "), Таблица, БлокНастроек); + ТекстSQL = СтрШаблон(ШаблонSQL + , ТекстТопа + , СтрСоединить(Поля, ", ") + , Таблица + , ТекстФильтра + , ТекстСортировки + , ТекстЛимита); Возврат ТекстSQL; @@ -1017,7 +1035,8 @@ Если Транзакция Тогда - Начало = Модуль.ВыполнитьЗапросSQL("BEGIN", , , Соединение); + Текст = Модуль.ПолучитьОсобенности()["НачалоТранзакции"]; + Начало = Модуль.ВыполнитьЗапросSQL(Текст, , , Соединение); Если Не Начало["result"] Тогда Возврат Начало; @@ -1082,22 +1101,6 @@ КонецФункции -Функция СформироватьТекстНастроекSelect(Знач Фильтры, Знач Сортировка, Знач Количество) - - ШаблонБлока = "%1 - |%2 - |%3"; - - ТекстФильтра = СформироватьТекстФильтра(Фильтры); - ТекстСортировки = СформироватьТекстСортировки(Сортировка); - ТекстКоличества = СформироватьТекстКоличества(Количество); - - ТекстБлока = СтрШаблон(ШаблонБлока, ТекстФильтра, ТекстСортировки, ТекстКоличества); - - Возврат ТекстБлока; - -КонецФункции - Функция СформироватьТекстФильтра(Знач Фильтры) Если Не ЗначениеЗаполнено(Фильтры) Тогда @@ -1173,6 +1176,19 @@ КонецФункции +Функция СформироватьТекстТопа(Знач Количество) + + Если Не ЗначениеЗаполнено(Количество) Тогда + Возврат ""; + КонецЕсли; + + ТекстКоличества = "TOP %1"; + ТекстКоличества = СтрШаблон(ТекстКоличества, OPI_Инструменты.ЧислоВСтроку(Количество)); + + Возврат ТекстКоличества; + +КонецФункции + Процедура РазделитьКоллекциюДанных(Знач Запись, МассивПолей, МассивЗначений) ТекстОшибки = "Некорректный набор данных для обновления"; diff --git a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl index 62366d6eb3..529458e8c1 100644 --- a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -1,4 +1,4 @@ -// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os +// OneScript: ./OInt/tests/Modules/internal/OPI_Тесты.os // MIT License @@ -2838,6 +2838,11 @@ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("PG_IP" , ПараметрыТеста); OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("PG_Password", ПараметрыТеста); OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста); + + MSSQL_СоздатьБазуДанных(ПараметрыТеста); + MSSQL_СоздатьТаблицу(ПараметрыТеста); + MSSQL_ДобавитьЗаписи(ПараметрыТеста); + MSSQL_ПолучитьЗаписи(ПараметрыТеста); КонецПроцедуры @@ -19468,7 +19473,7 @@ Результат = OPI_MySQL.СоздатьБазуДанных(База, Подключение); - OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "PostgreSQL"); + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "MySQL"); OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат); OPI_MySQL.ЗакрытьСоединение(Подключение); @@ -23987,6 +23992,247 @@ КонецПроцедуры +Процедура MSSQL_СоздатьБазуДанных(ПараметрыФункции) + + Адрес = ПараметрыФункции["PG_IP"]; + Логин = "SA"; + Пароль = ПараметрыФункции["PG_Password"]; + + НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина); + СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль); + + База = "testbase1"; + + Удаление = OPI_MSSQL.УдалитьБазуДанных(База, СтрокаПодключения, НастройкиTLS); // SKIP + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Удаление, "СоздатьБазуДанных (удаление)", "MSSQL"); // SKIP + + // При использовании строки подключения инициализируется новое соединение, + // которое будет закрыто после выполнения функции. + // В случае выполнения нескольких операций желательно использовать одно соединение, + // заранее созданное функцией ОткрытьСоединение() + Результат = OPI_MSSQL.СоздатьБазуДанных(База, СтрокаПодключения, НастройкиTLS); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + + База = "testbase2"; + OPI_MSSQL.УдалитьБазуДанных(База, СтрокаПодключения, НастройкиTLS); + + Подключение = OPI_MSSQL.ОткрытьСоединение(СтрокаПодключения, НастройкиTLS); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Подключение, "СоздатьБазуДанных (открытие)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_Компонента(Подключение, "AddIn.OPI_MSSQL.Main"); + + Результат = OPI_MSSQL.СоздатьБазуДанных(База, Подключение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (подключение)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + + Результат = OPI_MSSQL.СоздатьБазуДанных(База, Подключение); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных (существующая)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат); + + OPI_MSSQL.ЗакрытьСоединение(Подключение); + +КонецПроцедуры + +Процедура MSSQL_СоздатьТаблицу(ПараметрыФункции) + + Адрес = ПараметрыФункции["PG_IP"]; + Логин = "SA"; + Пароль = ПараметрыФункции["PG_Password"]; + База = "testbase1"; + + НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина); + СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль); + + Таблица = "testtable"; + + СтруктураКолонок = Новый Структура; + СтруктураКолонок.Вставить("tinyint_field" , "tinyint"); + СтруктураКолонок.Вставить("smallint_field" , "smallint"); + СтруктураКолонок.Вставить("int_field" , "int"); + СтруктураКолонок.Вставить("bigint_field" , "bigint"); + СтруктураКолонок.Вставить("float24_field" , "float(24)"); + СтруктураКолонок.Вставить("float53_field" , "float(53)"); + СтруктураКолонок.Вставить("bit_field" , "bit"); + СтруктураКолонок.Вставить("nvarchar_field" , "nvarchar(4000)"); + СтруктураКолонок.Вставить("varbinary_field", "varbinary(max)"); + СтруктураКолонок.Вставить("uid_field" , "uniqueidentifier"); + СтруктураКолонок.Вставить("numeric_field" , "numeric(5,3)"); // Или decimal + СтруктураКолонок.Вставить("xml_field" , "xml"); + СтруктураКолонок.Вставить("date_field" , "date"); + СтруктураКолонок.Вставить("time_field" , "time"); + СтруктураКолонок.Вставить("dto_field" , "datetimeoffset"); + СтруктураКолонок.Вставить("datetime_field" , "datetime"); + + // При использовании строки подключения инициализируется новое соединение, + // которое будет закрыто после выполнения функции. + // В случае выполнения нескольких операций желательно использовать одно соединение, + // заранее созданное функцией ОткрытьСоединение() + Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + + Таблица = "АБВ ГДЕ"; + + Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу (ошибка имени)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат); + + Таблица = "somename"; + СтруктураКолонок.Вставить("wtf_field", "WTF"); + + Результат = OPI_MSSQL.СоздатьТаблицу(Таблица, СтруктураКолонок, СтрокаПодключения, НастройкиTLS); + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу (ошибка типа)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат); + +КонецПроцедуры + +Процедура MSSQL_ДобавитьЗаписи(ПараметрыФункции) + + Адрес = ПараметрыФункции["PG_IP"]; + Логин = "SA"; + Пароль = ПараметрыФункции["PG_Password"]; + База = "testbase1"; + + НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина); + СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль); + + Таблица = "testtable"; + МассивЗаписей = Новый Массив; + + Картинка = ПараметрыФункции["Picture"]; + OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка); // Картинка - Тип: ДвоичныеДанные + + XML = " + | + | + | Пример + | 123 + | + | + | Тест + | 456 + | + |"; + + ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату(); + ТекущаяДатаЧП = OPI_Инструменты.ДатаRFC3339(ТекущаяДата, "+05:00"); + + СтруктураЗаписи = Новый Структура; + СтруктураЗаписи.Вставить("tinyint_field" , Новый Структура("TINYINT", 5)); + СтруктураЗаписи.Вставить("smallint_field" , Новый Структура("SMALLINT", 2000)); + СтруктураЗаписи.Вставить("int_field" , Новый Структура("INT", 200000)); + СтруктураЗаписи.Вставить("bigint_field" , Новый Структура("BIGINT", 20000000000)); + СтруктураЗаписи.Вставить("float24_field" , Новый Структура("FLOAT24", 10.1234567)); + СтруктураЗаписи.Вставить("float53_field" , Новый Структура("FLOAT53", 10.123456789123456)); + СтруктураЗаписи.Вставить("bit_field" , Новый Структура("BIT", Истина)); + СтруктураЗаписи.Вставить("nvarchar_field" , Новый Структура("NVARCHAR", "Some text")); + СтруктураЗаписи.Вставить("varbinary_field", Новый Структура("BYTES", Картинка)); + СтруктураЗаписи.Вставить("uid_field" , Новый Структура("UUID", Новый УникальныйИдентификатор)); + СтруктураЗаписи.Вставить("numeric_field" , Новый Структура("NUMERIC", 5.333)); + СтруктураЗаписи.Вставить("xml_field" , Новый Структура("XML", XML)); + СтруктураЗаписи.Вставить("date_field" , Новый Структура("DATE", ТекущаяДата)); + СтруктураЗаписи.Вставить("time_field" , Новый Структура("TIME", ТекущаяДата)); + СтруктураЗаписи.Вставить("dto_field" , Новый Структура("DATETIMEOFFSET", ТекущаяДатаЧП)); + СтруктураЗаписи.Вставить("datetime_field" , Новый Структура("DATETIME", ТекущаяДата)); + + МассивЗаписей.Добавить(СтруктураЗаписи); + + // При использовании строки подключения инициализируется новое соединение, + // которое будет закрыто после выполнения функции. + // В случае выполнения нескольких операций желательно использовать одно соединение, + // заранее созданное функцией ОткрытьСоединение() + Результат = OPI_MSSQL.ДобавитьЗаписи(Таблица, МассивЗаписей, Истина, СтрокаПодключения, НастройкиTLS); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЗаписи", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + + +КонецПроцедуры + +Процедура MSSQL_ПолучитьЗаписи(ПараметрыФункции) + + Адрес = ПараметрыФункции["PG_IP"]; + Логин = "SA"; + Пароль = ПараметрыФункции["PG_Password"]; + База = "testbase1"; + + НастройкиTLS = OPI_MSSQL.ПолучитьНастройкиTls(Истина); + СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль); + + // Все записи без отборов + + Таблица = "testtable"; + + // При использовании строки подключения инициализируется новое соединение, + // которое будет закрыто после выполнения функции. + // В случае выполнения нескольких операций желательно использовать одно соединение, + // заранее созданное функцией ОткрытьСоединение() + Результат = OPI_MSSQL.ПолучитьЗаписи(Таблица, , , , , СтрокаПодключения, НастройкиTLS); + + Если ЗначениеЗаполнено(Результат["data"]) Тогда // SKIP + Результат["data"][0]["varbinary_field"]["BYTES"] = Лев(Результат["data"][0]["varbinary_field"]["BYTES"], 10) + "..."; // SKIP + КонецЕсли; // SKIP + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗаписи", "MSSQL"); // SKIP + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); // SKIP + + // Отборы, выбранные поля, количество и сортировка + + СтрокаПодключения = OPI_MSSQL.СформироватьСтрокуПодключения(Адрес, "test_data", Логин, Пароль); + + Таблица = "test_data"; + + Поля = Новый Массив; + Поля.Добавить("first_name"); + Поля.Добавить("last_name"); + Поля.Добавить("email"); + + Фильтры = Новый Массив; + + СтруктураФильтра1 = Новый Структура; + + СтруктураФильтра1.Вставить("field", "gender"); + СтруктураФильтра1.Вставить("type" , "="); + СтруктураФильтра1.Вставить("value", "Male"); + СтруктураФильтра1.Вставить("union", "AND"); + СтруктураФильтра1.Вставить("raw" , Ложь); + + СтруктураФильтра2 = Новый Структура; + + СтруктураФильтра2.Вставить("field", "id"); + СтруктураФильтра2.Вставить("type" , "BETWEEN"); + СтруктураФильтра2.Вставить("value", "20 AND 50"); + СтруктураФильтра2.Вставить("raw" , Истина); + + Фильтры.Добавить(СтруктураФильтра1); + Фильтры.Добавить(СтруктураФильтра2); + + Сортировка = Новый Структура("ip_address", "DESC"); + Количество = 5; + + Результат = OPI_MSSQL.ПолучитьЗаписи(Таблица, Поля, Фильтры, Сортировка, Количество, СтрокаПодключения, НастройкиTLS); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗаписи (отборы)", "MSSQL"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 5); + +КонецПроцедуры + #КонецОбласти #КонецОбласти diff --git a/src/ru/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin b/src/ru/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin index a01da74a4b..81619ee51b 100644 Binary files a/src/ru/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin and b/src/ru/OPI/src/CommonTemplates/OPI_MSSQL/Template.addin differ