Плохое кодирование при вставке нелатинских данных в базу данных sqlite с использованием c # - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь вставить нелатинские данные в базу данных sqlite, используя переменные связывания, используя System.Data.SQLite.когда я вставляю данные без переменных связывания, все в порядке:

cmd.CommandText = "INSERT INTO mytab VALUES (/" некоторые нелатинские данные / ")";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 ]

2 голосов
/ 22 марта 2012

В проекте мы вставили не-UTF8 (кодировка sqlite по умолчанию) в базу данных SQLite.Это было сделано путем вставки текста в виде двоичного типа.Сначала преобразуйте строку (в вашей любимой кодировке) в байтовый массив, затем добавьте параметр типа binary с вашим байтовым массивом в качестве значения.

1 голос
/ 01 ноября 2011

Ну, это не выглядит хорошей идеей:

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

Почему вы вообще пытаетесь кодировать себя?Просто используйте строку:

val.Value = str;

Это то, что вы должны делать, так как это текст.Если это не сработает, посмотрите на схему, чтобы узнать, как объявлено поле и т. Д. - но я бы настоятельно рекомендовал против , выполняющих кодирование самостоятельно.Это в основном работа комбинации базы данных / драйвера - она ​​не должна быть в коде приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...