C#操作Sqlite实例

C#中操作Sqlite数据库,以下是一个封装的操作类(可以打包成dll,本例sqlite.dll):

需要下载并添加引用Sqlite文件System.Data.SQLite.DLL

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;  // DataTable,DataRow
using System.Data.SQLite;   // System.Data.SQLite.DLL
using System.IO;    // Path

namespace sqlite
{
    /// <summary>
    /// 使用方法:
    /// using System.Data;
    /// using sqlite;
    /// Sqlite ms = new Sqlite("test.sqlite");
    /// string sql = "select * from `posts` where `id`=@id";
    /// Dictionary<string, object> param = new Dictionary<string, object>();
    /// param.Add("@id", 1);
    /// DataRow[] rows = ms.getRows(sql, param);
    /// </summary>
    public class Sqlite
    {
        private string _dbpath;

        private SQLiteConnection _conn;
        /// <summary>
        /// SQLite连接
        /// </summary>
        private SQLiteConnection conn
        {
            get
            {
                if (_conn == null)
                {
                    _conn = new SQLiteConnection(
                        string.Format("Data Source={0};Version=3;",
                        this._dbpath
                        ));
                    _conn.Open();
                }
                return _conn;
            }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="dbpath">sqlite数据库文件路径,相对/绝对路径</param>
        public Sqlite(string dbpath)
        {
            if (Path.IsPathRooted(dbpath))
            {
                this._dbpath = dbpath;
            }
            else
            {
                this._dbpath = string.Format("{0}/{1}", AppDomain.CurrentDomain.SetupInformation.ApplicationBase, dbpath);
            }

        }

        /// <summary>
        /// 获取多行
        /// </summary>
        /// <param name="sql">执行sql</param>
        /// <param name="param">sql参数</param>
        /// <returns>多行结果</returns>
        public DataRow[] getRows(string sql, Dictionary<string, object> param=null)
        {
            List<SQLiteParameter> sqlite_param = new List<SQLiteParameter>();

            if (param != null)
            {
                foreach (KeyValuePair<string, object> row in param)
                {
                    sqlite_param.Add(new SQLiteParameter(row.Key, row.Value.ToString()));
                }
            }

            DataTable dt = this.ExecuteDataTable(sql, sqlite_param.ToArray());
            return dt.Select();
        }

        /// <summary>
        /// 获取单行
        /// </summary>
        /// <param name="sql">执行sql</param>
        /// <param name="param">sql参数</param>
        /// <returns>单行数据</returns>
        public DataRow getRow(string sql, Dictionary<string, object> param=null)
        {
            DataRow[] rows = this.getRows(sql, param);
            return rows[0];
        }

        /// <summary>
        /// 获取字段
        /// </summary>
        /// <param name="sql">执行sql</param>
        /// <param name="param">sql参数</param>
        /// <returns>字段数据</returns>
        public Object getOne(string sql, Dictionary<string, object> param=null)
        {
            DataRow row = this.getRow(sql, param);
            return row[0];
        }

        /// <summary>
        /// SQLite增删改
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="parameters">所需参数</param>
        /// <returns>所受影响的行数</returns>
        public int query(string sql, Dictionary<string, object> param = null)
        {
            List<SQLiteParameter> sqlite_param = new List<SQLiteParameter>();

            if (param != null)
            {
                foreach (KeyValuePair<string, object> row in param)
                {
                    sqlite_param.Add(new SQLiteParameter(row.Key, row.Value.ToString()));
                }
            }

            return this.ExecuteNonQuery(sql, sqlite_param.ToArray());
        }

        /// <summary>
        /// SQLite增删改
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="parameters">所需参数</param>
        /// <returns>所受影响的行数</returns>
        private int ExecuteNonQuery(string sql, SQLiteParameter[] parameters)
        {
            int affectedRows = 0;

            System.Data.Common.DbTransaction transaction = conn.BeginTransaction();
            SQLiteCommand command = new SQLiteCommand(conn);
            command.CommandText = sql;
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            affectedRows = command.ExecuteNonQuery();
            transaction.Commit();

            return affectedRows;
        }

        /// <summary>
        /// SQLite查询
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="parameters">所需参数</param>
        /// <returns>结果DataTable</returns>
        private DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters)
        {
            DataTable data = new DataTable();

            SQLiteCommand command = new SQLiteCommand(sql, conn);
            if (parameters != null)
            {
                command.Parameters.AddRange(parameters);
            }
            SQLiteDataAdapter adapter = new SQLiteDataAdapter(command);
            adapter.Fill(data);

            return data;
        }

        /// <summary>
        /// 查询数据库表信息
        /// </summary>
        /// <returns>数据库表信息DataTable</returns>
        public DataTable GetSchema()
        {
            DataTable data = new DataTable();

            data = conn.GetSchema("TABLES");

            return data;
        }
    }
}

.net4需要在工程中添加App.config做一下申明:

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
  <appSettings>
    <add key="dbpath" value="test.sqlite"/>
  </appSettings>
</configuration>
新建一个实例工程(本例wpf),添加引用本例封装成包的sqlite.dll,本例读取了同在App.config中的sqlite文件位置的配置项dbpath

实例代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Configuration; // System.configuration.dll
using sqlite;   //Sqlite.dll
using System.Data;
using note.DataContract;   

namespace note
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            // db init
            string dbpath = ConfigurationManager.AppSettings["dbpath"];
            Sqlite ms = new Sqlite(dbpath);

            // get data
            string sql = "select * from `notes` limit 10";
            DataRow[] rows = ms.getRows(sql);

        }
    }
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值