├── .gitignore ├── fixtures ├── mysql-con-str.txt ├── pgsql-con-str.txt └── ms-sql-server-con-str.txt ├── docs ├── ТипСУБД.md ├── РезультатЗапроса.md ├── Запрос.md └── Соединение.md ├── changelog.txt ├── oscript-sql ├── IOScriptQuery.cs ├── packages.config ├── EnumDBType.cs ├── Properties │ └── AssemblyInfo.cs ├── QueryResult.cs ├── oscript-sql.csproj ├── SQLQuery.cs └── DBConnector.cs ├── drafts └── insert-select-ms-sql-server.os ├── LICENSE ├── examples └── sqlite-in-memory.os ├── oscript-sql.sln ├── README.md ├── tests ├── test-mysql.os ├── test-pgsql.os ├── test-ms-sql-server.os ├── test-reader.os └── test-sqlite.os └── .vscode └── tasks.json /.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | obj 3 | -------------------------------------------------------------------------------- /fixtures/mysql-con-str.txt: -------------------------------------------------------------------------------- 1 | server=localhost;user=root;database=test;port=3306 -------------------------------------------------------------------------------- /fixtures/pgsql-con-str.txt: -------------------------------------------------------------------------------- 1 | Host=localhost;Username=testuser;Password=testuser;Database=test;Port=5432 -------------------------------------------------------------------------------- /fixtures/ms-sql-server-con-str.txt: -------------------------------------------------------------------------------- 1 | Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog="test";Data Source=VAIO\SQLEXPRESS -------------------------------------------------------------------------------- /docs/ТипСУБД.md: -------------------------------------------------------------------------------- 1 | # ТипСУБД / DBType 2 | 3 | Тип поддерживаемой СУБД 4 | 5 | ## Свойства 6 | 7 | ### sqlite / sqlite 8 | Доступ: Чтение 9 | 10 | ### MSSQLServer / MSSQLServer 11 | Доступ: Чтение -------------------------------------------------------------------------------- /changelog.txt: -------------------------------------------------------------------------------- 1 | 2018-12-03 ret-Phoenix 2 | [added] Метод Пустой() - Булево. 3 | 4 | 2017-09-12 ret-Phoenix 5 | [fixed] Не всегда возвращало результат открытия соединения. 6 | 7 | 2017-03-09 ret-Phoenix 8 | 9 | [added] Запрос.Таймаут/Query.Timeout - Время в секундах, в течение которого должно происходить ожидание выполнения команды. По умолчанию используется значение 30 секунд. 10 | [fixed] Тесты, переделано на "#Использовать sql". 11 | [fixed] Документация, с учетом добавления свойства Таймаут. -------------------------------------------------------------------------------- /docs/РезультатЗапроса.md: -------------------------------------------------------------------------------- 1 | # РезультатЗапроса / QueryResult 2 | 3 | Содержит результат выполнения запроса. Предназначен для хранения и обработки полученных данных. 4 | 5 | ## Методы 6 | 7 | ### Выгрузить / Unload() 8 | 9 | Создает таблицу значений и копирует в нее все записи набора. 10 | 11 | #### Возвращаемое значение 12 | 13 | ТаблицаЗначений 14 | 15 | ### Пустой / IsEmpty() 16 | 17 | Определяет, есть ли в результате записи 18 | 19 | #### Возвращаемое значение 20 | 21 | Булево. Истина - нет ни одной записи; Ложь - если есть записи. -------------------------------------------------------------------------------- /oscript-sql/IOScriptQuery.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using ScriptEngine.Machine; 3 | using ScriptEngine.HostedScript.Library; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | 10 | namespace OScriptSql 11 | { 12 | interface IOScriptQuery : IValue 13 | { 14 | // props 15 | StructureImpl Parameters { get; } 16 | string Text { get; set; } 17 | 18 | // methods 19 | IValue Execute(); 20 | void SetParameter(string ParametrName, IValue ParametrValue); 21 | 22 | // my methods 23 | void SetConnection(DBConnector connector); 24 | 25 | 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /drafts/insert-select-ms-sql-server.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 3 | 4 | КоннекстМССКЛ = Новый Соединение(); 5 | КоннекстМССКЛ.ТипСУБД = КоннекстМССКЛ.ТипыСУБД.MSSQLServer; 6 | КоннекстМССКЛ.Сервер = "FIN91\SQLEXPRESS"; 7 | КоннекстМССКЛ.ИмяБазы = "test"; 8 | КоннекстМССКЛ.Открыть(); 9 | Сообщить("ОШИБКА:::" + КоннекстМССКЛ.ПоследнееСообщениеОбОшибке); 10 | 11 | ЗапросВставка = Новый Запрос(); 12 | ЗапросВставка.УстановитьСоединение(КоннекстМССКЛ); 13 | ЗапросВставка.Текст = "insert into users (login) values (@name)"; 14 | ЗапросВставка.УстановитьПараметр("name", "Игорь2"); 15 | ЗапросВставка.ВыполнитьКоманду(); 16 | 17 | Запрос = Новый Запрос(); 18 | Запрос.УстановитьСоединение(КоннекстМССКЛ); 19 | Запрос.Текст = "select * from users"; 20 | 21 | ТЗ = Запрос.Выполнить().Выгрузить(); 22 | 23 | Для каждого Стр Из ТЗ Цикл 24 | Сообщить(Стр.login) 25 | КонецЦикла; 26 | -------------------------------------------------------------------------------- /oscript-sql/packages.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /oscript-sql/EnumDBType.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | 8 | namespace OScriptSql 9 | { 10 | /// 11 | /// Тип поддерживаемой СУБД 12 | /// 13 | [ContextClass("ТипСУБД", "DBType")] 14 | public class EnumDBType : AutoContext 15 | { 16 | [ContextProperty("sqlite", "sqlite")] 17 | public int sqlite 18 | { 19 | get { return 0; } 20 | } 21 | 22 | [ContextProperty("MSSQLServer", "MSSQLServer")] 23 | public int MSSQLServer 24 | { 25 | get { return 1; } 26 | } 27 | 28 | [ContextProperty("MySQL", "MySQL")] 29 | public int MySQL 30 | { 31 | get { return 2; } 32 | } 33 | 34 | [ContextProperty("PostgreSQL", "PostgreSQL")] 35 | public int PostgreSQL 36 | { 37 | get { return 3; } 38 | } 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 ret-Phoenix 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /oscript-sql/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // Information about this assembly is defined by the following attributes. 5 | // Change them to the values specific to your project. 6 | 7 | [assembly: AssemblyTitle("oscript-sql")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("")] 12 | [assembly: AssemblyCopyright("ret-Phoenix")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". 17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, 18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. 19 | 20 | [assembly: AssemblyVersion("1.1.1.2")] 21 | 22 | // The following attributes are used to specify the signing key for the assembly, 23 | // if desired. See the Mono documentation for more information about signing. 24 | 25 | //[assembly: AssemblyDelaySign(false)] 26 | //[assembly: AssemblyKeyFile("")] 27 | 28 | -------------------------------------------------------------------------------- /examples/sqlite-in-memory.os: -------------------------------------------------------------------------------- 1 | #Использовать sql 2 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 3 | 4 | Соединение = Новый Соединение(); 5 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 6 | Соединение.ИмяБазы = ":memory:"; 7 | Соединение.Открыть(); 8 | 9 | Запрос = Новый Запрос(); 10 | Запрос.УстановитьСоединение(Соединение); 11 | Запрос.Текст = "Create table users (id integer, name text)"; 12 | Запрос.ВыполнитьКоманду(); 13 | 14 | Запрос.Текст = "insert into users (id, name) values(1, @name)"; 15 | Запрос.УстановитьПараметр("name", "Сергей"); 16 | Запрос.ВыполнитьКоманду(); 17 | 18 | Запрос.Текст = "insert into users (id, name) values(@id, @name)"; 19 | Запрос.УстановитьПараметр("id", "2"); 20 | Запрос.УстановитьПараметр("name", "Оксана"); 21 | Запрос.ВыполнитьКоманду(); 22 | 23 | Запрос2 = Новый Запрос(); 24 | Запрос2.УстановитьСоединение(Соединение); 25 | Запрос2.Текст = "select * from users where id = @id"; 26 | Запрос2.УстановитьПараметр("id", 1); 27 | ТЗ = Запрос2.Выполнить().Выгрузить(); 28 | 29 | Для каждого Стр Из ТЗ Цикл 30 | Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")") 31 | КонецЦикла; 32 | 33 | Соединение.Закрыть(); -------------------------------------------------------------------------------- /oscript-sql.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25123.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "oscript-sql", "oscript-sql\oscript-sql.csproj", "{EA173D06-CCD2-45D5-A263-DC866289517A}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | oscript-15|Any CPU = oscript-15|Any CPU 12 | Release|Any CPU = Release|Any CPU 13 | test|Any CPU = test|Any CPU 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 17 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Debug|Any CPU.Build.0 = Debug|Any CPU 18 | {EA173D06-CCD2-45D5-A263-DC866289517A}.oscript-15|Any CPU.ActiveCfg = oscript-15|Any CPU 19 | {EA173D06-CCD2-45D5-A263-DC866289517A}.oscript-15|Any CPU.Build.0 = oscript-15|Any CPU 20 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {EA173D06-CCD2-45D5-A263-DC866289517A}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {EA173D06-CCD2-45D5-A263-DC866289517A}.test|Any CPU.ActiveCfg = test|Any CPU 23 | {EA173D06-CCD2-45D5-A263-DC866289517A}.test|Any CPU.Build.0 = test|Any CPU 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Работа с SQL базами для 1script 2 | 3 | Внешняя компонента реализующая возможность работы с базами данных из onescript. 4 | 5 | Поддерживаются базы: sqlite, MS SQL Server, MySQL, PostgreSQL 6 | 7 | Для коннектора sqlite позволяет работать с базой im memory. 8 | 9 | Имеется возможность писать запросы на выборку данных, использовать параметры запросах. 10 | 11 | Реализована возможность выполнения запросов DDL и DML. 12 | 13 | Если не подходит сборка sqlite выложенная в release - следует скачать подходящую с официального сайта [sqlite](http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki) 14 | 15 | Примечание: УстановитьПараметр принимает типы: Строка, Число, Дата, Булево 16 | 17 | 18 | ## Пример 19 | 20 | ```bsl 21 | Соединение = Новый Соединение(); 22 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 23 | Соединение.ИмяБазы = ":memory:"; 24 | Соединение.Открыть(); 25 | 26 | Запрос = Новый Запрос(); 27 | Запрос.УстановитьСоединение(Соединение); 28 | Запрос.Текст = "Create table users (id integer, name text)"; 29 | Запрос.ВыполнитьКоманду(); 30 | 31 | Запрос.Текст = "insert into users (id, name) values(1, @name)"; 32 | Запрос.УстановитьПараметр("name", "Сергей"); 33 | Запрос.ВыполнитьКоманду(); 34 | 35 | Запрос2 = Новый Запрос(); 36 | Запрос2.УстановитьСоединение(Соединение); 37 | Запрос2.Текст = "select * from users where id = @id"; 38 | Запрос2.УстановитьПараметр("id", 1); 39 | ТЗ = Запрос2.Выполнить().Выгрузить(); 40 | 41 | Для каждого Стр Из ТЗ Цикл 42 | Сообщить("Имя: " + Стр.Name + " (" + Стр.id + ")") 43 | КонецЦикла; 44 | ``` 45 | -------------------------------------------------------------------------------- /docs/Запрос.md: -------------------------------------------------------------------------------- 1 | # Запрос / Query 2 | 3 | Предназначен для выполнения запросов к базе данных. 4 | 5 | ## Свойства 6 | 7 | ### Параметры / Parameters 8 | Доступ: Чтение 9 | 10 | ### Текст / Text 11 | Доступ: Чтение/Запись 12 | 13 | Тип значения: Строка 14 | 15 | Содержит исходный текст выполняемого запроса. 16 | 17 | ### Таймаут / Timeout 18 | Доступ: Чтение/Запись 19 | 20 | Тип значения: Число 21 | 22 | Время в секундах, в течение которого должно происходить ожидание выполнения команды. По умолчанию используется значение 30 секунд. 23 | 24 | 25 | ## Методы 26 | 27 | ### Выполнить / Execute() 28 | 29 | Выполняет запрос к базе данных. 30 | 31 | #### Возвращаемое значение 32 | 33 | [РезультатЗапроса](РезультатЗапроса.md) 34 | 35 | ### ВыполнитьКоманду / ExecuteCommand() 36 | 37 | Выполняет запрос на модификацию к базе данных. 38 | 39 | #### Возвращаемое значение 40 | 41 | Число - Число обработанных строк. 42 | 43 | ### УстановитьПараметр / SetParameter() 44 | 45 | Устанавливает параметр запроса. Параметры доступны для обращения в тексте запроса. 46 | С помощью этого метода можно передавать переменные в запрос, например, для использования в условиях запроса. 47 | ВАЖНО: В запросе имя параметра указывается с использованием '@'. 48 | 49 | #### Пример: 50 | Запрос.Текст = "select * from mytable where category_id = @category_id"; 51 | Запрос.УстановитьПараметр("category_id", 1); 52 | 53 | 54 | #### Параметры 55 | 56 | * *ParametrName*: Строка - Имя параметра 57 | 58 | * *ParametrValue*: Произвольный - Значение параметра 59 | 60 | ### УстановитьСоединение / SetConnection() 61 | 62 | Установка соединения с БД. 63 | 64 | #### Параметры 65 | 66 | * *connector*: [Соединение](Соединение.md) - объект соединение с БД 67 | 68 | ### ИДПоследнейДобавленнойЗаписи 69 | 70 | Возвращает уникальный ид последней добавленной записи, работает для SQLite, MySQL 71 | 72 | #### Возвращаемое значение 73 | 74 | Число - уникальный ид последней добавленной записи. -------------------------------------------------------------------------------- /docs/Соединение.md: -------------------------------------------------------------------------------- 1 | # Соединение / Connection 2 | 3 | Соединение с БД. Используется для указания источника данных объекта Запрос. 4 | 5 | ## Свойства 6 | 7 | ### ТипыСУБД / DBTypes 8 | Доступ: Чтение 9 | 10 | Тип значения: [ТипСУБД](#ТипСУБД.md) 11 | 12 | Типы поддерживаемых СУБД 13 | 14 | ### ТипСУБД / DBType 15 | Доступ: Чтение/Запись 16 | 17 | Тип значения: ТипСУБД 18 | 19 | Тип подключенной СУБД 20 | 21 | ### Порт / Port 22 | Доступ: Чтение/Запись 23 | 24 | Тип значения: Число 25 | 26 | Порт подключения 27 | 28 | ### Сервер / Server 29 | Доступ: Чтение/Запись 30 | 31 | Тип значения: Строка 32 | 33 | Имя или IP сервера 34 | 35 | ### ИмяБазы / DbName 36 | Доступ: Чтение/Запись 37 | 38 | Тип значения: Строка 39 | 40 | Имя базы, в случае с SQLITE - путь к базе 41 | 42 | ### ИмяПользователя / Login 43 | Доступ: Чтение/Запись 44 | 45 | Тип значения: Строка 46 | 47 | Пользователь под которым происходит подключение. 48 | Если СУБД MS SQL и пользователь не указан - используется Windows авторизация. 49 | 50 | ### Пароль / Password 51 | Доступ: Чтение/Запись 52 | 53 | Тип значения: Строка 54 | 55 | Пароль пользователя 56 | 57 | ### Открыто / IsOpen 58 | Доступ: Чтение 59 | 60 | Тип значения: Булево 61 | 62 | Статус соединения с БД: Открыто - Истина, Закрыто - Ложь. 63 | 64 | ### Состояние / State 65 | Доступ: Чтение 66 | 67 | Тип значения: ConnectionState 68 | 69 | Состояние соединения: 70 | 71 | - Closed - Закрыто. 72 | - Open - Открыто. 73 | - Connecting - Соединяется с источником. 74 | - Executing - Выполняет команду 75 | - Fetching - Получает данные 76 | - Broken - Соединение оборвано. 77 | 78 | ### ПоследнееСообщениеОбОшибке / LastErrorMessage 79 | Доступ: Чтение 80 | 81 | Тип значения: Строка 82 | 83 | Текст последней ошибки. 84 | 85 | ### СтрокаСоединения / ConnectionString 86 | Доступ: Чтение/Запись 87 | 88 | Тип значения: Строка 89 | 90 | Подготовленная строка соединения. В случае sqlite аналог ИмяБазы 91 | 92 | ## Методы 93 | 94 | ### Открыть / Open() 95 | 96 | Открыть соединение с БД 97 | 98 | #### Возвращаемое значение 99 | 100 | Булево 101 | 102 | ### Закрыть / Close() 103 | 104 | Закрыть соединение с БД 105 | 106 | ### СоздатьЗапрос / CreateQuery() 107 | 108 | Создать запрос с установленным соединением 109 | 110 | #### Возвращаемое значение 111 | 112 | Запрос 113 | -------------------------------------------------------------------------------- /oscript-sql/QueryResult.cs: -------------------------------------------------------------------------------- 1 | using System.Globalization; 2 | using ScriptEngine.Machine.Contexts; 3 | using ScriptEngine.HostedScript.Library.ValueTable; 4 | using ScriptEngine.Machine; 5 | using ScriptEngine.HostedScript.Library; 6 | 7 | using System; 8 | using System.Collections.Generic; 9 | using System.Linq; 10 | using System.Text; 11 | using System.Threading.Tasks; 12 | using System.Data.SQLite; 13 | using System.Data.Common; 14 | using ScriptEngine.HostedScript.Library.Binary; 15 | 16 | 17 | namespace OScriptSql 18 | { 19 | /// 20 | /// Содержит результат выполнения запроса. Предназначен для хранения и обработки полученных данных. 21 | /// 22 | [ContextClass("РезультатЗапроса", "QueryResult")] 23 | public class QueryResult : AutoContext 24 | { 25 | private DbDataReader _reader; 26 | 27 | public QueryResult() 28 | { 29 | } 30 | 31 | 32 | public QueryResult(DbDataReader reader) 33 | { 34 | _reader = reader; 35 | } 36 | 37 | /// 38 | /// Определяет, есть ли в результате записи 39 | /// 40 | /// Булево. Истина - нет ни одной записи; Ложь - если есть записи. 41 | [ContextMethod("Пустой", "IsEmpty")] 42 | public bool IsEmpty() 43 | { 44 | return !_reader.HasRows; 45 | 46 | } 47 | 48 | /// 49 | /// Создает таблицу значений и копирует в нее все записи набора. 50 | /// 51 | /// ТаблицаЗначений 52 | [ContextMethod("Выгрузить", "Unload")] 53 | public ValueTable Unload() 54 | { 55 | 56 | ValueTable resultTable = new ValueTable(); 57 | 58 | for (int ColIdx = 0; ColIdx < _reader.FieldCount; ColIdx++) 59 | { 60 | resultTable.Columns.Add(_reader.GetName(ColIdx)); 61 | } 62 | 63 | foreach (DbDataRecord record in _reader) 64 | { 65 | ValueTableRow row = resultTable.Add(); 66 | 67 | for (int ColIdx = 0; ColIdx < _reader.FieldCount; ColIdx++) 68 | { 69 | if (record.IsDBNull(ColIdx)) 70 | { 71 | row.Set(ColIdx, ValueFactory.Create()); 72 | continue; 73 | } 74 | 75 | if (record.GetFieldType(ColIdx) == typeof(SByte)) 76 | { 77 | row.Set(ColIdx, ValueFactory.Create((int)record.GetValue(ColIdx))); 78 | } 79 | else if (record.GetFieldType(ColIdx) == typeof(Int32)) 80 | { 81 | row.Set(ColIdx, ValueFactory.Create((int)record.GetValue(ColIdx))); 82 | } 83 | else if (record.GetFieldType(ColIdx) == typeof(Int64)) 84 | { 85 | row.Set(ColIdx, ValueFactory.Create(record.GetInt64(ColIdx))); 86 | } 87 | else if (record.GetFieldType(ColIdx) == typeof(Boolean)) 88 | { 89 | row.Set(ColIdx, ValueFactory.Create(record.GetBoolean(ColIdx))); 90 | } 91 | else if (record.GetFieldType(ColIdx) == typeof(UInt64)) 92 | { 93 | row.Set(ColIdx, ValueFactory.Create(record.GetValue(ColIdx).ToString())); 94 | } 95 | else if (record.GetFieldType(ColIdx).ToString() == "System.Double") 96 | { 97 | double val = record.GetDouble(ColIdx); 98 | row.Set(ColIdx, ValueFactory.Create(val.ToString())); 99 | } 100 | else if (record.GetFieldType(ColIdx) == typeof(Single)) 101 | { 102 | float val = record.GetFloat(ColIdx); 103 | row.Set(ColIdx, ValueFactory.Create(val.ToString())); 104 | } 105 | else if (record.GetFieldType(ColIdx) == typeof(Decimal)) 106 | { 107 | row.Set(ColIdx, ValueFactory.Create(record.GetDecimal(ColIdx))); 108 | } 109 | else if (record.GetFieldType(ColIdx).ToString() == "System.String") 110 | { 111 | row.Set(ColIdx, ValueFactory.Create(record.GetString(ColIdx))); 112 | } 113 | else if (record.GetFieldType(ColIdx).ToString() == "System.DateTime") 114 | { 115 | row.Set(ColIdx, ValueFactory.Create(record.GetDateTime(ColIdx))); 116 | } 117 | else if (record.GetFieldType(ColIdx).ToString() == "System.TimeSpan") 118 | { 119 | row.Set(ColIdx, ValueFactory.Create(new DateTime() + (TimeSpan)record[ColIdx])); 120 | } 121 | else if (record.GetFieldType(ColIdx).ToString() == "System.Byte[]") 122 | { 123 | var data = (byte[])record[ColIdx]; 124 | var newData = new BinaryDataContext(data); 125 | row.Set(ColIdx, ValueFactory.Create(newData)); 126 | } 127 | else if (record.GetDataTypeName(ColIdx) == "uniqueidentifier") 128 | { 129 | row.Set(ColIdx, ValueFactory.Create(record.GetValue(ColIdx).ToString())); 130 | } 131 | else if (record.GetDataTypeName(ColIdx) == "tinyint") 132 | { 133 | row.Set(ColIdx, ValueFactory.Create((int)record.GetByte(ColIdx))); 134 | } 135 | else 136 | { 137 | row.Set(ColIdx, ValueFactory.Create(record.GetString(ColIdx))); 138 | } 139 | 140 | } 141 | } 142 | _reader.Close(); 143 | return resultTable; 144 | } 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /tests/test-mysql.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | Перем мСтрокаСоединения; 6 | 7 | Функция ПолучитьТекстИзФайла(ИмяФайла) 8 | ФайлОбмена = Новый Файл(ИмяФайла); 9 | Данные = ""; 10 | Если ФайлОбмена.Существует() Тогда 11 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 12 | Данные = Текст.Прочитать(); 13 | Текст.Закрыть(); 14 | Иначе 15 | Возврат Ложь; 16 | КонецЕсли; 17 | возврат Данные; 18 | КонецФункции 19 | 20 | Процедура Инициализация() 21 | КонецПроцедуры 22 | 23 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 24 | 25 | СуфикМетодов = ""; 26 | мСтрокаСоединения = ПолучитьТекстИзФайла("fixtures\mysql-con-str.txt"); 27 | Если мСтрокаСоединения = Ложь Тогда 28 | СуфикМетодов = "НетПараметровСоединения"; 29 | КонецЕсли; 30 | 31 | 32 | юТест = Тестирование; 33 | 34 | СписокТестов = Новый Массив; 35 | СписокТестов.Добавить("Тест_Должен_ПроверитьГенерациюСтрокиСоединения"); 36 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьГенерациюСтрокиСоединения() Экспорт 46 | 47 | Соединение = Новый Соединение(); 48 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 49 | Соединение.Сервер = "localhost"; 50 | Соединение.ИмяПользователя = "root"; 51 | Соединение.ИмяБазы = "test"; 52 | Соединение.Пароль = "testpassword"; 53 | Соединение.Порт = 3306; 54 | 55 | Попытка 56 | /// Заведомо известно падение при открытии. 57 | /// Строка соединения генерируется только при открытии 58 | Соединение.Открыть(); 59 | Исключение 60 | Ожидаем.Что(Соединение.СтрокаСоединения).Равно("server=localhost;user=root;password=testpassword;database=test;port=3306;"); 61 | КонецПопытки; 62 | 63 | 64 | КонецПроцедуры 65 | 66 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 67 | 68 | Соединение = Новый Соединение(); 69 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 70 | Соединение.СтрокаСоединения = мСтрокаСоединения; 71 | Соединение.Открыть(); 72 | 73 | ЗапросВставка = Новый Запрос(); 74 | ЗапросВставка.УстановитьСоединение(Соединение); 75 | 76 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 77 | ЗапросВставка.ВыполнитьКоманду(); 78 | 79 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 80 | ЗапросВставка.ВыполнитьКоманду(); 81 | 82 | Соединение.Закрыть(); 83 | 84 | КонецПроцедуры 85 | 86 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 87 | 88 | Соединение = Новый Соединение(); 89 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 90 | Соединение.СтрокаСоединения = мСтрокаСоединения; 91 | Соединение.Открыть(); 92 | 93 | ЗапросВставка = Новый Запрос(); 94 | ЗапросВставка.УстановитьСоединение(Соединение); 95 | 96 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 97 | ЗапросВставка.ВыполнитьКоманду(); 98 | 99 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 100 | ЗапросВставка.ВыполнитьКоманду(); 101 | 102 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 103 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 104 | Результат = ЗапросВставка.ВыполнитьКоманду(); 105 | 106 | Соединение.Закрыть(); 107 | 108 | Ожидаем.Что(Результат).Равно(1); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 113 | 114 | Соединение = Новый Соединение(); 115 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 116 | Соединение.СтрокаСоединения = мСтрокаСоединения; 117 | Соединение.Открыть(); 118 | 119 | ЗапросВставка = Новый Запрос(); 120 | ЗапросВставка.УстановитьСоединение(Соединение); 121 | 122 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users1"; 123 | ЗапросВставка.ВыполнитьКоманду(); 124 | 125 | ЗапросВставка.Текст = "Create table users1 (id integer, name varchar(50), born date, isadmin bool)"; 126 | ЗапросВставка.ВыполнитьКоманду(); 127 | 128 | ЗапросВставка.Текст = "insert into users1 (id, name, born, isadmin) values(@id, @name, @born, @isadmin)"; 129 | ЗапросВставка.УстановитьПараметр("id", "1"); 130 | ЗапросВставка.УстановитьПараметр("isadmin", Истина); 131 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 132 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 133 | ЗапросВставка.ВыполнитьКоманду(); 134 | 135 | ЗапросВставка.Текст = "update users1 set name = @name"; 136 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 137 | Результат = ЗапросВставка.ВыполнитьКоманду(); 138 | 139 | ЗапросВставка.Параметры.Очистить(); 140 | ЗапросВставка.Текст = "select * from users1"; 141 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 142 | 143 | // Для каждого СтрТЗ Из ТЗ Цикл 144 | // Сообщить("id:" +СтрТЗ.id); 145 | // Сообщить("name:" + СтрТЗ.name); 146 | // Сообщить("born:" + СтрТЗ.born); 147 | // Сообщить("isadmin:" + СтрТЗ.isadmin); 148 | // КонецЦикла; 149 | 150 | Соединение.Закрыть(); 151 | 152 | Ожидаем.Что(Результат).Равно(1); 153 | 154 | КонецПроцедуры 155 | 156 | 157 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 158 | 159 | Соединение = Новый Соединение(); 160 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 161 | Соединение.СтрокаСоединения = мСтрокаСоединения; 162 | Соединение.Открыть(); 163 | 164 | ЗапросВставка = Новый Запрос(); 165 | ЗапросВставка.УстановитьСоединение(Соединение); 166 | 167 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 168 | ЗапросВставка.ВыполнитьКоманду(); 169 | 170 | ЗапросВставка.Текст = "Create table users (id integer, name varchar(50))"; 171 | ЗапросВставка.ВыполнитьКоманду(); 172 | 173 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 174 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 175 | ЗапросВставка.ВыполнитьКоманду(); 176 | 177 | ЗапросВставка.Параметры.Очистить(); 178 | ЗапросВставка.Текст = "select * from users"; 179 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 180 | 181 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 182 | 183 | Соединение.Закрыть(); 184 | 185 | КонецПроцедуры 186 | 187 | ////////////////////////////////////////////////////////////////////////////////////// 188 | // Инициализация 189 | 190 | Инициализация(); 191 | -------------------------------------------------------------------------------- /tests/test-pgsql.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | Перем мСтрокаСоединения; 6 | 7 | Функция ПолучитьТекстИзФайла(ИмяФайла) 8 | ФайлОбмена = Новый Файл(ИмяФайла); 9 | Данные = ""; 10 | Если ФайлОбмена.Существует() Тогда 11 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 12 | Данные = Текст.Прочитать(); 13 | Текст.Закрыть(); 14 | Иначе 15 | Возврат Ложь; 16 | КонецЕсли; 17 | возврат Данные; 18 | КонецФункции 19 | 20 | Процедура Инициализация() 21 | КонецПроцедуры 22 | 23 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 24 | 25 | СуфикМетодов = ""; 26 | мСтрокаСоединения = ПолучитьТекстИзФайла("fixtures\pgsql-con-str.txt"); 27 | Если мСтрокаСоединения = Ложь Тогда 28 | СуфикМетодов = "НетПараметровСоединения"; 29 | КонецЕсли; 30 | 31 | 32 | юТест = Тестирование; 33 | 34 | СписокТестов = Новый Массив; 35 | СписокТестов.Добавить("Тест_Должен_ПроверитьГенерациюСтрокиСоединения"); 36 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьГенерациюСтрокиСоединения() Экспорт 46 | 47 | Соединение = Новый Соединение(); 48 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 49 | Соединение.Сервер = "localhost"; 50 | Соединение.ИмяПользователя = "postgres"; 51 | Соединение.ИмяБазы = "test"; 52 | Соединение.Пароль = "testpassword"; 53 | Соединение.Порт = 3306; 54 | 55 | Попытка 56 | /// Заведомо известно падение при открытии. 57 | /// Строка соединения генерируется только при открытии 58 | Соединение.Открыть(); 59 | Исключение 60 | Ожидаем.Что(Соединение.СтрокаСоединения).Равно("Host=localhost;Username=postgres;Password=testpassword;Database=test;port=3306;"); 61 | КонецПопытки; 62 | 63 | 64 | КонецПроцедуры 65 | 66 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 67 | 68 | Соединение = Новый Соединение(); 69 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 70 | Соединение.СтрокаСоединения = мСтрокаСоединения; 71 | Соединение.Открыть(); 72 | 73 | ЗапросВставка = Новый Запрос(); 74 | ЗапросВставка.УстановитьСоединение(Соединение); 75 | 76 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 77 | ЗапросВставка.ВыполнитьКоманду(); 78 | 79 | ЗапросВставка.Текст = "Create table users (id integer, title varchar(50))"; 80 | ЗапросВставка.ВыполнитьКоманду(); 81 | 82 | Соединение.Закрыть(); 83 | 84 | КонецПроцедуры 85 | 86 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 87 | 88 | Соединение = Новый Соединение(); 89 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 90 | Соединение.СтрокаСоединения = мСтрокаСоединения; 91 | Соединение.Открыть(); 92 | 93 | ЗапросВставка = Новый Запрос(); 94 | ЗапросВставка.УстановитьСоединение(Соединение); 95 | 96 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testdata"; 97 | ЗапросВставка.ВыполнитьКоманду(); 98 | 99 | ЗапросВставка.Текст = "Create table testdata (userlogin varchar(50))"; 100 | ЗапросВставка.ВыполнитьКоманду(); 101 | 102 | ЗапросВставка.Текст = "INSERT INTO testdata (userlogin) VALUES (@value1)"; 103 | ЗапросВставка.УстановитьПараметр("value1", "Tom&jerry"); 104 | Результат = ЗапросВставка.ВыполнитьКоманду(); 105 | 106 | Соединение.Закрыть(); 107 | 108 | Ожидаем.Что(Результат).Равно(1); 109 | 110 | КонецПроцедуры 111 | 112 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 113 | 114 | Соединение = Новый Соединение(); 115 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 116 | Соединение.СтрокаСоединения = мСтрокаСоединения; 117 | Соединение.Открыть(); 118 | 119 | ЗапросВставка = Новый Запрос(); 120 | ЗапросВставка.УстановитьСоединение(Соединение); 121 | 122 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users1"; 123 | ЗапросВставка.ВыполнитьКоманду(); 124 | 125 | ЗапросВставка.Текст = "Create table users1 (id integer, name varchar(50), born date, isadmin bool)"; 126 | ЗапросВставка.ВыполнитьКоманду(); 127 | 128 | ЗапросВставка.Текст = "insert into users1 (id, name, born, isadmin) values(@id, @name, @born, @isadmin)"; 129 | ЗапросВставка.УстановитьПараметр("id", 1); 130 | ЗапросВставка.УстановитьПараметр("isadmin", Истина); 131 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 132 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 133 | ЗапросВставка.ВыполнитьКоманду(); 134 | 135 | ЗапросВставка.Текст = "update users1 set name = @name"; 136 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 137 | Результат = ЗапросВставка.ВыполнитьКоманду(); 138 | 139 | Соединение.Закрыть(); 140 | 141 | Ожидаем.Что(Результат).Равно(1); 142 | 143 | КонецПроцедуры 144 | 145 | 146 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 147 | 148 | Соединение = Новый Соединение(); 149 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 150 | Соединение.СтрокаСоединения = мСтрокаСоединения; 151 | Соединение.Открыть(); 152 | 153 | ЗапросВставка = Новый Запрос(); 154 | ЗапросВставка.УстановитьСоединение(Соединение); 155 | 156 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS users"; 157 | ЗапросВставка.ВыполнитьКоманду(); 158 | 159 | ЗапросВставка.Текст = "Create table users (id integer, title varchar(50))"; 160 | ЗапросВставка.ВыполнитьКоманду(); 161 | 162 | ЗапросВставка.Текст = "insert into users (id, title) values(@id, @title)"; 163 | ЗапросВставка.УстановитьПараметр("id", 1); 164 | ЗапросВставка.УстановитьПараметр("title", "Сергей"); 165 | ЗапросВставка.ВыполнитьКоманду(); 166 | 167 | ЗапросВставка.Текст = "insert into users (id, title) values(@id, @title)"; 168 | ЗапросВставка.УстановитьПараметр("id", 2); 169 | ЗапросВставка.УстановитьПараметр("title", "Оксана"); 170 | ЗапросВставка.ВыполнитьКоманду(); 171 | 172 | ЗапросВставка.Параметры.Очистить(); 173 | ЗапросВставка.Текст = "select * from users where id = @newid"; 174 | ЗапросВставка.УстановитьПараметр("newid", 1); 175 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 176 | 177 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 178 | 179 | Соединение.Закрыть(); 180 | 181 | КонецПроцедуры 182 | 183 | ////////////////////////////////////////////////////////////////////////////////////// 184 | // Инициализация 185 | 186 | Инициализация(); -------------------------------------------------------------------------------- /tests/test-ms-sql-server.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьТекстИзФайла(ИмяФайла) 7 | ФайлОбмена = Новый Файл(ИмяФайла); 8 | Данные = ""; 9 | Если ФайлОбмена.Существует() Тогда 10 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 11 | Данные = Текст.Прочитать(); 12 | Текст.Закрыть(); 13 | Иначе 14 | Возврат Ложь; 15 | КонецЕсли; 16 | возврат Данные; 17 | КонецФункции 18 | 19 | Процедура Инициализация() 20 | КонецПроцедуры 21 | 22 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 23 | 24 | СуфикМетодов = ""; 25 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 26 | Если СтрокаСоединения = Ложь Тогда 27 | СуфикМетодов = "НетПараметровСоединения"; 28 | КонецЕсли; 29 | 30 | 31 | юТест = Тестирование; 32 | 33 | СписокТестов = Новый Массив; 34 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединение" + СуфикМетодов); 35 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу" + СуфикМетодов); 36 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки" + СуфикМетодов); 37 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки" + СуфикМетодов); 38 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку" + СуфикМетодов); 39 | СписокТестов.Добавить("Тест_Должен_ДолженПроверитьТаймаут" + СуфикМетодов); 40 | 41 | Возврат СписокТестов; 42 | 43 | КонецФункции 44 | 45 | Процедура Тест_Должен_ПроверитьСоединение() Экспорт 46 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 47 | 48 | Соединение = Новый Соединение(); 49 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 50 | Соединение.СтрокаСоединения = СтрокаСоединения; 51 | 52 | Результат = Соединение.Открыть(); 53 | 54 | Ожидаем.Что(Результат).Равно(Результат); 55 | 56 | Соединение.Закрыть(); 57 | 58 | КонецПроцедуры 59 | 60 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 61 | 62 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 63 | 64 | Соединение = Новый Соединение(); 65 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 66 | Соединение.СтрокаСоединения = СтрокаСоединения; 67 | 68 | Соединение.Открыть(); 69 | ЗапросВставка = Новый Запрос(); 70 | ЗапросВставка.УстановитьСоединение(Соединение); 71 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 72 | ЗапросВставка.ВыполнитьКоманду(); 73 | 74 | Соединение.Закрыть(); 75 | 76 | КонецПроцедуры 77 | 78 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 79 | 80 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 81 | 82 | Соединение = Новый Соединение(); 83 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 84 | Соединение.СтрокаСоединения = СтрокаСоединения; 85 | Соединение.Открыть(); 86 | 87 | ЗапросВставка = Новый Запрос(); 88 | ЗапросВставка.УстановитьСоединение(Соединение); 89 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 90 | ЗапросВставка.ВыполнитьКоманду(); 91 | 92 | ЗапросВставка.Текст = "insert into #users (name) values(@name)"; 93 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 94 | Результат = ЗапросВставка.ВыполнитьКоманду(); 95 | 96 | Соединение.Закрыть(); 97 | 98 | Ожидаем.Что(Результат).Равно(1); 99 | 100 | КонецПроцедуры 101 | 102 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 103 | 104 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 105 | 106 | Соединение = Новый Соединение(); 107 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 108 | Соединение.СтрокаСоединения = СтрокаСоединения; 109 | Соединение.Открыть(); 110 | 111 | ЗапросВставка = Новый Запрос(); 112 | ЗапросВставка.УстановитьСоединение(Соединение); 113 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 114 | ЗапросВставка.ВыполнитьКоманду(); 115 | 116 | ЗапросВставка.Текст = "insert into #users (id, name) values(1, @name)"; 117 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 118 | ЗапросВставка.ВыполнитьКоманду(); 119 | 120 | ЗапросВставка.Текст = "update #users set name = @name"; 121 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 122 | Результат = ЗапросВставка.ВыполнитьКоманду(); 123 | 124 | Соединение.Закрыть(); 125 | 126 | Ожидаем.Что(Результат).Равно(1); 127 | 128 | КонецПроцедуры 129 | 130 | 131 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 132 | 133 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 134 | 135 | Соединение = Новый Соединение(); 136 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 137 | Соединение.СтрокаСоединения = СтрокаСоединения; 138 | Соединение.Открыть(); 139 | 140 | ЗапросВставка = Новый Запрос(); 141 | ЗапросВставка.УстановитьСоединение(Соединение); 142 | 143 | ЗапросВставка.Текст = "IF OBJECT_ID(N'#users', N'U') IS NOT NULL DROP TABLE #users;"; 144 | ЗапросВставка.ВыполнитьКоманду(); 145 | 146 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50), born date)"; 147 | ЗапросВставка.ВыполнитьКоманду(); 148 | 149 | ЗапросВставка.Текст = "insert into #users (id, name, born) values(@id, @name, @born)"; 150 | ЗапросВставка.Параметры.Очистить(); 151 | ЗапросВставка.УстановитьПараметр("id", 1); 152 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 153 | ЗапросВставка.УстановитьПараметр("born", Дата(1980,9,13)); 154 | ЗапросВставка.ВыполнитьКоманду(); 155 | 156 | ЗапросВставка.Текст = "select * from #users WHERE id = @id"; 157 | // ЗапросВставка.Текст = "select * from users"; 158 | ЗапросВставка.Параметры.Очистить(); 159 | ЗапросВставка.УстановитьПараметр("id", 1); 160 | Рез = ЗапросВставка.Выполнить(); 161 | ТЗ = Рез.Выгрузить(); 162 | 163 | // Для каждого СтрТЗ Из ТЗ Цикл 164 | // Сообщить("id:" +СтрТЗ.id); 165 | // Сообщить("name:" + СтрТЗ.name); 166 | // Сообщить("born:" + СтрТЗ.born); 167 | // КонецЦикла; 168 | 169 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 170 | 171 | Соединение.Закрыть(); 172 | 173 | КонецПроцедуры 174 | 175 | Процедура Тест_Должен_ДолженПроверитьТаймаут() Экспорт 176 | 177 | СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 178 | 179 | Соединение = Новый Соединение(); 180 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 181 | Соединение.СтрокаСоединения = СтрокаСоединения; 182 | Соединение.Открыть(); 183 | 184 | ЗапросВставка = Новый Запрос(); 185 | ЗапросВставка.УстановитьСоединение(Соединение); 186 | ЗапросВставка.Таймаут = 1; 187 | 188 | ЗапросВставка.Текст = "Create table #users (id integer, name varchar(50))"; 189 | ЗапросВставка.ВыполнитьКоманду(); 190 | 191 | ЗапросВставка.Текст = "insert into #users (id, name) values(1, @name)"; 192 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 193 | ЗапросВставка.ВыполнитьКоманду(); 194 | 195 | ЗапросВставка.Текст = "update #users set name = @name"; 196 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 197 | Результат = ЗапросВставка.ВыполнитьКоманду(); 198 | 199 | Соединение.Закрыть(); 200 | 201 | Ожидаем.Что(Результат).Равно(1); 202 | КонецПроцедуры 203 | 204 | ////////////////////////////////////////////////////////////////////////////////////// 205 | // Инициализация 206 | 207 | Инициализация(); 208 | -------------------------------------------------------------------------------- /oscript-sql/oscript-sql.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | {EA173D06-CCD2-45D5-A263-DC866289517A} 7 | Library 8 | OScriptSql 9 | sql 10 | v4.5 11 | 12 | 13 | 14 | 15 | true 16 | full 17 | false 18 | bin\Debug 19 | DEBUG; 20 | prompt 21 | 4 22 | false 23 | bin\Debug\sql.XML 24 | 25 | 26 | full 27 | true 28 | bin\Release 29 | prompt 30 | 4 31 | false 32 | bin\Release\sql.XML 33 | 34 | 35 | true 36 | ..\..\..\portable\OneScript\bin\ext\sql\ 37 | DEBUG; 38 | full 39 | AnyCPU 40 | prompt 41 | MinimumRecommendedRules.ruleset 42 | ..\..\..\portable\OneScript\bin\ext\sql\sql.XML 43 | 44 | 45 | true 46 | ..\..\..\portable\OneScript\bin-15\ext\sql\ 47 | DEBUG; 48 | ..\..\..\portable\OneScript\bin-15\ext\sql\sql.XML 49 | full 50 | AnyCPU 51 | prompt 52 | MinimumRecommendedRules.ruleset 53 | 54 | 55 | 56 | ..\packages\DotNetZip.1.10.1\lib\net20\DotNetZip.dll 57 | True 58 | 59 | 60 | ..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.dll 61 | True 62 | 63 | 64 | ..\packages\EntityFramework.6.0.0\lib\net45\EntityFramework.SqlServer.dll 65 | True 66 | 67 | 68 | ..\packages\MySql.Data.6.9.9\lib\net45\MySql.Data.dll 69 | True 70 | 71 | 72 | ..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll 73 | 74 | 75 | ..\packages\Npgsql.3.1.9\lib\net45\Npgsql.dll 76 | True 77 | 78 | 79 | ..\packages\OneScript.1.0.17\lib\net40\ScriptEngine.dll 80 | 81 | 82 | ..\packages\OneScript.StandardLibrary.1.0.17\lib\net40\ScriptEngine.HostedScript.dll 83 | 84 | 85 | 86 | 87 | 88 | ..\packages\System.Data.SQLite.Core.1.0.104.0\lib\net45\System.Data.SQLite.dll 89 | True 90 | 91 | 92 | ..\packages\System.Data.SQLite.EF6.1.0.104.0\lib\net45\System.Data.SQLite.EF6.dll 93 | True 94 | 95 | 96 | ..\packages\System.Data.SQLite.Linq.1.0.104.0\lib\net45\System.Data.SQLite.Linq.dll 97 | True 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}. 116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /tests/test-reader.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Функция ПолучитьТекстИзФайла(ИмяФайла) 7 | ФайлОбмена = Новый Файл(ИмяФайла); 8 | Данные = ""; 9 | Если ФайлОбмена.Существует() Тогда 10 | Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); 11 | Данные = Текст.Прочитать(); 12 | Текст.Закрыть(); 13 | Иначе 14 | Возврат Ложь; 15 | КонецЕсли; 16 | возврат Данные; 17 | КонецФункции 18 | 19 | Процедура Инициализация() 20 | КонецПроцедуры 21 | 22 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 23 | 24 | Суфикс = "НетПараметровДоступа"; 25 | 26 | юТест = Тестирование; 27 | 28 | СписокТестов = Новый Массив; 29 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_sqlite"+Суфикс); 30 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_mssqlserver"+Суфикс); 31 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_mysql"+Суфикс); 32 | СписокТестов.Добавить("Тест_Должен_ПрочитатьДанные_postgresql"+Суфикс); 33 | 34 | Возврат СписокТестов; 35 | 36 | КонецФункции 37 | 38 | Процедура Тест_Должен_ПрочитатьДанные_sqlite() Экспорт 39 | 40 | Соединение = Новый Соединение(); 41 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 42 | Соединение.ИмяБазы = ":memory:"; 43 | Соединение.Открыть(); 44 | 45 | ЗапросВставка = Новый Запрос(); 46 | ЗапросВставка.УстановитьСоединение(Соединение); 47 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 text, col3 REAL, col4 NUMERIC, col5 blob)"; 48 | ЗапросВставка.ВыполнитьКоманду(); 49 | 50 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5 ) values (@col1, @col2, @col3, @col4, @col5)"; 51 | ЗапросВставка.УстановитьПараметр("col1", 1); 52 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 53 | ЗапросВставка.УстановитьПараметр("col3", 1.1234567890); 54 | ЗапросВставка.УстановитьПараметр("col4", 1.1234567890); 55 | ЗапросВставка.УстановитьПараметр("col5", "Большой текст"); 56 | ЗапросВставка.ВыполнитьКоманду(); 57 | 58 | ЗапросВставка.Текст = "select * from testtypes"; 59 | ЗапросВставка.Параметры.Очистить(); 60 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 61 | 62 | Для каждого СтрТЗ Из ТЗ Цикл 63 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 64 | Сообщить("" + А + ":" + СтрТЗ[А]); 65 | КонецЦикла; 66 | КонецЦикла; 67 | 68 | КонецПроцедуры 69 | 70 | Процедура Тест_Должен_ПрочитатьДанные_mssqlserver() Экспорт 71 | 72 | Соединение = Новый Соединение(); 73 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MSSQLServer; 74 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\ms-sql-server-con-str.txt"); 75 | Соединение.Открыть(); 76 | 77 | ЗапросВставка = Новый Запрос(); 78 | ЗапросВставка.УстановитьСоединение(Соединение); 79 | 80 | ЗапросВставка.Текст = "IF OBJECT_ID(N'testtypes', N'U') IS NOT NULL DROP TABLE testtypes;"; 81 | ЗапросВставка.ВыполнитьКоманду(); 82 | 83 | 84 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 datetime, col5 bit, col6 float, col7 ntext)"; 85 | ЗапросВставка.ВыполнитьКоманду(); 86 | 87 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 88 | ЗапросВставка.УстановитьПараметр("col1", 1); 89 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 90 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 91 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 92 | ЗапросВставка.УстановитьПараметр("col5", Истина); 93 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 94 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 95 | ЗапросВставка.ВыполнитьКоманду(); 96 | 97 | ЗапросВставка.Текст = "select * from testtypes"; 98 | ЗапросВставка.Параметры.Очистить(); 99 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 100 | 101 | Для каждого СтрТЗ Из ТЗ Цикл 102 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 103 | Сообщить("" + А + ":" + СтрТЗ[А]); 104 | КонецЦикла; 105 | КонецЦикла; 106 | 107 | КонецПроцедуры 108 | 109 | Процедура Тест_Должен_ПрочитатьДанные_mysql() Экспорт 110 | 111 | Соединение = Новый Соединение(); 112 | Соединение.ТипСУБД = Соединение.ТипыСУБД.MySQL; 113 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\mysql-con-str.txt"); 114 | Соединение.Открыть(); 115 | 116 | ЗапросВставка = Новый Запрос(); 117 | ЗапросВставка.УстановитьСоединение(Соединение); 118 | 119 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testtypes;"; 120 | ЗапросВставка.ВыполнитьКоманду(); 121 | 122 | 123 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 datetime, col5 bit, col6 float, col7 text)"; 124 | ЗапросВставка.ВыполнитьКоманду(); 125 | 126 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 127 | ЗапросВставка.УстановитьПараметр("col1", 1); 128 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 129 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 130 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 131 | ЗапросВставка.УстановитьПараметр("col5", Истина); 132 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 133 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 134 | ЗапросВставка.ВыполнитьКоманду(); 135 | 136 | ЗапросВставка.Текст = "select * from testtypes"; 137 | ЗапросВставка.Параметры.Очистить(); 138 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 139 | 140 | Для каждого СтрТЗ Из ТЗ Цикл 141 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 142 | Сообщить("" + А + ":" + СтрТЗ[А]); 143 | КонецЦикла; 144 | КонецЦикла; 145 | 146 | КонецПроцедуры 147 | 148 | Процедура Тест_Должен_ПрочитатьДанные_postgresql() Экспорт 149 | 150 | Соединение = Новый Соединение(); 151 | Соединение.ТипСУБД = Соединение.ТипыСУБД.PostgreSQL; 152 | Соединение.СтрокаСоединения = ПолучитьТекстИзФайла("fixtures\pgsql-con-str.txt"); 153 | Соединение.Открыть(); 154 | 155 | ЗапросВставка = Новый Запрос(); 156 | ЗапросВставка.УстановитьСоединение(Соединение); 157 | 158 | ЗапросВставка.Текст = "DROP TABLE IF EXISTS testtypes;"; 159 | ЗапросВставка.ВыполнитьКоманду(); 160 | 161 | 162 | ЗапросВставка.Текст = "Create table testtypes (col1 integer, col2 varchar(50), col3 char(10), col4 date, col5 boolean, col6 float, col7 text)"; 163 | ЗапросВставка.ВыполнитьКоманду(); 164 | 165 | ЗапросВставка.Текст = "insert into testtypes (col1, col2, col3 , col4 , col5, col6, col7 ) values (@col1, @col2, @col3, @col4, @col5, @col6, @col7)"; 166 | ЗапросВставка.УстановитьПараметр("col1", 1); 167 | ЗапросВставка.УстановитьПараметр("col2", "Сергей"); 168 | ЗапросВставка.УстановитьПараметр("col3", "mycharstr"); 169 | ЗапросВставка.УстановитьПараметр("col4", Дата(1980,9,13)); 170 | ЗапросВставка.УстановитьПараметр("col5", Истина); 171 | ЗапросВставка.УстановитьПараметр("col6", 1.1234567890); 172 | ЗапросВставка.УстановитьПараметр("col7", "много много текста"); 173 | ЗапросВставка.ВыполнитьКоманду(); 174 | 175 | ЗапросВставка.Текст = "select * from testtypes"; 176 | ЗапросВставка.Параметры.Очистить(); 177 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 178 | 179 | Для каждого СтрТЗ Из ТЗ Цикл 180 | Для А = 0 по ТЗ.Колонки.Количество()-1 Цикл 181 | Сообщить("" + А + ":" + СтрТЗ[А]); 182 | КонецЦикла; 183 | КонецЦикла; 184 | 185 | КонецПроцедуры 186 | 187 | 188 | ////////////////////////////////////////////////////////////////////////////////////// 189 | // Инициализация 190 | 191 | Инициализация(); 192 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${fileBasename}: the current opened file's basename 5 | // ${fileDirname}: the current opened file's dirname 6 | // ${fileExtname}: the current opened file's extension 7 | // ${cwd}: the current working directory of the spawned process 8 | 9 | { 10 | "version": "2.0.0", 11 | "_runner": "terminal", 12 | "windows": { 13 | "command": "cmd", 14 | "args": ["/c", "chcp 65001 &&"] 15 | }, 16 | "linux": { 17 | "command": "sh", 18 | "args": ["-c"] 19 | }, 20 | "isShellCommand": true, 21 | // "showOutput": "silent", 22 | "_runner": "terminal", 23 | "tasks": [ 24 | { 25 | "taskName": "Testing project", 26 | "args": [ 27 | "1testrunner", 28 | "-runall", 29 | "${workspaceRoot}/tests" 30 | ], 31 | "echoCommand": true, 32 | "showOutput": "always", 33 | "suppressTaskName": true, 34 | // "isBuildCommand": false, 35 | "isTestCommand": false, 36 | "problemMatcher": { 37 | "fileLocation": "absolute", 38 | "pattern": { 39 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 40 | "file": 1, 41 | "location": 2, 42 | "message": 3 43 | } 44 | } 45 | }, 46 | { 47 | "taskName": "Testing current test-file", 48 | "args": [ 49 | "1testrunner", 50 | "-run", 51 | "${file}", 52 | ], 53 | "echoCommand": true, 54 | "showOutput": "always", 55 | "suppressTaskName": true, 56 | "isBuildCommand": false, 57 | "isTestCommand": true, 58 | "problemMatcher": { 59 | "fileLocation": "absolute", 60 | "pattern": { 61 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 62 | "file": 1, 63 | "location": 2, 64 | "message": 3 65 | } 66 | } 67 | }, 68 | { 69 | "taskName": "Exec all features", 70 | "args": [ 71 | "1bdd", 72 | "${workspaceRoot}/features", 73 | "-out", 74 | "${workspaceRoot}/exec.log" 75 | ], 76 | "echoCommand": true, 77 | "showOutput": "always", 78 | "suppressTaskName": true, 79 | "isBuildCommand": true, 80 | "isTestCommand": false, 81 | "problemMatcher": { 82 | "fileLocation": "absolute", 83 | "pattern": { 84 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 85 | "file": 1, 86 | "location": 2, 87 | "message": 3 88 | } 89 | } 90 | }, 91 | { 92 | "taskName": "Exec feature", 93 | "args": [ 94 | "1bdd", 95 | "${file}", 96 | "-out", 97 | "${workspaceRoot}/exec.log" 98 | ], 99 | "echoCommand": true, 100 | "showOutput": "always", 101 | "suppressTaskName": true, 102 | "isBuildCommand": false, 103 | "isTestCommand": true, 104 | "problemMatcher": { 105 | "fileLocation": "absolute", 106 | "pattern": [ 107 | { 108 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 109 | "file": 1, 110 | "location": 2, 111 | "message": 3 112 | } 113 | ] 114 | } 115 | }, 116 | { 117 | "taskName": "Exec feature for current step def", 118 | "args": [ 119 | "1bdd", 120 | "${fileDirname}/../${fileBasenameNoExtension}.feature", 121 | "-fail-fast", 122 | "-out", 123 | "${workspaceRoot}/exec.log" 124 | ], 125 | "echoCommand": true, 126 | "showOutput": "always", 127 | "suppressTaskName": true, 128 | "isBuildCommand": false, 129 | "isTestCommand": true, 130 | "problemMatcher": { 131 | "fileLocation": "absolute", 132 | "pattern": [ 133 | { 134 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 135 | "file": 1, 136 | "location": 2, 137 | "message": 3 138 | } 139 | ] 140 | } 141 | }, 142 | { 143 | "taskName": "Generate feature steps", 144 | "args": [ 145 | "1bdd", 146 | "gen", 147 | "${file}", 148 | "-out", 149 | "${workspaceRoot}/exec.log" 150 | ], 151 | "echoCommand": true, 152 | "showOutput": "always", 153 | "suppressTaskName": true, 154 | "isBuildCommand": false, 155 | "isTestCommand": false, 156 | "problemMatcher": { 157 | "fileLocation": "absolute", 158 | "pattern": { 159 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)", 160 | "file": 1, 161 | "location": 2, 162 | "message": 3 163 | } 164 | } 165 | }, 166 | { 167 | "taskName": "Opm: package build", 168 | "args": [ 169 | "opm", 170 | "build", 171 | "${workspaceRoot}" 172 | ], 173 | "echoCommand": true, 174 | "showOutput": "always", 175 | "suppressTaskName": true, 176 | "isBuildCommand": false 177 | }, 178 | { 179 | "taskName": "OneScript: compile", 180 | "args": [ 181 | "oscript", 182 | "-encoding=utf-8", 183 | "-compile", 184 | "${file}" 185 | ], 186 | "echoCommand": true, 187 | "showOutput": "always", 188 | "suppressTaskName": true, 189 | "isBuildCommand": false 190 | }, 191 | { 192 | "taskName": "OneScript: check", 193 | "args": [ 194 | "oscript", 195 | "-encoding=utf-8", 196 | "-check", 197 | "${file}" 198 | ], 199 | "echoCommand": true, 200 | "showOutput": "always", 201 | "suppressTaskName": true, 202 | "isBuildCommand": false 203 | }, 204 | { 205 | "taskName": "OneScript: make", 206 | "args": [ 207 | "oscript", 208 | "-encoding=utf-8", 209 | "-make", 210 | "${file}", 211 | "${fileBasename}.exe" 212 | ], 213 | "echoCommand": true, 214 | "showOutput": "always", 215 | "suppressTaskName": true, 216 | "isBuildCommand": false 217 | }, 218 | { 219 | "taskName": "OneScript: run", 220 | "args": [ 221 | "oscript", 222 | "-encoding=utf-8", 223 | "${file}" 224 | ], 225 | "echoCommand": true, 226 | "showOutput": "always", 227 | "suppressTaskName": true, 228 | "isBuildCommand": true, 229 | "problemMatcher": { 230 | "fileLocation": "absolute", 231 | "pattern": { 232 | "regexp": "^{Модуль\\s+(.*)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+(.*)}$", 233 | "file": 1, 234 | "location": 2, 235 | "message": 3 236 | } 237 | } 238 | } 239 | ] 240 | } -------------------------------------------------------------------------------- /oscript-sql/SQLQuery.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine.Contexts; 2 | using ScriptEngine.Machine; 3 | using ScriptEngine.HostedScript.Library; 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Data.SQLite; 10 | using System.Data.Common; 11 | using System.Data.Sql; 12 | using System.Data.SqlClient; 13 | using System.Data; 14 | using MySql.Data.MySqlClient; 15 | using Npgsql; 16 | 17 | namespace OScriptSql 18 | { 19 | /// 20 | /// Предназначен для выполнения запросов к базе данных. 21 | /// 22 | [ContextClass("Запрос", "Query")] 23 | public class Query : AutoContext, IOScriptQuery 24 | { 25 | 26 | private string _text; 27 | private DbConnection _connection; 28 | private DbCommand _command; 29 | private StructureImpl _parameters; 30 | 31 | private DBConnector _connector; 32 | 33 | public Query() 34 | { 35 | _parameters = new StructureImpl(); 36 | _text = ""; 37 | } 38 | 39 | [ScriptConstructor] 40 | public static IRuntimeContextInstance Constructor() 41 | { 42 | return new Query(); 43 | } 44 | 45 | 46 | [ContextProperty("Параметры", "Parameters")] 47 | public StructureImpl Parameters 48 | { 49 | get { return _parameters; } 50 | } 51 | 52 | 53 | /// 54 | /// Управление таймауотом 55 | /// 56 | /// Число 57 | [ContextProperty("Таймаут", "Timeout")] 58 | public int Timeout 59 | { 60 | get { return _command.CommandTimeout; } 61 | set 62 | { 63 | _command.CommandTimeout = value; 64 | } 65 | } 66 | 67 | /// 68 | /// Содержит исходный текст выполняемого запроса. 69 | /// 70 | /// Строка 71 | [ContextProperty("Текст", "Text")] 72 | public string Text 73 | { 74 | get { return _text; } 75 | set 76 | { 77 | _text = value; 78 | } 79 | } 80 | 81 | private void setDbCommandParameters() 82 | { 83 | DbParameter param = null; 84 | 85 | foreach (IValue prm in _parameters) 86 | { 87 | var paramVal = ((KeyAndValueImpl)prm).Value; 88 | var paramKey = ((KeyAndValueImpl)prm).Key.AsString(); 89 | 90 | if (paramVal.DataType == DataType.String) 91 | { 92 | param = _command.CreateParameter(); 93 | param.ParameterName = "@" + paramKey; 94 | param.Value = paramVal.AsString(); 95 | } 96 | else if (paramVal.DataType == DataType.Number) 97 | { 98 | param = _command.CreateParameter(); 99 | param.ParameterName = "@" + paramKey; 100 | param.Value = paramVal.AsNumber(); 101 | } 102 | else if (paramVal.DataType == DataType.Date) 103 | { 104 | param = _command.CreateParameter(); 105 | param.ParameterName = "@" + paramKey; 106 | param.Value = paramVal.AsDate(); 107 | } 108 | else if (paramVal.DataType == DataType.Boolean) 109 | { 110 | param = _command.CreateParameter(); 111 | param.ParameterName = "@" + paramKey; 112 | param.Value = paramVal.AsBoolean(); 113 | } 114 | 115 | _command.Parameters.Add(param); 116 | } 117 | 118 | } 119 | 120 | /// 121 | /// Выполняет запрос к базе данных. 122 | /// 123 | /// РезультатЗапроса 124 | [ContextMethod("Выполнить", "Execute")] 125 | public IValue Execute() 126 | { 127 | var result = new QueryResult(); 128 | DbDataReader reader = null; 129 | 130 | _command.Parameters.Clear(); 131 | _command.CommandText = _text; 132 | 133 | setDbCommandParameters(); 134 | reader = _command.ExecuteReader(); 135 | 136 | result = new QueryResult(reader); 137 | return result; 138 | } 139 | 140 | /// 141 | /// Выполняет запрос к базе данных. Cиноним для Выполнить 142 | /// 143 | /// РезультатЗапроса 144 | [ContextMethod("ВыполнитьЗапрос", "ExecuteQuery")] 145 | public IValue ExecuteQuery() 146 | { 147 | return Execute(); 148 | } 149 | 150 | /// 151 | /// Выполняет запрос на модификацию к базе данных. 152 | /// 153 | /// Число - Число обработанных строк. 154 | [ContextMethod("ВыполнитьКоманду", "ExecuteCommand")] 155 | public int ExecuteCommand() 156 | { 157 | var sec = new SystemEnvironmentContext(); 158 | string versionOnescript = sec.Version; 159 | 160 | string[] verInfo = versionOnescript.Split('.'); 161 | 162 | //if (Convert.ToInt64(verInfo[2]) >= 15) 163 | //{ 164 | // Console.WriteLine("> 15"); 165 | //} 166 | 167 | var result = new QueryResult(); 168 | 169 | _command.Parameters.Clear(); 170 | _command.CommandText = _text; 171 | setDbCommandParameters(); 172 | return _command.ExecuteNonQuery(); 173 | } 174 | 175 | /// 176 | /// Устанавливает параметр запроса. Параметры доступны для обращения в тексте запроса. 177 | /// С помощью этого метода можно передавать переменные в запрос, например, для использования в условиях запроса. 178 | /// ВАЖНО: В запросе имя параметра указывается с использованием '@'. 179 | /// 180 | /// 181 | /// Запрос.Текст = "select * from mytable where category_id = @category_id"; 182 | /// Запрос.УстановитьПараметр("category_id", 1); 183 | /// 184 | /// Строка - Имя параметра 185 | /// Произвольный - Значение параметра 186 | [ContextMethod("УстановитьПараметр", "SetParameter")] 187 | public void SetParameter(string ParametrName, IValue ParametrValue) 188 | { 189 | _parameters.Insert(ParametrName, ParametrValue); 190 | } 191 | 192 | /// 193 | /// Установка соединения с БД. 194 | /// 195 | /// Соединение - объект соединение с БД 196 | [ContextMethod("УстановитьСоединение", "SetConnection")] 197 | public void SetConnection(DBConnector connector) 198 | { 199 | _connector = connector; 200 | _connection = connector.Connection; 201 | 202 | if (_connector.DbType == (new EnumDBType()).sqlite) 203 | { 204 | _command = new SQLiteCommand((SQLiteConnection)connector.Connection); 205 | } 206 | else if (_connector.DbType == (new EnumDBType()).MSSQLServer) 207 | { 208 | _command = new SqlCommand(); 209 | _command.Connection = (SqlConnection)connector.Connection; 210 | } 211 | else if (_connector.DbType == (new EnumDBType()).MySQL) 212 | { 213 | _command = new MySqlCommand(); 214 | _command.Connection = (MySqlConnection)connector.Connection; 215 | } 216 | else if (_connector.DbType == (new EnumDBType()).PostgreSQL) 217 | { 218 | _command = new NpgsqlCommand(); 219 | _command.Connection = (NpgsqlConnection)connector.Connection; 220 | } 221 | 222 | } 223 | 224 | [ContextMethod("ИДПоследнейДобавленнойЗаписи", "LastInsertRowId")] 225 | public int LastInsertRowId() 226 | { 227 | if (_connector.DbType == (new EnumDBType()).sqlite) 228 | { 229 | return (int)((SQLiteConnection)_connection).LastInsertRowId; 230 | } 231 | else if (_connector.DbType == (new EnumDBType()).MSSQLServer) 232 | { 233 | return -1; 234 | } 235 | else if (_connector.DbType == (new EnumDBType()).MySQL) 236 | { 237 | return (int)((MySqlCommand)_command).LastInsertedId; 238 | } 239 | else if (_connector.DbType == (new EnumDBType()).PostgreSQL) 240 | { 241 | return -1; 242 | } 243 | return -1; 244 | } 245 | 246 | } 247 | } 248 | -------------------------------------------------------------------------------- /tests/test-sqlite.os: -------------------------------------------------------------------------------- 1 | #Использовать asserts 2 | #Использовать sql 3 | 4 | Перем юТест; 5 | 6 | Процедура Инициализация() 7 | //ПодключитьВнешнююКомпоненту(КаталогПрограммы()+"\ext\sql\sql.dll"); 8 | КонецПроцедуры 9 | 10 | Функция ПолучитьСписокТестов(Тестирование) Экспорт 11 | 12 | юТест = Тестирование; 13 | 14 | СписокТестов = Новый Массив; 15 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединениеОткрыто"); 16 | СписокТестов.Добавить("Тест_Должен_ПроверитьСоединениеЗакрыто"); 17 | СписокТестов.Добавить("Тест_Должен_ВернутьСтатусОткрыто"); 18 | СписокТестов.Добавить("Тест_Должен_ВернутьСтатусЗакрыто"); 19 | СписокТестов.Добавить("Тест_Должен_СоздатьБД"); 20 | СписокТестов.Добавить("Тест_Должен_СоздатьТаблицу"); 21 | СписокТестов.Добавить("Тест_Должен_ДобавитьСтроки"); 22 | СписокТестов.Добавить("Тест_Должен_ВернутьИДДобавленнойтроки"); 23 | СписокТестов.Добавить("Тест_Должен_ДолженИзменитьСтроки"); 24 | СписокТестов.Добавить("Тест_Должен_ДолженПолучитьВыборку"); 25 | 26 | СписокТестов.Добавить("Тест_Должен_СоздатьИнМемориБД"); 27 | СписокТестов.Добавить("Тест_Должен_СоздатьИнМемориБДИзСоединения"); 28 | 29 | СписокТестов.Добавить("Тест_Должен_ВернутьРезультатЗапросаПустой"); 30 | СписокТестов.Добавить("Тест_Должен_ВернутьРезультатЗапросаНеПустой"); 31 | 32 | Возврат СписокТестов; 33 | 34 | КонецФункции 35 | 36 | Процедура Тест_Должен_ПроверитьСоединениеОткрыто() Экспорт 37 | Соединение = Новый Соединение(); 38 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 39 | Соединение.ИмяБазы = ":memory:"; 40 | Соединение.Открыть(); 41 | Ожидаем.Что(Соединение.Открыто).ЭтоИстина(); 42 | Соединение.Закрыть(); 43 | КонецПроцедуры 44 | 45 | Процедура Тест_Должен_ПроверитьСоединениеЗакрыто() Экспорт 46 | Соединение = Новый Соединение(); 47 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 48 | Соединение.ИмяБазы = ":memory:"; 49 | Соединение.Открыть(); 50 | Соединение.Закрыть(); 51 | Ожидаем.Что(Соединение.Открыто).ЭтоЛожь(); 52 | КонецПроцедуры 53 | 54 | Процедура Тест_Должен_ВернутьСтатусОткрыто() Экспорт 55 | Соединение = Новый Соединение(); 56 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 57 | Соединение.ИмяБазы = ":memory:"; 58 | Соединение.Открыть(); 59 | Ожидаем.Что(Соединение.Состояние).Равно("Open"); 60 | Соединение.Закрыть(); 61 | КонецПроцедуры 62 | 63 | Процедура Тест_Должен_ВернутьСтатусЗакрыто() Экспорт 64 | Соединение = Новый Соединение(); 65 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 66 | Соединение.ИмяБазы = ":memory:"; 67 | Соединение.Открыть(); 68 | Соединение.Закрыть(); 69 | Ожидаем.Что(Соединение.Состояние).Равно("Closed"); 70 | КонецПроцедуры 71 | 72 | 73 | Процедура Тест_Должен_СоздатьБД() Экспорт 74 | 75 | ФайлБД = Новый Файл("fixtures\test.sqlite"); 76 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 77 | Если (ФайлБД.Существует()) Тогда 78 | УдалитьФайлы(ПолноеИмяБД); 79 | КонецЕсли; 80 | 81 | Соединение = Новый Соединение(); 82 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 83 | Соединение.ИмяБазы = ПолноеИмяБД; 84 | Соединение.Открыть(); 85 | Соединение.Закрыть(); 86 | 87 | Ожидаем.Что(ФайлБД.Существует()).ЭтоИстина(); 88 | 89 | Освободитьобъект(ФайлБД); 90 | 91 | УдалитьФайлы(ПолноеИмяБД); 92 | 93 | КонецПроцедуры 94 | 95 | Процедура Тест_Должен_СоздатьТаблицу() Экспорт 96 | 97 | ФайлБД = Новый Файл("fixtures\test-create-table.sqlite"); 98 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 99 | Если (ФайлБД.Существует()) Тогда 100 | УдалитьФайлы(ПолноеИмяБД); 101 | КонецЕсли; 102 | 103 | Соединение = Новый Соединение(); 104 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 105 | Соединение.ИмяБазы = ПолноеИмяБД; 106 | Соединение.Открыть(); 107 | 108 | ЗапросВставка = Новый Запрос(); 109 | ЗапросВставка.УстановитьСоединение(Соединение); 110 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 111 | ЗапросВставка.ВыполнитьКоманду(); 112 | 113 | Соединение.Закрыть(); 114 | 115 | КонецПроцедуры 116 | 117 | Процедура Тест_Должен_ДобавитьСтроки() Экспорт 118 | 119 | ФайлБД = Новый Файл("fixtures\test-table-add.sqlite"); 120 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 121 | Если (ФайлБД.Существует()) Тогда 122 | УдалитьФайлы(ПолноеИмяБД); 123 | КонецЕсли; 124 | 125 | Соединение = Новый Соединение(); 126 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 127 | Соединение.ИмяБазы = ПолноеИмяБД; 128 | Соединение.Открыть(); 129 | 130 | ЗапросВставка = Новый Запрос(); 131 | ЗапросВставка.УстановитьСоединение(Соединение); 132 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 133 | ЗапросВставка.ВыполнитьКоманду(); 134 | 135 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 136 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 137 | Результат = ЗапросВставка.ВыполнитьКоманду(); 138 | 139 | Соединение.Закрыть(); 140 | 141 | Ожидаем.Что(Результат).Равно(1); 142 | 143 | КонецПроцедуры 144 | 145 | Процедура Тест_Должен_ВернутьИДДобавленнойтроки() Экспорт 146 | 147 | Соединение = Новый Соединение(); 148 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 149 | Соединение.ИмяБазы = ":memory:"; 150 | Соединение.Открыть(); 151 | 152 | ЗапросВставка = Новый Запрос(); 153 | ЗапросВставка.УстановитьСоединение(Соединение); 154 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 155 | ЗапросВставка.ВыполнитьКоманду(); 156 | 157 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 158 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 159 | Результат = ЗапросВставка.ВыполнитьКоманду(); 160 | 161 | Ожидаем.Что(ЗапросВставка.ИДПоследнейДобавленнойЗаписи()).Равно(1); 162 | Соединение.Закрыть(); 163 | 164 | 165 | КонецПроцедуры 166 | 167 | Процедура Тест_Должен_ДолженИзменитьСтроки() Экспорт 168 | 169 | ФайлБД = Новый Файл("fixtures\test-table-edit.sqlite"); 170 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 171 | Если (ФайлБД.Существует()) Тогда 172 | УдалитьФайлы(ПолноеИмяБД); 173 | КонецЕсли; 174 | 175 | Соединение = Новый Соединение(); 176 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 177 | Соединение.ИмяБазы = ПолноеИмяБД; 178 | Соединение.Открыть(); 179 | 180 | ЗапросВставка = Новый Запрос(); 181 | ЗапросВставка.УстановитьСоединение(Соединение); 182 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 183 | ЗапросВставка.ВыполнитьКоманду(); 184 | 185 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 186 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 187 | ЗапросВставка.ВыполнитьКоманду(); 188 | 189 | ЗапросВставка.Текст = "update users set name = @name"; 190 | ЗапросВставка.УстановитьПараметр("name", "Сергей Александрович"); 191 | Результат = ЗапросВставка.ВыполнитьКоманду(); 192 | 193 | Соединение.Закрыть(); 194 | 195 | Ожидаем.Что(Результат).Равно(1); 196 | 197 | КонецПроцедуры 198 | 199 | 200 | Процедура Тест_Должен_ДолженПолучитьВыборку() Экспорт 201 | 202 | ФайлБД = Новый Файл("fixtures\test-table-select.sqlite"); 203 | ПолноеИмяБД = ФайлБД.ПолноеИмя; 204 | Если (ФайлБД.Существует()) Тогда 205 | УдалитьФайлы(ПолноеИмяБД); 206 | КонецЕсли; 207 | 208 | Соединение = Новый Соединение(); 209 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 210 | Соединение.ИмяБазы = ПолноеИмяБД; 211 | Соединение.Открыть(); 212 | 213 | ЗапросВставка = Новый Запрос(); 214 | ЗапросВставка.УстановитьСоединение(Соединение); 215 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 216 | ЗапросВставка.ВыполнитьКоманду(); 217 | 218 | ЗапросВставка.Текст = "insert into users (name) values(@name)"; 219 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 220 | ЗапросВставка.ВыполнитьКоманду(); 221 | 222 | ЗапросВставка.Текст = "select * from users"; 223 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 224 | 225 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 226 | 227 | Соединение.Закрыть(); 228 | 229 | КонецПроцедуры 230 | 231 | Процедура Тест_Должен_СоздатьИнМемориБД() Экспорт 232 | 233 | Соединение = Новый Соединение(); 234 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 235 | Соединение.ИмяБазы = ":memory:"; 236 | Соединение.Открыть(); 237 | 238 | ЗапросВставка = Новый Запрос(); 239 | ЗапросВставка.УстановитьСоединение(Соединение); 240 | ЗапросВставка.Текст = "Create table users (id integer, name text)"; 241 | ЗапросВставка.ВыполнитьКоманду(); 242 | 243 | ЗапросВставка.Текст = "insert into users (id, name) values (@id, @name)"; 244 | ЗапросВставка.УстановитьПараметр("id", 1); 245 | ЗапросВставка.УстановитьПараметр("name", "Сергей"); 246 | ЗапросВставка.ВыполнитьКоманду(); 247 | 248 | ЗапросВставка.Текст = "select * from users"; 249 | ТЗ = ЗапросВставка.Выполнить().Выгрузить(); 250 | 251 | // Для каждого СтрТЗ Из ТЗ Цикл 252 | // Сообщить("id:" +СтрТЗ.id); 253 | // Сообщить("name:" + СтрТЗ.name); 254 | // // Сообщить("born:" + СтрТЗ.born); 255 | // КонецЦикла; 256 | 257 | Ожидаем.Что(ТЗ.Количество()).Равно(1); 258 | Ожидаем.Что(ТЗ[0][1]).Равно("Сергей"); 259 | 260 | Соединение.Закрыть(); 261 | 262 | 263 | КонецПроцедуры 264 | 265 | Процедура Тест_Должен_СоздатьИнМемориБДИзСоединения() Экспорт 266 | 267 | Соединение = Новый Соединение(); 268 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 269 | Соединение.ИмяБазы = ":memory:"; 270 | Соединение.Открыть(); 271 | 272 | Запрос = Соединение.СоздатьЗапрос(); 273 | Запрос.Текст = "Create table users1 (id integer, name text)"; 274 | Запрос.ВыполнитьКоманду(); 275 | 276 | Соединение.Закрыть(); 277 | 278 | Освободитьобъект(Соединение); 279 | 280 | КонецПроцедуры 281 | 282 | Процедура Тест_Должен_ВернутьРезультатЗапросаПустой() Экспорт 283 | 284 | Соединение = Новый Соединение(); 285 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 286 | Соединение.ИмяБазы = ":memory:"; 287 | Соединение.Открыть(); 288 | 289 | Запрос = Соединение.СоздатьЗапрос(); 290 | Запрос.Текст = "select * from SQLITE_MASTER where type = 999"; 291 | РезультатЗапроса = Запрос.Выполнить(); 292 | 293 | Ожидаем.Что(РезультатЗапроса.Пустой()).ЭтоИстина(); 294 | 295 | Соединение.Закрыть(); 296 | 297 | Освободитьобъект(Соединение); 298 | 299 | 300 | КонецПроцедуры 301 | 302 | Процедура Тест_Должен_ВернутьРезультатЗапросаНеПустой() Экспорт 303 | 304 | Соединение = Новый Соединение(); 305 | Соединение.ТипСУБД = Соединение.ТипыСУБД.sqlite; 306 | Соединение.ИмяБазы = ":memory:"; 307 | Соединение.Открыть(); 308 | 309 | Запрос = Соединение.СоздатьЗапрос(); 310 | Запрос.Текст = "select 1"; 311 | РезультатЗапроса = Запрос.Выполнить(); 312 | 313 | Ожидаем.Что(РезультатЗапроса.Пустой()).ЭтоЛожь(); 314 | 315 | Соединение.Закрыть(); 316 | 317 | Освободитьобъект(Соединение); 318 | 319 | 320 | КонецПроцедуры 321 | 322 | ////////////////////////////////////////////////////////////////////////////////////// 323 | // Инициализация 324 | 325 | Инициализация(); 326 | -------------------------------------------------------------------------------- /oscript-sql/DBConnector.cs: -------------------------------------------------------------------------------- 1 | using ScriptEngine.Machine; 2 | using ScriptEngine.HostedScript.Library; 3 | 4 | using System; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | using System.Text; 8 | using System.Threading.Tasks; 9 | using System.Data.Sql; 10 | using ScriptEngine.Machine.Contexts; 11 | using System.Data.SqlClient; 12 | using System.Data.Common; 13 | using System.Data; 14 | using System.Data.SQLite; 15 | using MySql.Data.MySqlClient; 16 | using Npgsql; 17 | 18 | namespace OScriptSql 19 | { 20 | /// 21 | /// Соединение с БД. Используется для указания источника данных объекта Запрос. 22 | /// 23 | [ContextClass("Соединение", "Connection")] 24 | public class DBConnector : AutoContext 25 | { 26 | private int _dbType; 27 | private int _port; 28 | private string _server; 29 | private string _dbName; 30 | private string _login; 31 | private string _password; 32 | private DbConnection _connection; 33 | private string _connectionString; 34 | private string _lastErrorMessage; 35 | 36 | public DBConnector() 37 | { 38 | _dbType = 0; 39 | _port = 0; 40 | _server = ""; 41 | _dbName = ""; 42 | _login = ""; 43 | _password = ""; 44 | _connectionString = ""; 45 | _lastErrorMessage = ""; 46 | _connection = null; 47 | } 48 | 49 | public override string ToString() 50 | { 51 | return "Соединение"; 52 | } 53 | 54 | 55 | /// 56 | /// Типы поддерживаемых СУБД 57 | /// 58 | /// ТипСУБД 59 | [ContextProperty("ТипыСУБД", "DBTypes")] 60 | public IValue DbTypes 61 | { 62 | get 63 | { 64 | var dtype = new EnumDBType(); 65 | return dtype; 66 | } 67 | } 68 | 69 | 70 | /// 71 | /// Тип подключенной СУБД 72 | /// 73 | /// ТипСУБД 74 | [ContextProperty("ТипСУБД", "DBType")] 75 | public int DbType 76 | { 77 | get 78 | { 79 | return _dbType; 80 | } 81 | 82 | set 83 | { 84 | _dbType = value; 85 | } 86 | } 87 | 88 | /// 89 | /// Порт подключения 90 | /// 91 | /// Число 92 | [ContextProperty("Порт", "Port")] 93 | public int Port 94 | { 95 | get 96 | { 97 | return _port; 98 | } 99 | 100 | set 101 | { 102 | _port = value; 103 | } 104 | } 105 | 106 | /// 107 | /// Имя или IP сервера 108 | /// 109 | /// Строка 110 | [ContextProperty("Сервер", "Server")] 111 | public string Server 112 | { 113 | get 114 | { 115 | return _server; 116 | } 117 | 118 | set 119 | { 120 | _server = value; 121 | } 122 | } 123 | 124 | /// 125 | /// Имя базы, в случае с SQLITE - путь к базе 126 | /// 127 | /// Строка 128 | [ContextProperty("ИмяБазы", "DbName")] 129 | public string DbName 130 | { 131 | get 132 | { 133 | return _dbName; 134 | } 135 | 136 | set 137 | { 138 | _dbName = value; 139 | } 140 | } 141 | 142 | /// 143 | /// Пользователь под которым происходит подключение. 144 | /// Если СУБД MS SQL и пользователь не указан - используется Windows авторизация. 145 | /// 146 | /// Строка 147 | [ContextProperty("ИмяПользователя", "Login")] 148 | public string Login 149 | { 150 | get 151 | { 152 | return _login; 153 | } 154 | 155 | set 156 | { 157 | _login = value; 158 | } 159 | } 160 | 161 | /// 162 | /// Пароль пользователя 163 | /// 164 | /// Строка 165 | [ContextProperty("Пароль", "Password")] 166 | public string Password 167 | { 168 | get 169 | { 170 | return _password; 171 | } 172 | 173 | set 174 | { 175 | _password = value; 176 | } 177 | } 178 | 179 | /// 180 | /// Статус соединения с БД 181 | /// 182 | /// Булево 183 | [ContextProperty("Открыто", "IsOpen")] 184 | public bool IsOpen 185 | { 186 | get 187 | { 188 | if ((_connection == null)) 189 | { 190 | return false; 191 | } 192 | 193 | switch (_connection.State) 194 | { 195 | case ConnectionState.Broken: return false; 196 | case ConnectionState.Closed: return false; 197 | case ConnectionState.Connecting: return false; 198 | default: return true; 199 | } 200 | 201 | } 202 | } 203 | 204 | /// 205 | /// Состояние соединения: 206 | /// 207 | /// - Closed - Закрыто. 208 | /// - Open - Открыто. 209 | /// - Connecting - Соединяется с источником. 210 | /// - Executing - Выполняет команду 211 | /// - Fetching - Получает данные 212 | /// - Broken - Соединение оборвано. 213 | /// 214 | [ContextProperty("Состояние", "State")] 215 | public string State 216 | { 217 | get 218 | { 219 | if ((_connection == null)) 220 | { 221 | return "Closed"; 222 | } 223 | return _connection.State.ToString(); 224 | } 225 | } 226 | 227 | /// 228 | /// Текст последней ошибки 229 | /// 230 | /// Строка 231 | [ContextProperty("ПоследнееСообщениеОбОшибке", "LastErrorMessage")] 232 | public string LastErrorMessage 233 | { 234 | get 235 | { 236 | return _lastErrorMessage; 237 | } 238 | } 239 | 240 | public DbConnection Connection 241 | { 242 | get 243 | { 244 | return _connection; 245 | } 246 | } 247 | 248 | /// 249 | /// Подготовленная строка соединения. В случае sqlite аналог ИмяБазы 250 | /// 251 | /// Строка 252 | [ContextProperty("СтрокаСоединения", "ConnectionString")] 253 | public string ConnectionString 254 | { 255 | get 256 | { 257 | return _connectionString; 258 | } 259 | 260 | set 261 | { 262 | _connectionString = value; 263 | } 264 | } 265 | 266 | [ScriptConstructor] 267 | public static IRuntimeContextInstance Constructor() 268 | { 269 | return new DBConnector(); 270 | } 271 | 272 | /// 273 | /// Открыть соединение с БД 274 | /// 275 | /// Булево 276 | [ContextMethod("Открыть", "Open")] 277 | public bool Open() 278 | { 279 | if (DbType == (new EnumDBType()).sqlite) 280 | { 281 | if (ConnectionString == string.Empty && DbName != string.Empty) 282 | ConnectionString = string.Format("Data Source={0};", DbName); 283 | 284 | _connection = new SQLiteConnection(ConnectionString); 285 | 286 | return OpenConnection(); 287 | } 288 | else if (DbType == (new EnumDBType()).MSSQLServer) 289 | { 290 | _connection = new SqlConnection(); 291 | 292 | if (ConnectionString != String.Empty) 293 | { 294 | _connection.ConnectionString = ConnectionString; 295 | } 296 | else 297 | { 298 | _connectionString = @"Data Source=" + Server; 299 | if (Port != 0) 300 | { 301 | _connectionString += "," + Port.ToString(); 302 | } 303 | _connectionString += "; Initial Catalog= " + DbName + ";"; 304 | 305 | if (Login != String.Empty) 306 | { 307 | _connectionString += "User ID = " + Login +";"; 308 | if (Password != String.Empty) 309 | { 310 | _connectionString += "Password = " + Password + ";"; 311 | } 312 | } 313 | else 314 | { 315 | _connectionString += "Integrated Security=True"; 316 | } 317 | 318 | _connection.ConnectionString = _connectionString; 319 | } 320 | 321 | return OpenConnection(); 322 | } 323 | else if (DbType == (new EnumDBType()).MySQL) 324 | { 325 | if (ConnectionString == String.Empty) 326 | { 327 | _connectionString = ""; 328 | _connectionString += "server=" + _server + ";"; 329 | _connectionString += "user=" + _login + ";"; 330 | _connectionString += (_password != String.Empty ? "password=" + _password + ";" : ""); 331 | _connectionString += (_dbName != String.Empty ? "database=" + _dbName + ";" : ""); 332 | _connectionString += (_port != 0 ? "port=" + _port.ToString() + ";" : ""); 333 | } 334 | _connection = new MySqlConnection(_connectionString); 335 | return OpenConnection(); 336 | } 337 | else if (DbType == (new EnumDBType()).PostgreSQL) 338 | { 339 | if (ConnectionString == String.Empty) 340 | { 341 | _connectionString = ""; 342 | _connectionString += "Host=" + _server + ";"; 343 | _connectionString += "Username=" + _login + ";"; 344 | _connectionString += (_password != String.Empty ? "Password=" + _password + ";" : ""); 345 | _connectionString += (_dbName != String.Empty ? "Database=" + _dbName + ";" : ""); 346 | _connectionString += (_port != 0 ? "port=" + _port.ToString() + ";" : ""); 347 | } 348 | _connection = new NpgsqlConnection(_connectionString); 349 | return OpenConnection(); 350 | } 351 | return false; 352 | } 353 | 354 | private bool OpenConnection() 355 | { 356 | try 357 | { 358 | _connection.Open(); 359 | _lastErrorMessage = ""; 360 | return true; 361 | } 362 | catch (Exception e) 363 | { 364 | _lastErrorMessage = e.Message; 365 | return false; 366 | } 367 | } 368 | 369 | /// 370 | /// Закрыть соединение с БД 371 | /// 372 | [ContextMethod("Закрыть", "Close")] 373 | public void Close() 374 | { 375 | _connection.Close(); 376 | _connection.ConnectionString = ""; 377 | _connection.Dispose(); 378 | _connection = null; 379 | } 380 | 381 | /// 382 | /// Создать запрос с установленным соединением 383 | /// 384 | /// Запрос - Запрос с установленным соединением 385 | [ContextMethod("СоздатьЗапрос", "CreateQuery")] 386 | public Query CreateQuery() 387 | { 388 | var query = new Query(); 389 | query.SetConnection(this); 390 | return query; 391 | } 392 | 393 | } 394 | } 395 | --------------------------------------------------------------------------------