Гидра + MS SQL 2008 R2
Atom Ответить
30.09.2012


Второй день долблюсь – пытаюсь настроить связку с MSSQL, и не удается.
Использую MS SQL 2008 R2 standard.
Гидра 4.1.4
Базу создал скриптом trading.sql (взял с stocksharp.codeplex.com, dev/Documentation)
Скрипт отработал нормально. База создалась, проблем не было.
Добиться того, чтобы Гидра хоть как-то цеплялась к базе мне удалось только в такой конфигурации (из файла Hydra.exe.config):


<connectionStrings>
<add name="SqlServerConStr" connectionString="Server=(local);Database=Trading;User ID=trading;Password=trading;" providerName=""/>
</connectionStrings>

……………..
<param name="connectionString">
<value value="SqlServerConStr" typeConverter="Ecng.Configuration.ConnectionSettingsTypeConverter, Ecng.Configuration"/>
</param>

……………..
<property name="Provider">
<!--<dependency type="Ecng.Data.Providers.SQLiteDatabaseProvider, Ecng.Data.Providers" />-->
<dependency type="Ecng.Data.SqlServerDatabaseProvider, Ecng.Data" />
</property>


Остальные конфигурации не трогал
При запуске гидра валится на этом коде:


private void InitializeDataSource()
{
_storageRegistry = new StorageRegistry();
ConfigManager.RegisterService(_storageRegistry);

……………..
if (_entityRegistry.Exchanges.Count < 4)
{
_entityRegistry.Exchanges.Save(Exchange.Test); <= Здесь валимся
_entityRegistry.Exchanges.Save(Exchange.Micex);
_entityRegistry.Exchanges.Save(Exchange.Rts);
_entityRegistry.Exchanges.Save(Exchange.Ux);
}


Поначалу эксепшен говори о том, что нет прав для INSERT операции. Проверил – действительно, скрипт создавал пользователя trading без прав. Тал пользователю trading все права на базу Trading. Но это помогло не сильно. После этого эксепшен стал другой:



2012-10-01 00:03:55.073|Error |StockSharp|System.Data.SqlClient.SqlException (0x80131904): Invalid column name 'TimeZoneInfo'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at Ecng.Data.DatabaseCommand.<ExecuteNonQuery>b__6(DbCommand cmd)
at Ecng.Data.DatabaseCommand.<>c__DisplayClass4`1.<Execute>b__1(DbConnection connection)
at Ecng.Data.Database.GetConnection(Action`1 action)
at Ecng.Data.DatabaseCommand.Execute[TResult](IEnumerable`1 input, Func`2 handler)
at Ecng.Data.DatabaseCommand.ExecuteNonQuery(SerializationItemCollection input)
at Ecng.Data.Database.Execute(DatabaseCommand command, SerializationItemCollection source, Boolean needRetVal)
at Ecng.Data.Database.Create(DatabaseCommand command, SerializationItemCollection input, Boolean needRetVal)
at Ecng.Data.Database.<>c__DisplayClassc`1.<Create>b__b()
at Ecng.Data.Database.Create[TEntity](TEntity entity)
at Ecng.Data.Database.Ecng.Serialization.IStorage.Add[TEntity](TEntity entity)
at Ecng.Serialization.RelationManyList`1.OnAdd(TEntity entity)
at Ecng.Data.HierarchicalPageLoadList`1.OnAdd(TEntity entity)
at Ecng.Serialization.RelationManyList`1.Add(TEntity item)
at StockSharp.Algo.Storages.BaseStorageEntityList`1.Save(T entity)
at StockSharp.Hydra.MainWindow.InitializeDataSource() in D:\Work\StockSharp\StockSharp_4.1.4_Sources.Up\Hydra\Hydra\MainWindow.xaml.cs:line 160
at StockSharp.Hydra.MainWindow.<MainWindowLoaded>b__21() in D:\Work\StockSharp\StockSharp_4.1.4_Sources.Up\Hydra\Hydra\MainWindow.xaml.cs:line 483
at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj)
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()


Пытался добавить колонку TimeZoneInfo в таблицу Exchange. Вроде проходило, но потом опять где-то что-то ломалось.
В общем, что-то делаю не так.
Подскажите, люди добрые, как же подцепится-то к MSSQL базе.

Теги:


Спасибо:




6 Ответов
guest13

Фотография
Дата: 01.10.2012
Ответить


Попробуйте сделать
alter database set QUOTED_IDENTIFIER ON

Возможно придется еще пересоздать схему.
И как вариант посмотреть что в настройках ODBC:

http://msdn.microsoft.co...us/library/ms174393.aspx
Цитата:
The SQL Server Native Client ODBC driver and SQL Server Native Client OLE DB Provider for SQL Server automatically set QUOTED_IDENTIFIER to ON when connecting. This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.10.2012
Ответить


С тех пор, как перешли на SQLite, скрипт для MSSQL стал медленно, но верно расходится с последними изменениями в Гидре. Если с БД на ты, то можно самостоятельно поправить его.
Спасибо:

DrChemist

Фотография
Дата: 01.10.2012
Ответить


Михаил, спасибо что ответили.
Модифицировать скрипт я попытаюсь.

Однако хотелось бы знать планы разработчиков насчет поддержки MS SQL

Планируете ли Вы в дальнейшем уделять внимание поддержке MS SQL или вы окончательно и бесповоротно переходите на SQLite?
И еще, какова последняя версия S# и Гидры, которые еще в полном объеме поддерживает MS SQL?
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 01.10.2012
Ответить


Лучше вы скажите, чего ожидаете от Гидра+MSSQL. Может и огорода городить не придется.
Спасибо:

DrChemist

Фотография
Дата: 02.10.2012
Ответить


Мне нужно сохранять исторические данные сделки+стаканы.
При этом хочется обеспечить максимально возможную сохранность записанных данных. Чтобы сбои в Гидре не приводили к какой-либо коррупции или потере ранее записанных данных.
Хочется достичь максимально возможной стабильности работы связки Гидра+База при длительной работе. В стабильности MS SQL я более-менее уверен, а вот про SQLite мне мало что известно. Стабильность самой гидры, понятно, остается за скобками.
Необходимо будет обеспечить параллельную работу Гидры на запись и торгового робота, который будет обращаться к базе за историческими данными.
Не исключено, что потребуется работа нескольких гидр параллельно, записывающих потоки биржевых данных из нескольких источников.
Ну и еще MS SQL знаю значительно лучше.

Примерно так.

К стати, в конце концов мне удалось запустить Гидру с MS SQL. Однако биржевые потоки Гидра по-прежнему пишет в файлы *.bin во внутренних каталогах типа «SBER@QJSIM». Я надеялся, что потоки будут направляться в ту же базу MS SQL. Это можно как-то настроить? Если нет, то все очень сильно усложняется…
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 02.10.2012
Ответить


DrChemist Перейти

К стати, в конце концов мне удалось запустить Гидру с MS SQL. Однако биржевые потоки Гидра по-прежнему пишет в файлы *.bin во внутренних каталогах типа «SBER@QJSIM». Я надеялся, что потоки будут направляться в ту же базу MS SQL. Это можно как-то настроить? Если нет, то все очень сильно усложняется…


Экспорт в БД.
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy