我正在尝试在Monotouch项目中使用预加载的sqlite数据库执行以下查询:
select * from my_table where id not in (1,2,3,4) and field not in ('תווים בעברית') order by RANDOM() limit 55;
但我一直收到SQLiteException。如果我将希伯来语字符串替换为英文字符,则效果很好。
我该如何解决这个问题?
还要注意,相同的确切查询在Android项目(用Java编写)中也可以正常工作。
编辑(代码)
var conn = new SQLiteConnection (System.IO.Path.Combine (folder, "mydb.db3"));
string sql = select * from my_table where id not in (1,2,3,4) and field not in ('תווים בעברית') order by RANDOM() limit 55;
IEnumerable<myObject> objects = conn.Query<myObject> (sql.ToString()); //Here is the exception
抛出异常:
SQLite.SQLiteException:在“ lim”附近:语法错误
在SQLite.SQLite3.Prepare2中(IntPtr db,System.String查询)在[0x00000]中:0
在SQLite.SQLiteCommand.Prepare()在[0x00000]中:
在SQLite.SQLiteCommand + d_0
1[MyAppName.Question].MoveNext () [0x00000] in <filename unknown>:0 at System.Collections.Generic.List
1 [MyAppName.Question] .AddEnumerable(IEnumerable 1 enumerable) [0x00000] in <filename unknown>:0 at System.Collections.Generic.List
1 [MyAppName.Question] .. ctor(IEnumerable 1 collection) [0x00000] in <filename unknown>:0 at System.Linq.Enumerable.ToList[Question] (IEnumerable
1源)[0x00000]在:0中在SQLite.SQLiteCommand.ExecuteQuery [Question]()[0x00000]中:: 0
在SQLite.SQLiteConnection.Query [问题](System.String查询,System.Object []参数)[0x00000]在:0中
在/Users/mmac/Documents/projects/MyAppNameMono/MyAppName/MyAppName/dal/DBHelper.cs:43中的MyAppName.DBHelper.getQuestions(Int32级别)[0x000f1]上
在/Users/mmac/Documents/projects/MyAppNameMono/MyAppName/MyAppName/AppDelegate.cs:36中的MyAppName.AppDelegate.m_0(System.Object)[0x00002]
最佳答案
near "lim": syntax error
该错误消息表示查询字符串的最后六个字符被截断,即MonoTouch无法正确计算字符串长度。
向Xamarin报告此错误,和/或尝试升级。
要解决此问题,请尝试将字符串值作为参数传递(首先是避免格式化问题和SQL injection attacks的一个好主意):
string sql = "select ... field not in (?) ...";
string value = "תווים בעברית";
IEnumerable<myObject> objects = conn.Query<myObject>(sql, value);