csharp使用sqlite数据库

起因

昨天在给同学写demo.考虑跨平台使用,因为是demo无需考虑压力,数据库采用Sqlite.真正在项目中是没有使用过Sqlite的.最早一次使用的,还是在14或者15年,在学习c语言的时候.

  1. 项目基于.Net Framework 4.5,但使用的Mono的程序集,主要是避免.Net Framework程序集依赖Windows特性.为了无缝迁移Linux.
  2. 采用Nancy轻量级MVC框架,为什么没有使用Asp.Net Core 2.X,主要是对Sqlite支持不太好.
  3. 数据库使用Sqlite,轻量,不需要像SqlServer/MySql安装.考虑到需求简单.
  4. 服务器软件使用TinyFox,轻量,基于Libuv跨平台.

C#上手Sqlite

因考虑到程序集移植问题.使用Mono的程序集,Mono.Data.Sqlite.dll.只使用这个程序集是不行的.在该程序集是有依赖的.使用ILSpy.查看
c#操作的sqlite程序集,是依赖Native sqlite动态库

有依赖本地Navtive动态库或者共享库,在C#程序中,就需要针对性区分32位或者64了.
sqlite3.dll 下载地址:http://www.sqlite.org/download.html 

sqlite动态库下载地址

sqlite管理工具,这里使用的SQLiteStudio.可以手动修改数据表,对数据进行增删改查,很方便.

代码

using System;
using System.IO;
using Mono.Data.Sqlite;

namespace SqliteApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string dbFile = "test.db";
            if (File.Exists(dbFile))
            {
                File.Delete(dbFile);
            }
            SqliteConnection.CreateFile(dbFile);   //创建sqlite db文件

            //创建表语句
            string createTable = @"CREATE TABLE StudentInfo (
                                    NId      INTEGER       PRIMARY KEY AUTOINCREMENT
                                                           NOT NULL,
                                    SName    VARCHAR (64)  NOT NULL,
                                    SSex     VARCHAR (2)   NOT NULL,
                                    DtBron   DATETIME      NOT NULL,
                                    SAddress VARCHAR (128) 
                                );";

            //因为还是基于Ado.Net 访问数据库,所以惯用套路
            //1.Connection 创建数据库连接对象
            //2.Command    创建命令对象
            //3.DataReader 查询多行多列数据使用(偏向于使用DataReader获取数据)
            using (SqliteConnection con = new SqliteConnection($"Data Source ={ dbFile }; Version = 3; "))
            {
                con.Open();
                using (SqliteCommand cmd = new SqliteCommand(createTable,con))
                {
                    Console.WriteLine(cmd.ExecuteNonQuery());  //注意:对于Update/Insert和Delete语句,返回值为该命令所影响的行数.
                }
            }

            //因为基于Ado.net ,操作数据库API是一致的.
            string insertSql = $"insert into StudentInfo(SName,SSex,DtBron,SAddress) values('张三','男','1988-12-16','北京市海淀区');";
            using (SqliteConnection con = new SqliteConnection($"Data Source ={ dbFile }; Version = 3; "))
            {
                con.Open();
                using (SqliteCommand cmd = new SqliteCommand(insertSql, con))
                {
                    Console.WriteLine(cmd.ExecuteNonQuery());  //返回行数
                }
            }

            Console.WriteLine("ok");
            Console.ReadKey();
        }
    }
}

示例代码发在百度云盘上.链接: https://pan.baidu.com/s/1IL7DS1St4wwymwdQt5yRKg 密码: 41uc


秋风 2018-05-13