zoukankan      html  css  js  c++  java
  • SQLite在C#中的使用

    SQLite是一款轻型的数据库,在一些数据量不太大的程序中,它暂用的资源非常低。支持很多操作系统和许多语言,所以还是很方便的。在C#中,要用的话可以通过网站来下载或者在VS中通过NuGet来下载。这个就不多说了,当你下载并且装完数据库后,就可以直接使用它,下面就先看下最基础的数据库操作:

    首先就是关于创建数据库和创建表:

    private static void Create() {
                if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "Data")) {
                    Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "Data");
                    SQLiteConnection.CreateFile(AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3");
                }
    
                if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3")) {
                    string datasource = "Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3";
                    SQLiteConnection conn = new SQLiteConnection(datasource);
                    conn.Open();
    
                    SQLiteCommand cmd = conn.CreateCommand();
                    string sql = "Create TABLE Test(ID GUID PRIMARY KEY,Content INTEGER NOT NULL)";
                    cmd.CommandText = sql;
                    cmd.Connection = conn;
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
    View Code

    然后么就是什么增删改查之类的东西了,这其实都差不多的:

    private static void Create() {
                if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "Data")) {
                    Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "Data");
                    SQLiteConnection.CreateFile(AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3");
                }
    
                if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3")) {
                    string datasource = "Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3";
                    SQLiteConnection conn = new SQLiteConnection(datasource);
                    conn.Open();
    
                    SQLiteCommand cmd = conn.CreateCommand();
                    string sql = "Create TABLE Test(ID GUID PRIMARY KEY,Content INTEGER NOT NULL)";
                    cmd.CommandText = sql;
                    cmd.Connection = conn;
                    cmd.ExecuteNonQuery();
                    conn.Close();
                }
            }
    
            private static void Add() {
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3")) {
                    conn.Open();
                    SQLiteCommand cmd = conn.CreateCommand();
                    DbTransaction trans = conn.BeginTransaction();    //延时事务
                    try {
                        for (int i = 0; i < 1000; i++) {
                            cmd.CommandText = "insert into Test values(@ID,@Content)";
                            cmd.Parameters.Add(new SQLiteParameter("@ID", Guid.NewGuid()));
                            cmd.Parameters.Add(new SQLiteParameter("@Content", i));
    
                            cmd.ExecuteNonQuery();
                        }
                        trans.Commit();    //提交事务
                    } catch {
                        trans.Rollback();    //事务回滚
                        throw;
                    }
                }
            }
    
            private static void DeleteOne() {
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3")) {
                    conn.Open();
                    SQLiteCommand cmd = conn.CreateCommand();
                    cmd.CommandText = string.Format("delete from Test where Content=@value");
                    cmd.Parameters.Add(new SQLiteParameter("@value", 100));
                    cmd.ExecuteNonQuery();
                }
            }
    
            private static List<Guid> GetGuid() {
                using (SQLiteConnection conn = new SQLiteConnection("Data Source=" + AppDomain.CurrentDomain.BaseDirectory + "Data\test2.db3")) {
                    List<Guid> list = new List<Guid>();
                    conn.Open();
                    SQLiteCommand cmd = conn.CreateCommand();
                    cmd.CommandText = "select * from Test where Content=@content";
                    cmd.Parameters.Add(new SQLiteParameter("content", 101));
                    SQLiteDataReader dr = cmd.ExecuteReader();
                    while (dr.Read()) {
                        Guid ID = dr.GetGuid(0);
                        list.Add(ID);
                    }
                    return list;
                }
            }
    View Code

    然后再看到上面的Add()的方法中,如果一次性的批量加入数据时,需要对事务进行一个处理,因为如果不处理的话一次的执行就是一条事务,这样时间都花在了开始事务、提交事务上,速度会很慢。应该把这个添加变为一个统一的事务,同事如果出错,还可以进行事务回滚。

    跟事务有关联的是一个锁的问题,当有两个以上链接要读写同一个数据库的时候就会发生死锁的问题。虽然我还没碰到过,不过还是先知道下比较好,免的以后出错。具体的概念嘛还是看看别人写的:链接1&&链接2

    最后是我的Demo

  • 相关阅读:
    Java map双括号初始化方式的问题
    Koa 中间件的执行
    JavaScript 实现页面中录音功能
    Koa 中实现 chunked 数据传输
    WebAssembly 上手
    TypeScript `infer` 关键字
    Vim 插件的安装
    MySQL EXPLAIN 语句
    面向切面编程(AOP)
    CSS 类名的问题
  • 原文地址:https://www.cnblogs.com/socialdk/p/3238753.html
Copyright © 2011-2022 走看看