首页 文章

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

提问于
浏览
0

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

  • 1

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

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

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

    val.Value = str;
    

    这就是你应该做的,因为这是文本 . 如果这不起作用,请查看模式以了解字段的声明方式,等等 - 但我强烈建议您不要自行执行编码 . 那是's fundamentally the job of the database/driver combination - it shouldn' t在应用程序代码中 .

  • 2

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

相关问题