расшифровать значения в базе данных sqlite и просмотреть их на сетке данных - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в wpf, и у меня возникли некоторые проблемы с тем, как расшифровать зашифрованные значения в моей БД для просмотра на сетке данных. Я искал решение почти 2 дня и только придумал этот код

//private static String Encrypt(string Text)
//private static String Decrypt(string Text)
private void refresh_datagrid()
{

//create temp directory

var tempdir = Path.GetFullPath(Path.Combine(Path.GetTempPath(),Guid.NewGuid().ToString()));
Directory.CreateDirectory(tempdir);

//create temp db with same table and details same as on original db

        SQLiteConnection.CreateFile(tempdir+"tempdb.sqlite;security=true;");
        var con1 = new SQLiteConnection("Data 
        Source="+tempdir+"\\tempdb.sqlite;");
        con1.Open();
        con1.ChangePassword(defaultpassword);
        String sql = "CREATE TABLE acc (nam STRING, pas STRING)";
        SQLiteCommand command = new SQLiteCommand(sql, con1);
        command.ExecuteNonQuery();

//open a connection to encrypted db

        using (var con2 = new SQLiteConnection("DataSource="+db_path+";security=true;"))
        { 
            con2.Open();
            con2.ChangePassword(defaultpassword);

            SQLiteCommand cmd = con2.CreateCommand();

            cmd.CommandText = "SELECT * FROM acc ";

//read encrypted strings to decrypt it then pass them to tempdb

            SQLiteDataReader reader;
            reader = cmd.ExecuteReader();
           while(reader.Read())
            {
                SQLiteCommand cmdc = con1.CreateCommand();
                cmdc.CommandText = "INSERT INTO  acc (nam,pas) VALUES (@username ,@password )";

                cmdc.Parameters.AddWithValue("@username", Decrypt(reader["nam"].ToString()));
                cmdc.Parameters.AddWithValue("@password", Decrypt(reader["pas"].ToString()));

                cmdc.ExecuteNonQuery();
            }

//view tempdb data on datagrid

            SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd.CommandText, con1);
            DataTable dataTable = new DataTable();
            dataAdapter.Fill(dataTable);
            control.ItemsSource = dataTable.AsDataView();

            con1.Close();
             con2.Close();

//remove tempdir and tempdb 

            Directory.Delete(tempdir,true);
        }
}

это работает, но это просто упрощенный код. в моем полном коде у меня есть больше таблиц с 6 более подробной информации и 120 учетных записей и когда я пытаюсь просмотреть их в своей таблице данных, приложение зависает на 3-4 секунды, я обошел эту проблему с backgroundworker но все еще не удовлетворен задержкой, мне нужен лучший способ справиться с этим, любая помощь приветствуется.

ps: извините за неправильную грамматику или орфографию EN не мой родной язык

1 Ответ

0 голосов
/ 06 сентября 2018
  1. Попробуйте добавить журналы между строк, чтобы узнать горлышко бутылки
  2. Сначала читать все записи в память из зашифрованной БД вместо записи во время чтения
  3. Сколько строк в БД? Вы объединяете все 6 таблиц в своем запросе? Рассмотрим тюнинг sql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...