我正在尝试使用System.Data.SQLite使用绑定变量将非拉丁数据插入到sqlite数据库中。当我在没有绑定变量的情况下插入数据时,一切正常:
cmd.CommandText =“INSERT INTO mytab VALUES(/”some some-latin data /“)”; cmd.ExecuteNonQuery();
当我尝试使用绑定变量时,数据正在插入,但编码很糟糕,我只能看到的东西是???或者一些奇怪的信件。我在这里阅读了解决方案并尝试在连接字符串中使用PRAGMA ENCODING =“UTF-8”。 我也尝试将它从“ISO-8859-1”编码为UTF-8,也从默认编码编码为UTF-8。什么都没有解决问题。
这是我的代码,请告诉我我做错了什么:
public void addItem(List updateProperties) {
try
{
_Conn.Open();
SQLiteCommand oCmd = new SQLiteCommand ( "BEGIN", _dtflsConn );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
foreach (List<string> lst in updateProperties)
{
string table = lst[0];
lst.RemoveAt(0);
//building query
oCmd = new SQLiteCommand ( "INSERT INTO " + table + " VALUES (", _dtflsConn);
foreach (string str in lst)
oCmd.CommandText += "?,";
oCmd.CommandText = (oCmd.CommandText.Substring(0, oCmd.CommandText.Length -1)) + ");";
int i = 0;
foreach ( string str in lst )
{
var val = oCmd.CreateParameter();
val.ParameterName = i.ToString();
//Encoding
byte[] b = Encoding.Default.GetBytes(str);
b = Encoding.Convert(Encoding.Default, Encoding.UTF8, b);
val.Value = b;
oCmd.Parameters.Add(val);
i++;
}
//executing
oCmd.ExecuteNonQuery();
oCmd.Dispose();
}
oCmd = new SQLiteCommand ( "END", _dtflsConn);
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
_Conn.Close();
}
catch (Exception e)
{
_Conn.Close();
logger.LogMessageToFile(e.Message);
}
}
答案 0 :(得分:2)
在项目中,我们将非UTF8(sqlite默认编码)插入到SQLite数据库中。 这是通过将文本作为二进制类型插入来完成的。 首先将字符串(以您喜欢的编码方式)转换为字节数组, 然后添加二进制类型的参数,并将bytearray作为值。
答案 1 :(得分:1)
这看起来不是一个好主意:
byte[] b = Encoding.Default.GetBytes(str);
为什么你自己甚至尝试编码?只需使用字符串:
val.Value = str;
这就是你应该做什么,因为这是文本。如果这不起作用,请查看模式以了解字段的声明方式,等等 - 但我强烈建议反对自己执行编码。这基本上是数据库/驱动程序组合的工作 - 它不应该在应用程序代码中。