• C#操作SQLite数据库


    我们在开发应用是经常会需要用到一些数据的存储,存储的方式有多种,使用数据库是一种比较受大家欢迎的方式。但是对于一些小型的应用,如一些移动APP,通常的数据库过于庞大,而轻便的SQLite则能解决这一问题。不但操作方便,而且只需要要一个文件即可,在这里我们来说一说使用C#语言操作SQLite数据库。

    1SQLite简介

    SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起MySQL、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

    如果想了解更多关于SQLite的问题,可以访问它的官方网站:http://www.sqlite.org/

    2、开始前的准备

    在开始之前我们需要准备必要的开发环境,这次咱们使用的是Visual Studio 2015开发环境,但是我们开发基于SQLite的应用光有VS2015还不够。我需要到SQLite的官方网站下载并安装SQLite。

    在SQLite官网找到下载,有应用于各种环境的SQLite组件及源码,我们选择Precompiled Binaries for .NET,这是应用于.NET开发环境的,点击进入会看到应用于.NET2.0直至4.6以及32位和64位平台的各个版本。我们选择Setups for 32-bit Windows (.NET Framework 4.6)下载安装即可。

    3C#操作SQLite的封装

    在完成开发环境的准备之后,我们接下来实现对SQLite操作的必要封装,以进一步降低在具体应用中的使用难度。在这里我们只是封装一些常用而且必要的功能。

      1     public class SQLiteHelper
      2     {
      3         //创建数据库文件
      4         public static void CreateDBFile(string fileName)
      5         {
      6             string path = System.Environment.CurrentDirectory + @"/Data/";
      7             if (!Directory.Exists(path))
      8             {
      9                 Directory.CreateDirectory(path);
     10             }
     11             string databaseFileName = path + fileName;
     12             if (!File.Exists(databaseFileName))
     13             {
     14                 SQLiteConnection.CreateFile(databaseFileName);
     15             }
     16         }
     17  
     18         //生成连接字符串
     19          private static string CreateConnectionString()
     20         {
     21             SQLiteConnectionStringBuilder connectionString = new SQLiteConnectionStringBuilder();
     22             connectionString.DataSource = @"data/ScriptHelper.db";
     23  
     24             string conStr = connectionString.ToString();
     25             return conStr;
     26         }
     27  
     28         /// <summary>
     29         /// 对插入到数据库中的空值进行处理
     30         /// </summary>
     31         /// <param name="value"></param>
     32         /// <returns></returns>
     33         public static object ToDbValue(object value)
     34         {
     35             if (value == null)
     36             {
     37                 return DBNull.Value;
     38             }
     39             else
     40             {
     41                 return value;
     42             }
     43         }
     44  
     45         /// <summary>
     46         /// 对从数据库中读取的空值进行处理
     47         /// </summary>
     48         /// <param name="value"></param>
     49         /// <returns></returns>
     50         public static object FromDbValue(object value)
     51         {
     52             if (value == DBNull.Value)
     53             {
     54                 return null;
     55             }
     56             else
     57             {
     58                 return value;
     59             }
     60         }
     61  
     62         /// <summary>
     63         /// 执行非查询的数据库操作
     64         /// </summary>
     65         /// <param name="sqlString">要执行的sql语句</param>
     66         /// <param name="parameters">参数列表</param>
     67         /// <returns>返回受影响的条数</returns>
     68         public static int ExecuteNonQuery(string sqlString, params SQLiteParameter[] parameters)
     69         {
     70             string connectionString=CreateConnectionString();
     71             using (SQLiteConnection conn = new SQLiteConnection(connectionString))
     72             {
     73                 conn.Open();
     74                 using (SQLiteCommand cmd = conn.CreateCommand())
     75                 {
     76                     cmd.CommandText = sqlString;
     77                     foreach (SQLiteParameter parameter in parameters)
     78                     {
     79                         cmd.Parameters.Add(parameter);
     80                     }
     81                     return cmd.ExecuteNonQuery();
     82                 }
     83             }
     84         }
     85  
     86         /// <summary>
     87         /// 执行查询并返回查询结果第一行第一列
     88         /// </summary>
     89         /// <param name="sqlString">SQL语句</param>
     90         /// <param name="sqlparams">参数列表</param>
     91         /// <returns></returns>
     92         public static object ExecuteScalar(string sqlString, params SQLiteParameter[] parameters)
     93         {
     94             string connectionString = CreateConnectionString();
     95             using (SQLiteConnection conn = new SQLiteConnection(connectionString))
     96             {
     97                 conn.Open();
     98                 using (SQLiteCommand cmd = conn.CreateCommand())
     99                 {
    100                     cmd.CommandText = sqlString;
    101                     foreach (SQLiteParameter parameter in parameters)
    102                     {
    103                         cmd.Parameters.Add(parameter);
    104                     }
    105                     return cmd.ExecuteScalar();
    106                 }
    107             }
    108         }
    109  
    110         /// <summary>
    111         /// 查询多条数据
    112         /// </summary>
    113         /// <param name="sqlString">SQL语句</param>
    114         /// <param name="parameters">参数列表</param>
    115         /// <returns>返回查询的数据表</returns>
    116         public static DataTable GetDataTable(string sqlString,params SQLiteParameter[] parameters)
    117         {
    118             string connectionString = CreateConnectionString();
    119             using (SQLiteConnection conn = new SQLiteConnection(connectionString))
    120             {
    121                 conn.Open();
    122                 using (SQLiteCommand cmd = conn.CreateCommand())
    123                 {
    124                     cmd.CommandText = sqlString;
    125                     foreach (SQLiteParameter parameter in parameters)
    126                     {
    127                         cmd.Parameters.Add(parameter);
    128                     }
    129                     DataSet ds = new DataSet();
    130                     SQLiteDataAdapter adapter = new SQLiteDataAdapter(cmd);
    131                     adapter.Fill(ds);
    132                     return ds.Tables[0];
    133                 }
    134             }
    135         }
    136     }

    4、应用实例

    上面封装完了之后,我们就是使用上面封装的函数来实际操作SQLite数据库。对数据库的应用实例无非就是对各种对象的增、删、改、查。我没列举一个对源码类型对象的各种操作实例如下:

     1     public class ScriptTypeDAL
     2     {
     3         public ScriptTypeM ToScriptType(DataRow row)
     4         {
     5             ScriptTypeM type = new ScriptTypeM();
     6             type.ScriptTypeId = (Guid)row["ScriptTypeId"];
     7             type.ScriptType = (string)row["ScriptType"];
     8             type.IsUsing = (bool)row["IsUsing"];
     9             return type;
    10         }
    11  
    12         public void Insert(ScriptTypeM Type)
    13         {
    14             SQLiteHelper.ExecuteNonQuery(@"insert into TB_ScriptType(ScriptTypeId,ScriptType,IsUsing)
    15                                            Values(@ScriptTypeId,@ScriptType,1)",
    16                                            new SQLiteParameter("ScriptTypeId", Type.ScriptTypeId),
    17                                            new SQLiteParameter("ScriptType", Type.ScriptType));
    18 
    19         }
    20  
    21         public void Update(ScriptTypeM Type)
    22         {
    23             SQLiteHelper.ExecuteNonQuery(@"update TB_ScriptType set ScriptType=@ScriptType,
    24                                            IsUsing=@IsUsing where ScriptTypeId=@ScriptTypeId",
    25                                            new SQLiteParameter("ScriptType", Type.ScriptType),
    26                                            new SQLiteParameter("IsUsing", Type.IsUsing),
    27                                            new SQLiteParameter("ScriptTypeId", Type.ScriptTypeId));
    28         }
    29  
    30         public ScriptTypeM GetbyId(Guid id)
    31         {
    32             DataTable table = SQLiteHelper.GetDataTable("select * from TB_ScriptType where ScriptTypeId=@id",
    33                                                         new SQLiteParameter("id", id));
    34             if (table.Rows.Count <= 0)
    35             {
    36                 return null;
    37             }
    38             else if (table.Rows.Count > 1)
    39             {
    40                 throw new Exception("Id重复!");
    41             }
    42             else
    43             {
    44                 return ToScriptType(table.Rows[0]);
    45             }
    46         }
    47  
    48         public ScriptTypeM GetbyName(string name)
    49         {
    50             DataTable table = SQLiteHelper.GetDataTable("select * from TB_ScriptType where ScriptType=@name",
    51                                                         new SQLiteParameter("name", name));
    52             if (table.Rows.Count <= 0)
    53             {
    54                 return null;
    55             }
    56             else if (table.Rows.Count > 1)
    57             {
    58                 throw new Exception("类型名称重复!");
    59             }
    60             else
    61             {
    62                 return ToScriptType(table.Rows[0]);
    63             }
    64         }
    65  
    66         public ScriptTypeM[] ListAll()
    67         {
    68             DataTable table = SQLiteHelper.GetDataTable("select * from TB_ScriptType where IsUsing=1");
    69             ScriptTypeM[] type = new ScriptTypeM[table.Rows.Count];
    70             for (int i = 0; i < table.Rows.Count; i++)
    71             {
    72                 type[i] = ToScriptType(table.Rows[i]);
    73             }
    74             return type;
    75         }
    76  
    77         public ScriptTypeM[] Search(string sql, List<SQLiteParameter> parameterList)
    78         {
    79             DataTable table = SQLiteHelper.GetDataTable(sql, parameterList.ToArray());
    80             ScriptTypeM[] type = new ScriptTypeM[table.Rows.Count];
    81             for (int i = 0; i < table.Rows.Count; i++)
    82             {
    83                 type[i] = ToScriptType(table.Rows[i]);
    84             }
    85             return type;
    86         }
    87     }

    SQLite数据库小巧而且应用方便,在一些小型应用和嵌入式应用中很有优势,当然如何应用的得心应手就看个人了。

  • 相关阅读:
    python__基础 : 类属性,类方法,静态方法
    python__基础 : 类的继承,调用父类的属性和方法
    python__基础 : 类的__init__,__str__,__del__方法
    Python__关于列表的引用 以append操作为例
    HTML5 Canvas 绘制图片不显示的问题
    MySQL 查询排除指定字段、自定义变量、动态执行SQL
    .Net系列 Transaction 事务
    Redis 基本操作
    C# 数值计算、转换
    详解.NET IL代码
  • 原文地址:https://www.cnblogs.com/foxclever/p/8195906.html
Copyright © 2020-2023  润新知