• sqlite helper


    //-------------------------------------------------------------------------- 
    //  
    //  Copyright (c) BUSHUOSX.  All rights reserved.  
    //  
    //  File: SqliteDbManager.cs 
    //
    //  Version:1.0.0.0
    //
    //  Datetime:
    // 
    //---------------------------------------------------------------------------
    /*
     * 
     * 修改时间:20140829 211000
     * 
     * 
     * 
     * 
     */
    
    using System;
    using System.Configuration;
    using System.Data.SQLite;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.IO;
    
    namespace BUSHUOSX.Helper
    {
    
        public sealed class SqliteDbManager
        {
            /// <summary>
            /// 获取连接字符串中某项的值
            /// </summary>
            /// <param name="connectionString">连接字符串</param>
            /// <param name="itemName">项目</param>
            /// <returns>项目值</returns>
            private static string GetItemValueFromConnectionString(string connectionString, string itemName)
            {
                if (!connectionString.EndsWith(";"))
                    connectionString += ";";
    
                // s* 匹配0个或多个空白字符
                // .*? 匹配0个或多个除 "
    " 之外的任何字符(?指尽可能少重复)
                string regexStr = itemName + @"s*=s*(?<key>.*?);";
                Regex r = new Regex(regexStr, RegexOptions.IgnoreCase);
                Match mc = r.Match(connectionString);
                return mc.Groups["key"].Value;
            }
    
            /// <summary>
            /// 创建System.Data.Sqlite数据库样式的连接字符串
            /// </summary>
            /// <param name="dbName">数据库名</param>
            /// <param name="dbFileExtName">数据库文件扩展名</param>
            /// <param name="dbPassword">数据库密码</param>
            /// <param name="dbDirectory">数据库目录路径</param>
            /// <returns>dbName为空时,返回空</returns>
            public static string GenerateSqliteConnectionString(string dbFileName, string dbPassword = "", string dbDirectory = "")
            {
                if (string.IsNullOrEmpty(dbFileName))
                {
                    return "";
                }
    
                StringBuilder sb = new StringBuilder("Data Source=");
                if (!string.IsNullOrEmpty(dbDirectory))
                {
                    sb.Append(dbDirectory);
                    if (!dbDirectory.EndsWith("\"))
                        sb.Append('\');
                }
    
                sb.Append(dbFileName).Append(';');
    
                if (!string.IsNullOrEmpty(dbPassword))
                    sb.AppendFormat("Password={0};", dbPassword);
    
                return sb.ToString();
            }
    
            /// <summary>
            /// 尝试用sqliteConnectionString打开已存在的数据库,或者用sqliteConnectionString创建新的数据库
            /// </summary>
            /// <param name="dbFileName"></param>
            /// <param name="dbPassword"></param>
            /// <returns></returns>
            public static bool OpenOrCreateSqliteDateBase(string dbFileName, string dbPassword)
            {
                return OpenOrCreateSqliteDateBase(GenerateSqliteConnectionString(dbFileName, dbPassword));
            }
    
            /// <summary>
            /// 尝试用sqliteConnectionString打开已存在的数据库,或者用sqliteConnectionString创建新的数据库
            /// </summary>
            /// <param name="sqliteConnectionString"></param>
            /// <returns></returns>
            public static bool OpenOrCreateSqliteDateBase(string sqliteConnectionString)
            {
                string dbFileName = GetItemValueFromConnectionString(sqliteConnectionString, "Data Source");
                string dbPassword = GetItemValueFromConnectionString(sqliteConnectionString, "Password");
                if (string.IsNullOrEmpty(dbFileName))
                {
                    return false;
                }
    
                try
                {
                    if (!File.Exists(dbFileName))
                    {
                        //创建目录
                        var parent = Directory.GetParent(dbFileName);
                        if (null != parent && !parent.Exists)
                        {
                            Directory.CreateDirectory(parent.FullName);
                        }
                        //var fs = File.Create(dbName);
                        //fs.Close();
    
                        //创建数据库
                        SQLiteConnection sqlconn = new SQLiteConnection("Data Source=" + dbFileName);
                        sqlconn.Open();
                        //设置密码
                        if (!string.IsNullOrEmpty(dbPassword))
                            sqlconn.ChangePassword(dbPassword);
                        sqlconn.Close();
    
                        return true;
                    }
                }
                catch (SQLiteException e)
                {
                    return false;
                }
                catch (Exception e)
                {
                    return false;
                }
    
                try
                {
                    //尝试打开数据库
                    SQLiteConnection sqlconn = new SQLiteConnection(sqliteConnectionString);
                    sqlconn.Open();
                    sqlconn.Close();
                }
                catch (SQLiteException e)
                {
                    return false;
                }
    
                return true;
            }
    
            public static bool TableExists(string sqliteConnectionString, string tableName)
            {
                bool result = false;
                SQLiteConnection sqlconn = new SQLiteConnection(sqliteConnectionString);
                try
                {
                    SQLiteCommand scmd = new SQLiteCommand(sqlconn);
                    scmd.CommandText = string.Format(@"select count(*) from sqlite_master where type='table' and name='{0}'", tableName);
    
                    //打开数据库
                    sqlconn.Open();
    
                    var v = scmd.ExecuteScalar();
                    if (1 == Convert.ToInt32(v))
                    {
                        result = true;
                    }
                }
                catch (Exception)
                {
                    //throw;
                }
                sqlconn.Close();
                return result;
            }
    
            public static bool DropTable(string sqliteConnectionString, string tableName)
            {
                return null != ExecuteNonQuery(sqliteConnectionString, string.Format("drop table if exists {0}", tableName));
            }
    
            public static bool RenameTable(string sqliteConnectionString, string oldTableName, string newTableName)
            {
                return null != ExecuteNonQuery(sqliteConnectionString, string.Format("alter table {0} rename to {1}", oldTableName, newTableName));
            }
    
            /// <summary>
            /// 执行sql命令
            /// </summary>
            /// <param name="sqliteConnectionString"></param>
            /// <param name="sql"></param>
            /// <returns></returns>
            public static object ExecuteNonQuery(string sqliteConnectionString, string sql)
            {
                object result = null;
    
                SQLiteConnection sqlconn = new SQLiteConnection(sqliteConnectionString);
                try
                {
                    //打开数据库
                    sqlconn.Open();
    
                    SQLiteCommand scmd = new SQLiteCommand(sqlconn);
                    scmd.CommandText = sql;
                    result = scmd.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    //throw;
                }
                sqlconn.Close();
    
                return result;
            }
        }
    }
  • 相关阅读:
    黑鲨2无限重启 把竞技按钮调到最上
    绿联 电池
    阿里云
    Centos 8 搭建时钟服务器
    CentOS8系统时间同步解决方法
    解决问题的人干活快的人
    【海通国际】Joe Lowry(Mr. Lithium)谈全球电池原材料供应危机
    Linux 实验楼
    用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
    【随笔】阿里云修改DNS
  • 原文地址:https://www.cnblogs.com/bushuosx/p/7343007.html
Copyright © 2020-2023  润新知