我们的应用程序使用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.3.160。
提前感谢您的帮助。
答案 0 :(得分:1)
问题似乎是更新语句最后的)
:
UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?)
应该是
UPDATE MYTABLE SET NAME=?, DOUBLECOLUMN=? WHERE ID = ?