2016-03-30 11 views
0

データベースを作成してその名前を指定するときは、指定されたディレクトリとアプリケーションが実行されているディレクトリに作成されるという問題があります。なぜそれが起こっているのですか?データベースを作成しますSqlite C#で同じ名前の2つのデータベースが作成される

コード:

private static string AddDb(string dbName, string dbPassword) 
    { 
     try 
     { 
      string startupPath = Environment.CurrentDirectory; 
      string dataBasePath = startupPath + "\\DB\\" + dbName; 
      SQLiteConnection.CreateFile(dataBasePath); 
      SQLiteConnection dbConnString; 
      dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;"); 
      dbConnString.Open(); 
      dbConnString.ChangePassword(dbPassword); 
      dbConnString.Close(); 
      return dataBasePath; 
     } 
     catch 
     { 

      MessageBox.Show("Failed to create database", "DB Creator"); 
      return ""; 
     } 
    } 
+0

この呼び出しはexeファイルのディレクトリ dbConnString.Open()でsqliteのファイルを作成しているようです。 – phoenix

答えて

-1

Environment.CurrentDirectoryは、アプリケーションがデフォルトでから始まるディレクトリが含まれています。このプロパティを設定できます。 Environment.CurrentDirectory Property

+0

間違っています。アプリケーションが起動するディレクトリは常に含まれているとは限りませんが、現在の作業ディレクトリは非常に異なっています。 http://stackoverflow.com/questions/15653921/get-current-folder-path –

+0

はいそうです。単純なアプリケーションを作成して印刷すると、アプリケーションが起動するディレクトリが出力されます。彼はDirectoryクラスではなくEnvironmentクラスを使用しています。 Environment.CurrentDirectoryを変更することもできます。少なくともフレームワーク4.5.2と4.6.1ではそうです。彼はそれを実現することなくそれを変更できましたか? – Wrongway

+0

あなたのシンプルなアプリケーションへのショートカットを作成し、別の作業ディレクトリを指定した場合、それはしません。ドキュメントは* working *ディレクトリについても話します。可能であれば、Program Filesフォルダにインストールされたアプリケーションは、とにかくそこに書き込むことが許可されないので、OPは、とにかく適切な場所を使用する必要があります。 –

1

問題は、CreateFileと接続文字列で異なるパスを使用しているようです。

以下のコードを見ると、フルパスを使用してファイルを作成する場合(databaseBasePath)、それ以外の場合は接続文字列(dbName)にのみデータベースファイル名を使用する)。絶対パスがないと、これは別のフォルダになる可能性があります。

string dataBasePath = startupPath + "\\DB\\" + dbName; 
SQLiteConnection.CreateFile(dataBasePath); 
SQLiteConnection dbConnString; 
dbConnString = new SQLiteConnection("Data Source =" + dbName + ";Version=3;"); 

Openのように見えますが、見つからない場合はファイルが作成されます。パス上の

単語は:

  1. あなたはそう本当に悪い考えであるデータベースファイルの現在のフォルダを使用して、Program Filesフォルダを書き込むことが許されていません。
  2. Environment.CurrentDirectoryの使用もまた悪い考えです。あなたのアプリケーションをどのように起動するかによって、これはあなたが思っているフォルダである場合とそうでない場合があります(他の回答と私のコメント、this参照)。
  3. 実際には\がパス区切り文字であるとは決して考えないでください。代わりにPath.Combineを使用してください。私はあなたが(すべてのユーザーが独自のデータベースを持っている必要がある場合)、現在のユーザーにすべてのユーザー間で共有されます場所(データベースの内容を共有する必要がある場合)またはプライベートを取得し、データベースを作成するEnvironment.GetFolderPathを使用することを示唆している

そこ:

string baseFolder = Environment.GetFolderPath(<wherever it should be>); 
string dataBasePath = Path.Combine(baseFolder, "DB", dbName); 
SQLiteConnection.CreateFile(dataBasePath); 
SQLiteConnection dbConnString = new SQLiteConnection(String.Format("Data Source = {0};Version=3;", dataBasePath);