我正在尝试使用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);
}
}
2 回答
嗯这看起来不是一个好主意:
为什么你自己甚至尝试任何编码?只需使用字符串:
这就是你应该做的,因为这是文本 . 如果这不起作用,请查看模式以了解字段的声明方式,等等 - 但我强烈建议您不要自行执行编码 . 那是's fundamentally the job of the database/driver combination - it shouldn' t在应用程序代码中 .
在一个项目中,我们将非UTF8(sqlite默认编码)插入到SQLite数据库中 . 这是通过将文本作为二进制类型插入来完成的 . 首先将字符串(以您喜欢的编码方式)转换为字节数组,然后添加二进制类型的参数,并将bytearray作为值 .