Синтаксическая ошибка в H2

Наше приложение использует 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.

Заранее благодарю за любую помощь.


person alokoko    schedule 21.02.2012    source источник


Ответы (1)


Проблема, похоже, в ) в самом конце оператора обновления:

UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?)

должно быть

UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?
person Thomas Mueller    schedule 21.02.2012
comment
Знаешь, это один из тех случаев, когда внесение двух изменений одновременно посреди ночи вызывает у меня отвращение. Большое спасибо, что заметили это и ответили. :-) - person alokoko; 21.02.2012