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。
提前感谢您的帮助。
问题似乎是更新语句末尾的)
:
UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?)
应该是
UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?