2016-04-14 19 views
1

Kafamı bir süredir bu konu üzerinde becermeye çalışıyorum - fantastik bir kodlayıcı değilim, ama sadece eksik olan basit bir çözüm olduğunu hayal edebiliyorum. System.Data.SQLite veri sağlayıcısı kullanarak şifrelenmiş bir SQLite db oluşturmak için bazı PoC kodu üzerinde çalışıyorum. Bunun nasıl çalıştığını anlamak için C# 'da temel bir konsol uygulaması yazıyorum. İşte benim sorunum.C şifreli bir sqlite db okumak için nasıl C#

Veritabanı dizesini şifreleyen (anlaştığımdan) bağlantı dizesinde parola ile yeni bir sqlite db oluşturabilirim. iyi iş gibi görünüyor

try 
{ 
    if (!System.IO.File.Exists(@"c:\temp\test.db.sqlite")) 
    { 
     System.Data.SQLite.SQLiteConnection.CreateFile(@"c:\temp\test.db.sqlite"); 
    } 

    System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=c:\temp\test.db.sqlite;Version=3;password=abc"); 
    conn.Open(); 

    System.Data.SQLite.SQLiteCommand cmd = new SQLiteCommand(conn); 
    //System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand("create table test (name char(50))", conn); 
    //cmd.ExecuteNonQuery(); 


    cmd.CommandText = "insert into test values ('my string')"; 
    cmd.ExecuteNonQuery(); 

    cmd.CommandText = "select * from test"; 

    var dr = cmd.ExecuteReader(); 
    while (dr.Read()) 
    { 
     Console.WriteLine(dr.GetString(0)); 
    } 

    conn.Close(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.ToString()); 
    throw; 
} 

... Ben, bir tablo oluşturmak bir tabloya veri eklemek ve daha sonra tablo sorgulayabilirsiniz: İşte tam kod. tablo yeniden etmeyecek şekilde bunu denemenizi dahaki sefere ben başka türlü, kod aynı olmalıdır ... Aşağıdaki değişiklik yapacağız:

... 

if (!System.IO.File.Exists(@"c:\temp\test.db.sqlite")) 
{ 
    System.Data.SQLite.SQLiteConnection.CreateFile(@"c:\temp\test.db.sqlite"); 
} 

System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection(@"Data Source=c:\temp\test.db.sqlite;Version=3;password=abc"); 
conn.Open(); 

//System.Data.SQLite.SQLiteCommand cmd = new SQLiteCommand(conn); 
System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand("create table test (name char(50))", conn); 
cmd.ExecuteNonQuery(); 


cmd.CommandText = "insert into test values ('my string')"; 

... 

ben o ikinci kez çalıştırmak, ben aşağıdaki hatayı edinin:

System.Data.SQLite.SQLiteException (0x80004005): file is encrypted or is not a database file is encrypted or is not a database 
at System.Data.SQLite.SQLite3.Prepare(SQLiteConnection cnn, String strSql, SQLiteStatement previous, UInt32 timeoutMS, String& strRemain) 
at System.Data.SQLite.SQLiteCommand.BuildNextCommand() 
at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index) 
at System.Data.SQLite.SQLiteDataReader.NextResult() 
at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave) 
at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior) 
at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior behavior) 

Neyi yanlış yaptığım hakkında bir fikriniz var mı? Oluşturduğum ve şifrelediğim bir db'yi nasıl yeniden açıp kullanabilirim?

+1

"SQLiteConnection.CreateFile" kullanmanız gerektiğini sanmıyorum - var olmayan bir dosyaya bağlanırsanız, varsayılan olarak oluşturulur. Bu aramayı kaldırmayı deneyin. Belki de şifrelemeye müdahale ediyor ... (sadece bir tahmin). – Blorgbeard

cevap

0

Seti şifresi:

string conn = @"Data Source=database.s3db;Password=Mypass;"; 
SQLiteConnection connection= new SQLiteConnection(conn); 
connection.Open(); 
//Some code 
connection.ChangePassword("Mypass"); 
connection.Close(); 

Şifre değiştir:

şifre ile Bağlan bağlantı dizesinden yapılabilir
string conn = @"Data Source=database.s3db;"; 
SQLiteConnection connection= new SQLiteConnection(conn); 
connection.Open(); 
//Some code 
connection.ChangePassword("Mypass"); 
connection.Close(); 

:

string conn = @"Data Source=database.s3db;Password=Mypass;"; 

ya:

string conn = @"Data Source=database.s3db;"; 
SQLiteConnection connection= new SQLiteConnection(conn); 
connection.Open(); 
//Some code 
connection.SetPassword("Mypass"); 
connection.Close(); 
İlgili konular