2017-01-22 6 views
0

私は前にSQLiteを使用しましたが、DataContext(AFAIKはSQLiteがサポートしていません)を使用してデータベースを作成できませんでしたので、私はMS SQL CE 4に切り替えました非推奨ですが、まだxcopyをインストールして比較的小さくても構いませんが)、データベースの作成に問題があります。MS SQL CE DataContextデータベースが存在する/削除する

まず、接続を開かずに試してみましたが、DatabaseExistsがfalseを返しました。私は接続を開く必要があると思ったので、DataContextDatabaseExistsDeleteDatabaseを開いたままで接続しようとしています。 dataSouceは、データベースの相対名です

SqlCeConnectionStringBuilder stringBuilder = new SqlCeConnectionStringBuilder(); 
stringBuilder.DataSource = dataSource; 

connection = new SqlCeConnection(stringBuilder.ConnectionString); 

:私はこのような接続を作成しています。

次に、強く型付けされたDataContextContext)を使用して、データベースが存在しない場合は除外して作成するかどうかを判断しようとしています。

protected DBDataProvider(IConnectionProvider connectionProvider) 
{ 
    connection = connectionProvider.Connection; 
    dataContext = new Context(connection); 
} 

public bool CreateDatabase(bool overwriteIfExists = true) 
{ 
    try 
    { 
     connection.Open(); 

     if (dataContext.DatabaseExists()) 
     { 
      if (overwriteIfExists) 
       dataContext.DeleteDatabase(); 
      else 
       return false; 
     } 

     connection.Close(); 
    } 
    catch 
    { 
     // in this case the database does not exist 
     // at least with MS SQL CE 
    } 

    try 
    { 
     dataContext.CreateDatabase(); 
    } 
    catch (Exception ex) 
    { 
     // ... 
    } 

    return true; 
} 

ただし、DatabaseExistsは常にfalseを返します。だから私は問題だと思ったので、接続を閉じた後にDeleteDatabaseコールを移動しましたが、何も起こりません。ファイルはまだそこにあります。

try 
{ 
    connection.Open(); 
    // removed from here... 
    connection.Close(); 

    dataContext.DeleteDatabase(); 
} 

とデータベースファイルがまだそこにCreateDatabaseあるためには、例外をスローします:

{System.Data.SqlServerCe.SqlCeException (0x80004005): File already exists. Try using a different database name. [ File name = TestDB.db ] at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.CreateDatabase()

が、これはバグですか、私は何かが足りないのですか?

編集

ミニテスト・コードを作成し、私はこの問題を再現することができました。

  • 最初の実行:問題なし、データベースファイルが作成されます。
  • セカンドラン:例外データ・コンテキスト・オブジェクトによれば、データベースはここ

が存在しないためのコードである:

public static class Test 
{ 
    [Table(Name="test_table")] 
    public class TestEntity 
    { 
     [Column(Name = "id", IsPrimaryKey = true, IsDbGenerated = true, CanBeNull = false, DbType = "INT NOT NULL IDENTITY")] 
     public Int32 Id 
     { 
      get; 
      set; 
     } 

     [Column(Name = "name", CanBeNull = false, DbType = "NVARCHAR(20) NOT NULL UNIQUE")] 
     public String Name 
     { 
      get; 
      set; 
     } 
    } 

    [Database(Name = "TestDB")] 
    public class TestContext : DataContext 
    { 
     public Table<TestEntity> Entities 
     { 
      get { return base.GetTable<TestEntity>(); } 
     } 

     public TestContext(IDbConnection connection) 
      : base(connection) 
     { 
     } 
    } 

    public static void TryCreate(string dataSource) 
    { 
     IDbConnection connection; 
     TestContext context; 

     // create connection 
     { 
      SqlCeConnectionStringBuilder stringBuilder = new SqlCeConnectionStringBuilder(); 
      stringBuilder.DataSource = dataSource; 

      connection = new SqlCeConnection(stringBuilder.ConnectionString); 
     } 

     // create context 
     context = new TestContext(connection); 

     // create database 
     if (context.DatabaseExists()) 
      context.DeleteDatabase(); 
     context.CreateDatabase(); 
    } 
} 

編集2:で解決

通報適切な(sdf)ファイル拡張子を使用します。

+0

データベースファイルのフルパスで試しましたか? – ErikEJ

+0

同じ結果を試しました。権限の問題のようなものになることはできますか? – csisy

+0

どのようにCreateDatabaseコードを呼び出しますか?いくつかの簡単なレポーターコードではどうですか?このような簡単なコードを使用することができます:https://msdn.microsoft.com/en-us/library/bb399420(v=vs.110)。aspx – ErikEJ

答えて

1

から始まるErikEJのコメントから問題が見つかりました:ファイル拡張子。

MS SQL CEと同じです。になります。.sdfファイル拡張子を使用してください。

関連する問題