使用c#将非拉丁数据插入sqlite数据库时编码错误

时间:2011-11-01 09:54:58

标签: c# sqlite encoding

我正在尝试使用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 个答案:

答案 0 :(得分:2)

在项目中,我们将非UTF8(sqlite默认编码)插入到SQLite数据库中。 这是通过将文本作为二进制类型插入来完成的。 首先将字符串(以您喜欢的编码方式)转换为字节数组, 然后添加二进制类型的参数,并将bytearray作为值。

答案 1 :(得分:1)

这看起来不是一个好主意:

byte[] b = Encoding.Default.GetBytes(str);

为什么你自己甚至尝试编码?只需使用字符串:

val.Value = str;

这就是你应该做什么,因为这是文本。如果这不起作用,请查看模式以了解字段的声明方式,等等 - 但我强烈建议反对自己执行编码。这基本上是数据库/驱动程序组合的工作 - 它不应该在应用程序代码中。