H2中的语法错误

本文关键字:错误 语法 H2 | 更新日期: 2023-09-27 18:25:18

我们的应用程序使用H2Sharp从C#(Framework v4)访问H2数据库。最近我们遇到了以下问题:以下代码

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也可以,但UI不允许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.3160。

提前感谢您的帮助。

H2中的语法错误

问题似乎是更新语句末尾的)

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

应该是

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