私は前にSQLiteを使用しましたが、DataContext
(AFAIKはSQLiteがサポートしていません)を使用してデータベースを作成できませんでしたので、私はMS SQL CE 4に切り替えました非推奨ですが、まだxcopyをインストールして比較的小さくても構いませんが)、データベースの作成に問題があります。MS SQL CE DataContextデータベースが存在する/削除する
まず、接続を開かずに試してみましたが、DatabaseExists
がfalseを返しました。私は接続を開く必要があると思ったので、DataContext
のDatabaseExists
とDeleteDatabase
を開いたままで接続しようとしています。 dataSouce
は、データベースの相対名です
SqlCeConnectionStringBuilder stringBuilder = new SqlCeConnectionStringBuilder();
stringBuilder.DataSource = dataSource;
connection = new SqlCeConnection(stringBuilder.ConnectionString);
:私はこのような接続を作成しています。
次に、強く型付けされたDataContext
(Context
)を使用して、データベースが存在しない場合は除外して作成するかどうかを判断しようとしています。
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)ファイル拡張子を使用します。
データベースファイルのフルパスで試しましたか? – ErikEJ
同じ結果を試しました。権限の問題のようなものになることはできますか? – csisy
どのようにCreateDatabaseコードを呼び出しますか?いくつかの簡単なレポーターコードではどうですか?このような簡単なコードを使用することができます:https://msdn.microsoft.com/en-us/library/bb399420(v=vs.110)。aspx – ErikEJ