我对本地数据库的选择是什么?

时间:2016-01-23 12:57:27

标签: c# database

我正在创建一个C#WPF应用程序,我想使用本地数据库来存储数据,但是我对使用什么感到困惑。 我不会存储任何大量数据,我希望能够运行应用程序而无需安装任何其他软件(如SQL服务器)。我环顾四周但发现很难找到相关信息。 我考虑过使用SQL Server精简版,但看起来它不受支持,似乎我无法在VS2015社区中创建.sdf数据库,.mdf数据库是唯一的选项(我假设需要一个SQL服务器)

  

SQL Server精简版处于弃用模式,未来不会计划新版本。上一版本SQL CE 4.0SP1(以及仍在支持周期中的早期版本)将在其生命周期内继续得到支持,Microsoft致力于修复这些版本中发现的任何主要的生产阻塞问题。

你可以说明我可以使用的选项是什么,或者在某些地方可以参考我,我可以在这里阅读一些内容吗?提前谢谢。

6 个答案:

答案 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直接读取和写入磁盘文件。这种方法的一些好处:

  1. 他们可以通过单行调用来序列化他们的结构和数据。
  2. 不需要驱动程序/库。开箱即用的.NET一直支持DataSet。
  3. 不需要SQL。使用LINQ或数据控件执行过滤/排序等。
  4. 强类型DataSet为您提供智能感知支持。
  5. 一些缺点:

    1. 没有SQL支持。如果您需要复杂的查询,这种方法可能无法正常工作。
    2. 不适合大数据,因为整个数据库会立即加载到内存中。
    3. 由于您已明确提到需要一个小型本地数据库,因此这些问题可能不会对您造成伤害。

答案 5 :(得分:0)

您有很多选择,但也考虑您的长期需求:

  • 使用xml,只需将对象序列化/反序列化为本地xml文件。
  • 同样,序列化为json格式 - 它更紧凑,仍然是人类可读的。
  • 而不是安装数据库,租用像MySQL这样的云提供的数据库。只要您的数据很小,开发人员帐户就应该是免费的。使用像Entity Framework这样的关系ORM作为中间件,这样您就可以轻松地尝试不同的数据库。 EF6与Firebird一起使用,它可以理解xml文件(如果你选择第一个选项)
  • 完全跳过关系数据库,然后使用像NDatabase这样的OODB。你也应该能够在云中找到它。