2Toadの答えはほとんどが正しいですが、私は作られているいくつかの明確化があるので、自分自身を追加したい:
// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");
参考:または、あなたはChangePassword()
メソッドを使用して、既存のデータベースを暗号化することができます。
接続文字列にパスワードを指定し、そのデータベースがすでに存在する場合、SQLiteはデータベースが暗号化されているとみなし、そのパスワードで解読しようとします。データベースにまだパスワードを設定していない場合は、暗号化されていないデータベースを復号化するために提供されたパスワードを使用できないため、「ファイルが暗号化されています」というエラーが発生します。
ただし、接続文字列に別の文字列が既にある場合は、conn.SetPassword("something")
を使用するとこのエラーが発生することがあります。または、conn.ChangePassword("somethingelse")
を入力しても、接続文字列にはまだPassword=something
が含まれています。
は、いくつかのシナリオを検討することがあります。
- データベースには、パスワードが適用されてきた、そしてそれは、接続文字列です。
- 接続文字列にパスワードがありますが、データベースに適用されていないか、または文字列のパスワードがDBと一致しません。
- データベースにはパスワードが一度もありませんでした。パスワードを変更する必要があります。
- データベースにパスワードがあり、変更する必要があります。
解像度:
だから、あなたがやった他に何2Toadはconn.ChangePassword("somethingelse")
は半分だけ正しいとあなたが考慮されていません実行するために提供されたコードと、将来あなたがしたいこと。既存のパスワードを持っていて、パスワードを変更したい場合はこれが正しいですが、その後に接続文字列が更新されていることを確認するか、後で接続が失敗してfile is encrypted
エラーが発生します。
このシナリオでは、空白のパスワードがconn.SetPassword("")
を使用した場合に起こり、その後、最初の接続文字列にPassword=something
せずにデータベースに接続せずにconn.ChangePassword("somethingelse")
を試してみてください。パスワードがプログラムによってDBから削除され、DBが接続しようとするため、Password=something
を接続文字列から削除する必要があります。 DBからプログラムで削除されると同時に接続文字列から削除されない場合は、同じfile is encrypted
エラーが発生します。
私はパスワードを適用していない頃にconn.SetPassword("something")
をやって始めました(これがやり方だと思います)ので、別のSQLite DBを作成せずに次のことを確認することはできません。最初はパスワードがない場合はconn.ChangePassword("something")
に電話することはできません。初期設定ではconn.SetPassword("something")
を入力し、接続文字列にPassword=something
を入力します。
私だけconn.SetPassword("")
を行うと、接続文字列からPassword=something
をクリアした後conn.ChangePassword("somethingelse")
をしたところ、私はパスワードの変更を行った方法だった:
// Changes an encrypted database to unencrypted and removes password
string connString = "Data Source=c:\\test.db3;Password=something";
SQLiteConnection conn = new SQLiteConnection(connString);
conn.SetPassword("");
//conn.Open(); // doesn't work because connString hasn't been updated
// Update connString
connString = "Data Source=c:\\test.db3;";
conn = new SQLiteConnection(connString);
conn.Open(); // we've opened the DB without a password
// Re-encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.
conn.ChangePassword("somethingelse");
conn.Close();
// Update connString
connString = "Data Source=c:\\test.db3;Password=somethingelse";
conn = new SQLiteConnection(connString); // must re-instantiate!
conn.Open(); // we've opened the DB with our new password
これがうまく働きました。 .configを個人的に
// Opens an encrypted database
string connString = "Data Source=c:\\test.db3;Password=something";
SQLiteConnection conn = new SQLiteConnection(connString);
conn.Open();
// Encrypts the database. The connection remains valid and usable afterwards until closed - then the connection string needs updating.
conn.ChangePassword("somethingelse");
conn.Close();
// Update connString
connString = "Data Source=c:\\test.db3;Password=somethingelse";
conn = new SQLiteConnection(connString);
conn.Open(); // we've opened the DB with our new password
アプリ(ウェブ)で暗号化されたとして、私はパスワードを保存する:私はあなたにも、接続文字列からそれをクリアして、単にconn.ChangePassword("somethingelse")
を行い、その後、その後、あなたの文字列にPassword=somethingelse
を追加することはできませんと仮定しますファイルを作成し、アプリケーションのonload内の変数に呼び出し、動的に接続文字列を作成します。
私が知っていることは、SQLite DBを削除して呼び出すと、接続文字列から新しいパスワードを持つSQLite DBを再作成したのではなく、単にエラーが発生することです。それはC#.NETアプリから。
UPDATEあなたが既に持っている後にパスワードを更新するために使用される機能が必要な場合は、.SetPassword()
を持っているしたいのですが、.ChangePassword()
ません。私は#4の最初の例のように、それを常に空白にしてから変更する方が良いと感じました。
+1ありがとうございました。最初はうまくいきましたが、アプリケーションを2回目に実行するとcon.openに同じ例外が表示されます。 "ファイルはデータベースファイルではありません。 ファイルは暗号化されているか、データベースではありません。 " – Mogli
@harharデータベースの暗号化に要した手順を概説してください。 'ChangePassword()'メソッドを使用した場合は、それ以降の呼び出しから削除する必要があります。 con.Open()の後の – 2Toad
;私は詐欺を書く。ChangePassword( "password");それを使って作業した後、私はcon.ChangePassword( "");を行います。最後にcon.Close();違いますか ? – Mogli