Наше приложение использует H2Sharp для доступа к базе данных H2 из C# (Framework v4). Недавно мы столкнулись со следующей проблемой: следующий код
H2DataAdapter adapter;
DataTable table;
//initialize values
H2Command updateCommand = new H2Command("UPDATE MYTABLE SET NAME=@NAME, DOUBLECOLUMN=@DOUBLECOLUMN WHERE ID = @ID)", connection);
updateCommand.Parameters.Add(new H2Parameter("@NAME", DbType.String, 100, "NAME"));
updateCommand.Parameters.Add(new H2Parameter("@DOUBLECOLUMN", DbType.Double, 8, "DOUBLECOLUMN"));
updateCommand.Parameters.Add(new H2Parameter("@ID", DbType.StringFixedLength, 50, "ID"));
adapter.UpdateCommand = updateCommand;
приводит к синтаксической ошибке позже при использовании в следующей форме при использовании в культуре с «,» в качестве десятичного разделителя вместо «.»:
DataRow row = somehow_get_the_row();
row["NAME"] = "name";
row["DOUBLECOLUMN"] = some_double_with_fractional_part;
adapter.Update(table);
Код отлично работает, если пользовательский ввод является двойным без дробной части (т.е. 39 работает, а 39,5 не работает). Я предполагаю, что 39.5 также будет работать, но пользовательский интерфейс не позволяет использовать символы, которые не включены в CurrentCulture.NumberFormat.NumberDecimalSeparator
, поэтому невозможно ввести "." в таком случае.
Вершина стека (до нашего кода) выглядит так:
h2-1.3.160.dll!org.h2.jdbc.JdbcConnection.prepareStatement(string str) + 0x1f4 bytes
H2Sharp.dll!System.Data.H2.H2Command.CreateStatement() Line 335 + 0x35 bytes
H2Sharp.dll!System.Data.H2.H2Command.EnsureStatment() Line 368 + 0x8 bytes
H2Sharp.dll!System.Data.H2.H2Command.ExecuteNonQuery() Line 438 + 0x8 bytes
System.Data.dll!System.Data.Common.DbDataAdapter.UpdateRowExecute(System.Data.Common.RowUpdatedEventArgs rowUpdatedEvent, System.Data.IDbCommand dataCommand, System.Data.StatementType cmdIndex) + 0x4f bytes
System.Data.dll!System.Data.Common.DbDataAdapter.Update(System.Data.DataRow[] dataRows, System.Data.Common.DataTableMapping tableMapping) + 0x6bc bytes
System.Data.dll!System.Data.Common.DbDataAdapter.UpdateFromDataTable(System.Data.DataTable dataTable, System.Data.Common.DataTableMapping tableMapping) + 0x2a bytes
System.Data.dll!System.Data.Common.DbDataAdapter.Update(System.Data.DataTable dataTable) + 0xb2 bytes
и сообщение об ошибке
org.h2.jdbc.JdbcSQLException occurred
Message=Syntax error in SQL statement "UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?)"
Source=h2-1.3.160
Я предполагаю, что "," из строкового представления double в этой культуре нарушает оператор SQL.
Что было бы правильным способом получить эту работу? Должна ли таблица базы данных содержать столбцы типа double, но аргументы должны передаваться в виде строк, отформатированных с инвариантным языком и региональными параметрами? Будет ли H2 правильно выполнять синтаксический анализ в этом случае?
Код работает под Windows 7, x64 и базой данных H2 версии 1.3.160.
Заранее благодарю за любую помощь.