我正在创建一个C#WPF应用程序,我想使用本地数据库来存储数据,但是我对使用什么感到困惑。 我不会存储任何大量数据,我希望能够运行应用程序而无需安装任何其他软件(如SQL服务器)。我环顾四周但发现很难找到相关信息。 我考虑过使用SQL Server精简版,但看起来它不受支持,似乎我无法在VS2015社区中创建.sdf数据库,.mdf数据库是唯一的选项(我假设需要一个SQL服务器)
SQL Server精简版处于弃用模式,未来不会计划新版本。上一版本SQL CE 4.0SP1(以及仍在支持周期中的早期版本)将在其生命周期内继续得到支持,Microsoft致力于修复这些版本中发现的任何主要的生产阻塞问题。
你可以说明我可以使用的选项是什么,或者在某些地方可以参考我,我可以在这里阅读一些内容吗?提前谢谢。
答案 0 :(得分:2)
最广泛使用的解决方案之一是SQLite。它是一个小巧但功能强大的嵌入式SQL引擎,它是跨平台的。它存在很长时间,并且有一个ADO.NET driver。
答案 1 :(得分:0)
使用SQLite。我们一直在使用它。对于这样的用例,它快速而强大,并且可以通过多种语言访问。与常规数据库不同,它不需要额外的过程,而且会生成一个文件,以后可以复制。
答案 2 :(得分:0)
您将使用light-ORM和SQLite的组合。它将满足您的所有需求。
对于特定的光 - ORM,我强调使用Dapper
打开Visual Studio添加sqlite和dapper。
以下是使用dapper
的简单数据访问层的示例public class MyDal
{
public List<string> GetSomething()
{
var strQuery = string.Format(SQLCOMMAND);
var result = new List<String>();
using (var con = DbConnection())
{
result = con.Query<String>(strQuery).ToList();
}
return result;
}
public static OleDbConnection DbConnection()
{
return new OleDbConnection(myConnectionString);
}
}
答案 3 :(得分:0)
我建议使用SQLite。 通过nuget包安装程序将SQLite dll添加到项目引用中。 使用SQLite C#的基本CRUD操作示例。
public class DownloadDatabase
{
SQLiteConnection sqliteConnection;
public DownloadDatabase(string dbName)
{
string ConnectionString = "Data Source=" + "Absoute path to database store location" + ";Version=3;";
sqliteConnection = new SQLiteConnection(ConnectionString);
sqliteConnection.Open();
}
public void CreateDB()
{
string table = "CREATE TABLE IF NOT EXISTS Downloads ( _id INTEGER PRIMARY KEY NULL,user_id TEXT NULL DEFAULT '', target_id TEXT NOT NULL, url TEXT NOT NULL, local_file TEXT NOT NULL,authenticate TEXT NOT NULL DEFAULT '', login TEXT NULL DEFAULT '', password TEXT NULL DEFAULT '', mime_type TEXT NULL DEFAULT '', accept_ranges TEXT NULL DEFAULT '', file_size NUMBER NULL DEFAULT 0, last_modified TEXT NULL DEFAULT '',created TEXT NULL DEFAULT '',initial_start_position NUMBER NULL DEFAULT 0, start_position NUMBER NULL DEFAULT 0, end_position NUMBER NULL DEFAULT 0, progress TEXT NOT NULL,is_paused TEXT NULL ,device_id TEXT NULL, state NUMBER NULL, originID TEXT NULL DEFAULT '');";
try
{
using (SQLiteCommand command = new SQLiteCommand(table, sqliteConnection))
{
command.ExecuteNonQuery();
}
}
catch (Exception ex)
{
Console.WriteLine("Creating Downloads database failed: " + ex.Message);
}
}
public void UpdateDBAndCreateEntryIfNotExists(DownloadItem item)
{
try
{
using (SQLiteCommand checkEntryCommand = sqliteConnection.CreateCommand())
{
checkEntryCommand.CommandText = "SELECT * FROM Downloads WHERE target_id=@target_id LIMIT 1";
checkEntryCommand.Parameters.Add(new SQLiteParameter("@target_id", item.targetID));
using (SQLiteDataReader reader = checkEntryCommand.ExecuteReader())
{
if (reader.Read())
{
using (SQLiteCommand updatecommand = sqliteConnection.CreateCommand())
{
double dprogress;
if (!Double.TryParse(reader.GetString(16), out dprogress))
{
dprogress = 0;
}
if (item.progress != dprogress)
{
updatecommand.CommandText = "UPDATE Downloads SET last_modified=@last_modified, start_position=@start_position, end_position=@end_position, progress = @progress, is_paused = @is_paused, state = @state WHERE target_id=@target_id";
updatecommand.Parameters.Add(new SQLiteParameter("@last_modified", item.lastModified));
updatecommand.Parameters.Add(new SQLiteParameter("@start_position", item.startPosition));
updatecommand.Parameters.Add(new SQLiteParameter("@end_position", item.endPosition));
updatecommand.Parameters.Add(new SQLiteParameter("@progress", item.progress));
updatecommand.Parameters.Add(new SQLiteParameter("@target_id", item.targetID));
updatecommand.Parameters.Add(new SQLiteParameter("@is_paused", item.isPaused ? "True" : "False"));
updatecommand.Parameters.Add(new SQLiteParameter("@state", item.state));
updatecommand.ExecuteNonQuery();
}
}
}
else
{
using (SQLiteCommand insertcommand = sqliteConnection.CreateCommand())
{
insertcommand.CommandText = "INSERT INTO Downloads ( target_id, url,local_file, authenticate, login, password, mime_type, accept_ranges, file_size, last_modified, created, initial_start_position, start_position, end_position, progress, is_paused, device_id, state, originID) values (@target_id,@url, @local_file, @authenticate,@login,@password,@mime_type,@accept_ranges,@file_size, @last_modified,@created, @initial_start_position,@start_position,@end_position,@progress,@is_paused, @device_id, @state, @originID) ";
insertcommand.Parameters.Add(new SQLiteParameter("@target_id", item.targetID));
insertcommand.Parameters.Add(new SQLiteParameter("@url", item.url));
insertcommand.Parameters.Add(new SQLiteParameter("@local_file", item.localFile));
insertcommand.Parameters.Add(new SQLiteParameter("@authenticate", item.authenticate));
insertcommand.Parameters.Add(new SQLiteParameter("@login", item.login == null ? "" : item.login));
insertcommand.Parameters.Add(new SQLiteParameter("@password", item.password == null ? "" : item.password));
insertcommand.Parameters.Add(new SQLiteParameter("@mime_type", item.mimeType));
insertcommand.Parameters.Add(new SQLiteParameter("@accept_ranges", item.acceptRanges));
insertcommand.Parameters.Add(new SQLiteParameter("@file_size", item.fileSize));
insertcommand.Parameters.Add(new SQLiteParameter("@last_modified", item.lastModified));
insertcommand.Parameters.Add(new SQLiteParameter("@created", item.created));
insertcommand.Parameters.Add(new SQLiteParameter("@initial_start_position", item.initialStartPosition));
insertcommand.Parameters.Add(new SQLiteParameter("@start_position", item.startPosition));
insertcommand.Parameters.Add(new SQLiteParameter("@end_position", item.endPosition));
insertcommand.Parameters.Add(new SQLiteParameter("@progress", item.progress));
insertcommand.Parameters.Add(new SQLiteParameter("@is_paused", item.isPaused ? "True" : "False"));
insertcommand.Parameters.Add(new SQLiteParameter("@device_id", item.deviceId == null ? "" : item.deviceId));
insertcommand.Parameters.Add(new SQLiteParameter("@state", item.state));
insertcommand.Parameters.Add(new SQLiteParameter("@originID", item.originID));
insertcommand.ExecuteNonQuery();
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Download progress update failed: " + ex.Message);
}
}
public bool DeleteItem(string targetID)
{
try
{
using (SQLiteCommand deleteCommand = sqliteConnection.CreateCommand())
{
string tableName = "";
tableName = "Downloads";
deleteCommand.CommandText = "DELETE FROM " + tableName + " WHERE target_id=@target_id";
deleteCommand.Parameters.Add(new SQLiteParameter("@target_id", targetID));
deleteCommand.ExecuteReader();
return true;
}
}
catch (Exception ex)
{
Console.WriteLine("Delete item Failed: " + ex.Message);
return false;
}
}
}
答案 4 :(得分:0)
我在这种情况下反复使用的一个解决方案是不使用任何DBMS。相反,您可以使用ADO.NET的DataSet
直接读取和写入磁盘文件。这种方法的一些好处:
一些缺点:
由于您已明确提到需要一个小型本地数据库,因此这些问题可能不会对您造成伤害。
答案 5 :(得分:0)
您有很多选择,但也考虑您的长期需求: