2013-04-16 7 views
11

は、私の接続文字列は、私は、このパスワードをすべて削除した場合、私は「mypasswordという」とパスワードを定義した接続文字列ではsqliteデータベースファイルが暗号化されていないか、データベースではありませんか?私はsqliteのデータベースを使用してWindowsアプリケーション、.NET 2.0に取り組んでいます

<connectionStrings> 
<add name="SQLiteDB" 
    connectionString="Data Source=|DataDirectory|database.s3db;version=3;password=mypassword;" 
    providerName="System.Data.Sqlite"/> 
</connectionStrings> 

ようにapp.configをにとどまりますうまく働いたが、私は、パスワード句を使用する場合、それは(connection.openに私にエラーを与える)構文され、私はネット上で検索し、いくつかのバージョンの問題が見つかりましたが、私は関連して述べただけのようにバージョン3を使用しています

File opened that is not a database file 
file is encrypted or is not a database 

こと文字列私はまた、 "バージョン= 3"を削除しようとしましたが、問題は同じままです。

私はこれを初めてやっていますが、その解決策は何ですか?

答えて

7

接続文字列にパスワードを指定し、そのデータベースがすでに存在する場合、SQLiteはデータベースが暗号化されているとみなし、そのパスワードで解読しようとします。データベースにまだパスワードを設定していない場合は、暗号化されていないデータベースを復号化するために提供されたパスワードを使用できないため、「ファイルが暗号化されています」というエラーが発生します。

データベースを削除すると、接続文字列のパスワードを使用して新しい暗号化データベースが作成されます。 Encrypting, decrypting and attaching to encrypted databases

+0

+1ありがとうございました。最初はうまくいきましたが、アプリケーションを2回目に実行するとcon.openに同じ例外が表示されます。 "ファイルはデータベースファイルではありません。 ファイルは暗号化されているか、データベースではありません。 " – Mogli

+1

@harharデータベースの暗号化に要した手順を概説してください。 'ChangePassword()'メソッドを使用した場合は、それ以降の呼び出しから削除する必要があります。 con.Open()の後の – 2Toad

+0

;私は詐欺を書く。ChangePassword( "password");それを使って作業した後、私はcon.ChangePassword( "");を行います。最後にcon.Close();違いますか ? – Mogli

2

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が含まれています。

は、いくつかのシナリオを検討することがあります。

  1. データベースには、パスワードが適用されてきた、そしてそれは、接続文字列です。
  2. 接続文字列にパスワードがありますが、データベースに適用されていないか、または文字列のパスワードがDBと一致しません。
  3. データベースにはパスワードが一度もありませんでした。パスワードを変更する必要があります。
  4. データベースにパスワードがあり、変更する必要があります。

解像度:

  1. だから、あなたがやった他に何2Toadはconn.ChangePassword("somethingelse")は半分だけ正しいとあなたが考慮されていません実行するために提供されたコードと、将来あなたがしたいこと。既存のパスワードを持っていて、パスワードを変更したい場合はこれが正しいですが、その後に接続文字列が更新されていることを確認するか、後で接続が失敗してfile is encryptedエラーが発生します。

  2. このシナリオでは、空白のパスワードがconn.SetPassword("")を使用した場合に起こり、その後、最初の接続文字列にPassword=somethingせずにデータベースに接続せずにconn.ChangePassword("somethingelse")を試してみてください。パスワードがプログラムによってDBから削除され、DBが接続しようとするため、Password=somethingを接続文字列から削除する必要があります。 DBからプログラムで削除されると同時に接続文字列から削除されない場合は、同じfile is encryptedエラーが発生します。

  3. 私はパスワードを適用していない頃にconn.SetPassword("something")をやって始めました(これがやり方だと思います)ので、別のSQLite DBを作成せずに次のことを確認することはできません。最初はパスワードがない場合はconn.ChangePassword("something")に電話することはできません。初期設定ではconn.SetPassword("something")を入力し、接続文字列にPassword=somethingを入力します。

  4. 私だけ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の最初の例のように、それを常に空白にしてから変更する方が良いと感じました。

+0

あなたが上で述べた4つのシナリオはすべて、非常に自明です...実際には私はそれが必要でした....それは素晴らしい説明でした。ありがとうUpVoted :) – Mogli

+0

@モッリ、ありがとう。私は「ちょっと試してみよう」という熱意の中で考えていました。私は、「x」をやっているというよりも、包括的なチェックリストが、あなたの実際の状況を考えれば、あなたが実際にやろうとしていることに注意を払わなければ、 "x"は問題を起こすことがあります。 :) – vapcguy

関連する問題