之前我使用过SQLite,但是我无法使用DataContext
创建数据库(AFAIK,SQLite不支持它)所以我切换到MS SQL CE 4(我知道它已被弃用但它可以仍然是xcopy安装和相对较小的)但我有数据库创建的问题。
首先,我尝试过没有打开连接,但DatabaseExists
返回false。我认为我必须打开一个连接,所以现在我正在尝试使用DataContext
的{{1}}和DatabaseExists
打开连接。我正在创建这样的连接:
DeleteDatabase
其中SqlCeConnectionStringBuilder stringBuilder = new SqlCeConnectionStringBuilder();
stringBuilder.DataSource = dataSource;
connection = new SqlCeConnection(stringBuilder.ConnectionString);
是数据库的相对名称。
然后我尝试使用强类型dataSouce
(称为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;
}
总是返回false。所以我认为这一定是一个问题所以我在关闭连接后移动DatabaseExists
调用但没有任何反应,文件仍在那里。
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()
编辑2:
使用正确的(sdf)文件扩展名解决了问题。