Синтаксическая ошибка в H2 - PullRequest
1 голос
/ 21 февраля 2012

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

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

1 Ответ

1 голос
/ 21 февраля 2012

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

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

должно быть

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