2016-04-14 13 views
1

Ich habe eine Weile auf diesen Kopf geschlagen - ich bin kein fantastischer Programmierer, aber ich kann mir nur vorstellen, dass es eine einfache Lösung gibt, die ich vermisse. Ich habe an einem PoC-Code gearbeitet, um eine verschlüsselte SQLite-Datenbank mit dem System.Data.SQLite-Datenprovider zu erstellen. Ich schreibe eine grundlegende Konsolenanwendung in C#, um mir zu helfen, zu verstehen, wie das funktioniert. Hier ist mein Problem.Wie liest man eine verschlüsselte SQLite db in C#

Ich kann eine neue SQLite db mit einem Passwort in der Verbindungszeichenfolge erstellen, die (von dem, was ich verstehe) die Datenbank verschlüsselt. Hier ist der vollständige Code:

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; 
} 

Das scheint gut zu funktionieren ... Ich kann eine Tabelle erstellen, fügen Sie Daten in eine Tabelle und dann die Tabelle abzufragen. Das nächste Mal, wenn ich es versuchen laufe, werde ich die folgende Änderung vornehmen, um nicht die Tabelle neu zu erstellen ... sonst, sollte der Code gleich sein:

... 

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')"; 

... 

Als ich es zum zweiten Mal laufen, ich den folgenden Fehler erhalten:

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) 

Irgendeine Idee, was ich falsch mache? Wie kann ich eine von mir erstellte und verschlüsselte Datenbank erneut öffnen und verwenden?

+1

Ich glaube nicht, dass Sie 'SQLiteConnection.CreateFile' verwenden müssen - wenn Sie eine Verbindung zu einer Datei herstellen, die nicht existiert, wird sie standardmäßig erstellt. Versuchen Sie, diesen Anruf zu entfernen. Vielleicht stört es die Verschlüsselung ... (nur eine Vermutung). – Blorgbeard

Antwort

0

Set Passwort:

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

Passwort ändern:

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

Connect mit Passwort kann aus der Verbindungszeichenfolge erfolgen:

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

oder:

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