C#访问SQLite数据库,实现数据的增删改查功能

2023-11-16

    说明:本文的代码是基于Winform中举例的,经过实测可用。

1.封装Sqlite操作类:sqLiteHelper

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

namespace TestSqlite.sq
{
    /// <summary>
    /// SQLite 操作类
    /// </summary>
    public class SqLiteHelper
    {
        /// <summary>
        /// 数据库连接定义
        /// </summary>
      
        public  SQLiteConnection dbConnection;

        /// <summary>
        /// SQL命令定义
        /// </summary>
        private SQLiteCommand dbCommand;

        /// <summary>
        /// 数据读取定义
        /// </summary>
        private SQLiteDataReader dataReader;

        /// <summary>
        /// 数据库连接字符串定义
        /// </summary>
        private SQLiteConnectionStringBuilder dbConnectionstr;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="connectionString">连接SQLite库字符串</param>
        public SqLiteHelper(string connectionString)
        {
            try
            {
                dbConnection = new SQLiteConnection();
               
                dbConnectionstr = new SQLiteConnectionStringBuilder();
                dbConnectionstr.DataSource = connectionString;
                dbConnectionstr.Password = "admin";      //设置密码,SQLite ADO.NET实现了数据库密码保护
                dbConnection.ConnectionString = dbConnectionstr.ToString();
                dbConnection.Open();
            }
            catch (Exception e)
            {
                Log(e.ToString());
            }
        }

        /// <summary>
        /// 执行SQL命令
        /// </summary>
        /// <returns>The query.</returns>
        /// <param name="queryString">SQL命令字符串</param>
        public SQLiteDataReader ExecuteQuery(string queryString)
        {
            try
            {
                dbCommand = dbConnection.CreateCommand();
                dbCommand.CommandText = queryString;       //设置SQL语句
                dataReader = dbCommand.ExecuteReader();
            }
            catch (Exception e)
            {
                Log(e.Message);
            }

            return dataReader;
        }

        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public void CloseConnection()
        {
            //销毁Command
            if (dbCommand != null)
            {
                dbCommand.Cancel();
            }
            dbCommand = null;
            //销毁Reader
            if (dataReader != null)
            {
                dataReader.Close();
            }
            dataReader = null;
            //销毁Connection
            if (dbConnection != null)
            {
                dbConnection.Close();
            }
            dbConnection = null;

        }

        /// <summary>
        /// 读取整张数据表
        /// </summary>
        /// <returns>The full table.</returns>
        /// <param name="tableName">数据表名称</param>
        public SQLiteDataReader ReadFullTable(string tableName)
        {
            string queryString = "SELECT * FROM " + tableName;  //获取所有可用的字段
            return ExecuteQuery(queryString);
        }

        /// <summary>
        /// 向指定数据表中插入数据
        /// </summary>
        /// <returns>The values.</returns>
        /// <param name="tableName">数据表名称</param>
        /// <param name="values">插入的数值</param>
        public SQLiteDataReader InsertValues(string tableName, string[] values)
        {
            //获取数据表中字段数目
            int fieldCount = ReadFullTable(tableName).FieldCount;
            //当插入的数据长度不等于字段数目时引发异常
            if (values.Length != fieldCount)
            {
                throw new SQLiteException("values.Length!=fieldCount");
            }
            string queryString = "INSERT INTO " + tableName + " VALUES (" + "'" + values[0] + "'";
            for (int i = 1; i < values.Length; i++)
            {
                queryString += ", " + "'" + values[i] + "'";
            }
            queryString += " )";
            return ExecuteQuery(queryString);
        }

        /// <summary>
        /// 更新指定数据表内的数据
        /// </summary>
        /// <returns>The values.</returns>
        /// <param name="tableName">数据表名称</param>
        /// <param name="colNames">字段名</param>
        /// <param name="colValues">字段名对应的数据</param>
        /// <param name="key">关键字</param>
        /// <param name="value">关键字对应的值</param>
        /// <param name="operation">运算符:=,<,>,...,默认“=”</param>
        public SQLiteDataReader UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string value, string operation)
        {
            // operation="=";  //默认
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length");
            }
            string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'";

            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'";
            }
            queryString += " WHERE " + key + operation + "'" + value + "'";

            return ExecuteQuery(queryString);
        }
        /// <summary>
        /// 更新指定数据表内的数据
        /// </summary>
        /// <returns>The values.</returns>
        /// <param name="tableName">数据表名称</param>
        /// <param name="colNames">字段名</param>
        /// <param name="colValues">字段名对应的数据</param>
        /// <param name="key">关键字</param>
        /// <param name="value">关键字对应的值</param>
        /// <param name="operation">运算符:=,<,>,...,默认“=”</param>
        public SQLiteDataReader UpdateValues(string tableName, string[] colNames, string[] colValues, string key1, string value1, string operation, string key2, string value2)
        {
            // operation="=";  //默认
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length");
            }
            string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + "'" + colValues[0] + "'";

            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += ", " + colNames[i] + "=" + "'" + colValues[i] + "'";
            }
            //表中已经设置成int类型的不需要再次添加‘单引号’,而字符串类型的数据需要进行添加‘单引号’
            queryString += " WHERE " + key1 + operation + "'" + value1 + "'" + "OR " + key2 + operation + "'" + value2 + "'";

            return ExecuteQuery(queryString);
        }


        /// <summary>
        /// 删除指定数据表内的数据
        /// </summary>
        /// <returns>The values.</returns>
        /// <param name="tableName">数据表名称</param>
        /// <param name="colNames">字段名</param>
        /// <param name="colValues">字段名对应的数据</param>
        public SQLiteDataReader DeleteValuesOR(string tableName, string[] colNames, string[] colValues, string[] operations)
        {
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
            }

            string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";
            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += "OR " + colNames[i] + operations[0] + "'" + colValues[i] + "'";
            }
            return ExecuteQuery(queryString);
        }

        /// <summary>
        /// 删除指定数据表内的数据
        /// </summary>
        /// <returns>The values.</returns>
        /// <param name="tableName">数据表名称</param>
        /// <param name="colNames">字段名</param>
        /// <param name="colValues">字段名对应的数据</param>
        public SQLiteDataReader DeleteValuesAND(string tableName, string[] colNames, string[] colValues, string[] operations)
        {
            //当字段名称和字段数值不对应时引发异常
            if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length)
            {
                throw new SQLiteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");
            }

            string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + "'" + colValues[0] + "'";

            for (int i = 1; i < colValues.Length; i++)
            {
                queryString += " AND " + colNames[i] + operations[i] + "'" + colValues[i] + "'";
            }
            return ExecuteQuery(queryString);
        }


        /// <summary>
        /// 创建数据表
        /// </summary> +
        /// <returns>The table.</returns>
        /// <param name="tableName">数据表名</param>
        /// <param name="colNames">字段名</param>
        /// <param name="colTypes">字段名类型</param>
        public SQLiteDataReader CreateTable(string tableName, string[] colNames, string[] colTypes)
        {
            string queryString = "CREATE TABLE IF NOT EXISTS " + tableName + "( " + colNames[0] + " " + colTypes[0];
            for (int i = 1; i < colNames.Length; i++)
            {
                queryString += ", " + colNames[i] + " " + colTypes[i];
            }
            queryString += "  ) ";
            return ExecuteQuery(queryString);
        }

        /// <summary>
        /// Reads the table.
        /// </summary>
        /// <returns>The table.</returns>
        /// <param name="tableName">Table name.</param>
        /// <param name="items">Items.</param>
        /// <param name="colNames">Col names.</param>
        /// <param name="operations">Operations.</param>
        /// <param name="colValues">Col values.</param>
        public SQLiteDataReader ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues)
        {
            string queryString = "SELECT " + items[0];
            for (int i = 1; i < items.Length; i++)
            {
                queryString += ", " + items[i];
            }
            queryString += " FROM " + tableName + " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0];
            for (int i = 0; i < colNames.Length; i++)
            {
                queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " ";
            }
            return ExecuteQuery(queryString);
        }

        /// <summary>
        /// 本类log
        /// </summary>
        /// <param name="s"></param>
        static void Log(string s)
        {
            Console.WriteLine("class SqLiteHelper:::" + s);
        }
    }




}

2.Form窗体中调用sqLiteHelper类,实现数据的增删等功能

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;
using TestSqlite20180310.sq;
using System.Net;

namespace TestSqlite20180310
{
    public partial class Form1 : Form
    {
        private SqLiteHelper sql;

        private SqLiteHelper passWord;

        private DataSet ds;
        private SQLiteDataAdapter sda;
         private bool flag = false;
        public Form1()
        {
            InitializeComponent();
            CreatePassWard();
            ReadPassWardFromdb();
        }

        private void btnTest_Click(object sender, EventArgs e)
        {
            try
            {

                // sql = new SqLiteHelper("data source=mydb.db");
                sql = new SqLiteHelper("mydb.db");
                //创建名为table1的数据表
                sql.CreateTable("table1", new string[] { "ID", "Name", "Age", "Email" }, new string[] { "INTEGER", "TEXT", "INTEGER", "TEXT" });
                //插入两条数据
                sql.InsertValues("table1", new string[] { "1", "张三", "16", "Zhang@163.com" });
                sql.InsertValues("table1", new string[] { "2", "李四", "17", "Li4@163.com" });

                //更新数据,将Name="张三"的记录中的Name改为"小三"
                sql.UpdateValues("table1", new string[] { "Name" }, new string[] { "sunlei" }, "Name", "小三", "=");
                //删除Name="小三"且Age=16的记录,DeleteValuesOR方法类似

                sql.DeleteValuesAND("table1", new string[] { "Name", "Age" }, new string[] { "小三", "16" }, new string[] { "=", "=" });

                //读取整张表
                SQLiteDataReader reader = sql.ReadFullTable("table1");
                while (reader.Read())
                {
                    //读取ID
                    Log("" + reader.GetInt32(reader.GetOrdinal("ID")));
                    //读取Name
                    Log("" + reader.GetString(reader.GetOrdinal("Name")));
                    //读取Age
                    Log("" + reader.GetInt32(reader.GetOrdinal("Age")));
                    //读取Email
                    Log(reader.GetString(reader.GetOrdinal("Email")));
                }

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }

        }


        private void Log(string s)
        {
            Console.WriteLine("" + s);
        }

        private void CreatePassWard()
        {
            try
            {
                // passWord = new SqLiteHelper("data source=password.db");
                passWord = new SqLiteHelper("password.db");
                //创建名为table1的数据表
                passWord.CreateTable("password", new string[] { "ID", "PW" }, new string[] { "TEXT", "TEXT" });
                //插入两条数据
                passWord.InsertValues("password", new string[] { "小三", "123456" });               

           }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
            finally
            {
                passWord.CloseConnection();
            }
        }

        private void ReadPassWardFromdb()
        {
            try
            {
                //连接数据库
                //  passWord = new SqLiteHelper("data source=password.db");
                passWord = new SqLiteHelper("password.db");
                //读取整张表
                SQLiteDataReader reader = passWord.ReadFullTable("password");
                if (reader.Read())
                {
                    //读取ID与pw                    
                    richTextBox1.Text = reader.GetString(reader.GetOrdinal("ID"));
                    richTextBox3.Text = reader.GetString(reader.GetOrdinal("PW"));

                }
                passWord.CloseConnection();

            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
            finally
            {
                passWord.CloseConnection();
            }


        }

        private void button1_Click(object sender, EventArgs e)
        {
            string Id = "";
            string pw = "";
            //连接数据库
            //  passWord = new SqLiteHelper("data source=password.db");
            passWord = new SqLiteHelper("password.db");
            //读取整张表
            SQLiteDataReader reader = passWord.ReadFullTable("password");
           
            if (reader.Read())
            {
                //读取ID

                Id = reader.GetString(reader.GetOrdinal("ID"));
                pw = reader.GetString(reader.GetOrdinal("PW"));
                if (pw == richTextBox2.Text.Trim().ToString() && Id == richTextBox1.Text.Trim().ToString())
                {

                    MessageBox.Show("用户名与密码正确:" + reader.GetString(0));

                }
                else
                {
                    MessageBox.Show("用户名与密码错误:" + reader.GetString(0));
                }
            }
            passWord.CloseConnection();
        }

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {          
            
            if (!flag)
            {
                richTextBox3.Visible = true;
                label3.Visible = true;
                flag = true;
                return;
            }
            //连接数据库
            try
            {
                //passWord = new SqLiteHelper("data source=password.db");  
                passWord = new SqLiteHelper("password.db");  
                passWord.UpdateValues("password", new string[] { "PW" }, new string[] { richTextBox3.Text.Trim().ToString() }, "ID", richTextBox1.Text.Trim().ToString(), "=", "ID","小四");
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message);
            }
            finally
            {

                passWord.CloseConnection();
            }
          

        }





    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#访问SQLite数据库,实现数据的增删改查功能 的相关文章

  • C#结构体struct和类class的区别与使用场景

    目录 前言 一 结构体的使用 二 结构与类的区别 1 类和结构有以下几个基本的不同点 2 选择使用情况 总结 前言 在我们开发程序中 功能实现可能没有问题 问题是如何将代码变得更优雅 优化程序运行 本文主要区别结构体与类的区别以及什么情况下
  • C#8.0本质论第四章--操作符和控制流程

    C 8 0本质论第四章 操作符和控制流程 4 1操作符 有些操作符以符号的形式出现 例如 或者 等 而另一些操作符则为关键词 例如default和is 4 1 1一元正负操作符 一元正操作符 对值几乎没有影响 它在C 中是多余的 4 1 2
  • vector中reserve与resize区别

    vector中reserve与resize区别 一 基本概念 1 capacity 指容器在分配新的存储空间之前能存储的元素总数 2 size 指当前容器所存储的元素个数 二 reserve与resize 1 区别 1 reserve 只修
  • C++ vector容器-45-vector互换和节省空间和预留空间

    这篇来学习vector一个互换操作 也就是有两个vector对象 可以通过一个api 把两个对象互换过来 实际上 就是在内存中交换了对象的指针 原来的指针指向新的vector对象 这种交换有时候是很有必要 特别是匿名vector对象进行交换
  • 初识C++Primer plus

    写在前面 从事c 编程转眼也快一年了 一直从事工厂数据采集工作 然而就与硬件交互效率来说 无疑c c 与硬件更加契合 就很任性的买了一本c Primer plus 第六版 希望自己在博客里能坚持下去 将自己所悟所感写在这里与大家分享 分割线
  • C++利用zxing识别二维码

    C 利用zxing识别二维码 下载编译 配置使用 Win10 x64 VS2015 VS2019 下载编译 1 下载zxing包 并解压 下载地址 https github com glassechidna zxing cpp build文
  • C/C++服务器和客户端交互笔记

    C C 服务器开发 网络与通信Socket Socket通信三要素 通信的目的地址 使用的端口号 http 80 smtp 25 使用的传输协议 TCP UDP nslookup xx 可以查询xx网址的IP地址 Socket通信模型 te
  • C\C++各种变量存放区域(代码、数据、堆、栈)

    C C 各种变量存放区域 代码 数据 堆 栈 文章目录 C C 各种变量存放区域 代码 数据 堆 栈 变量 数据 变量 数据存放区域 练习 请说明下面的指针分别指向什么位置 BSS Block Started by Symbol 区 为什么
  • 「C++学习笔记」面向.Net Core的(C++)CLR类库非专业入门(+使用Opencv)

    关键词 C CLR Net Core Net Famework Opencv C 目录 什么是CLR类库 本文说明 创建Demo程序 调用dll 通过项目引用 通过dll文件引用 其他还没完全清楚的坑 有关C CLI这块的资料真的很少而且都
  • C++ 学习笔记(17)tuple类型、bitset类型、随机数(引擎和分布)、IO库(操纵符、未格式化输入输出、随机访问)

    C 学习笔记 17 tuple类型 bitset类型 随机数 引擎和分布 IO库 操纵符 未格式化输入输出 随机访问 参考书籍 C Primer 5th 17 1 tuple 类型 17 1 1 定义和初始化tuple tuple 的构造函
  • 03C++核心编程——黑马程序员

    C 核心编程 本阶段主要针对C 面向对象编程技术做详细讲解 探讨C 中的核心和精髓 1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 代码区 存放函数体的二进制代码 由操作系统进行管理的 全局区 存放全局变量和静态变量以及常量
  • C++绑定器和函数对象

    C 绑定器和函数对象 简介 C STL中的绑定器 bind1st operator 的第一个形参变量绑定一个确定的值 bind2nd operator 的第二个形参变量绑定一个确定的值 C Boost库 C 的Boost库中引入了bind绑
  • ubuntu-1804 配置 opevcv-4.0记录

    1 opencv安装包下载及解压 镜像地址 注意opencv contrib版本一致 下载zip压缩包 unzip opencv 4 0 0 zip unzip opencv contrib 4 0 0 解压后可以将版本号去掉 路径看起来好
  • 【C++】基本数据类型

    C 基本数据类型是程序中最基本的数据类型 它们是构建复杂数据类型的基础 C 中的基本数据类型包括整型 浮点型 字符型和布尔型等 目录 基本数据类型 整型 浮点型 字符型 转义字符 字符串 布尔类型 sizeof 基本数据类型 整型 作用 用
  • C++ stack容器-50-栈容器基本概念和常用接口

    接着学习下一个容器 stack 栈容器 当然后面还要学习一个队列容器 两个有点相似一般一起对比和学习 本篇主要学习栈容器的基本概念和常用接口的基本使用 1 什么是stack stack是一种先进后出 First In Last Out FI
  • 模板特化

    上一篇 模板与重载 里 我遇见了想同时使用模板函数与非模板函数的情况 后来才知道 其实并不需要 当我想对某些特定的类型进行特殊操作时 只需要使用模板特化就可以 所谓特化 就是说对于模板函数 对于某些类型可能需要特殊处理 所以进行特殊化 可以
  • c++模板(函数模板,类中函数模板,类模板)

    作用 减少程序中的冗余信息 如 多个函数或类的除了参数类型外 其余都完全相同时 可以使用模板来减少重复信息 参考函数重载时 输入参数数量也相同的情况 1 函数模板 即建立一个通用函数 只不过该函数的返回类型和形参类型都不具体指定 其定义格式
  • 【c++中的细节问题】C++何时需要自定义析构函数呢?

    请见 https blog csdn net love9099 article details 43086945
  • 【C++学习笔记】三、C++的数据类型、存储以及基本运算

    本文记录了C 中的数据类型以及基本运算 这部分是典型的每次记每次忘类型 所以烙印在此 以便用时随时查阅 主要参考 http www runoob com cplusplus cpp data types html 1 C 中的数据类型 1
  • 第七周7.2搜索 课堂学习记录 搜索例子+选择排序+二分搜索《程序设计入门——C语言》第七期 浙江大学 翁恺

    1 搜索例子 include

随机推荐

  • 系统架构设计方法-4-数据架构设计篇

    数据架构设计工作内容 数据分布 数据实体和应用的对应关系 个人感觉 这里面写数据流转不太妥 流传应该都是应用层面来完成的 应用和数据之间的读写关系的组合 工作内容 1 确定数据域 系统架构设计模板和示例 工作内容 2 确定数据主题 系统设计
  • GitHub官方App正式推出了,小伙伴们确定不下载一个吗?

    小伙伴们 大家好 今天给大家推荐的是GitHub软件 微软旗下的 Github 也正式发布了 GitHub 移动版 它是 iOS 和 Android上对 GitHub 网页桌面版的完全体验版 现在 我们可以随时随地在移动设备上与我们的团队保
  • 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)

    尚硅谷Java零基础全套视频教程 宋红康2023版 java入门自学必备 开发环境 jdk17 idea2022 第一阶段 Java基本语法 一 Java语言概述 01 Java新版视频教程简介 02 课程目录说明 03 Java基础全栈学
  • 报表开发组件FastReport Mono v2023.1 - 支持与My Reports Cloud集成

    FastReport Mono v2023 1现已推出 最新版中更新了与 My Reports Cloud 的部分集成 来自 JasperReports 的模板转换器等功能 同时修复了10余处问题 点击下方免费试用哦 FastReport
  • URI中的 “//” 有什么用

    前言 很多时候互联网很多东西都是很有意思的 比如 http 这个双斜杠 解释这个东西就需要翻墙去国外了 入口 在2009年10月 BBC中的一篇新闻讲述了 的用途 截图如下所示 文章翻译 互联网地址开头的大幅删减长期以来一直困扰着网民 现在
  • JavaScript奇淫技巧:反调试

    JavaScript奇淫技巧 反调试 本文 将分享几种JS代码反调试技巧 目标是 实现防止他人调试 动态分析自己的代码 检测调试 方法一 用console log检测 代码 var c new RegExp 1 c toString fun
  • OpenCV+python实现摄像头简单手势识别--进度条控制亮度

    文章目录 前言 一 整体框架 二 使用步骤 1 引入库 2 第一步 打开摄像头 3 第二步 设置回调函数 4 第三步 肤色检测 5 第四步 进行高斯滤波 6 第五步 边缘轮廓检测 7 第六步 求出手势的凹凸点 8 第七步 利用凹凸点个数判断
  • c++数组排序的五种方法

    方法一 冒泡排序 比较相邻的元素 如果第一个比第二个大 就交换他们两个 对每一对相邻元素做同样的工作 执行完毕后 找到第一个最大值 重复以上的步骤 每次比较次数 1 直到不需要比较 示例 对数组4 2 8 0 5 7 1 3 9 进行排序
  • 2023华为od机试 Java【矩阵的最大值和最小值】

    题目 现在给你一个N M矩阵 M表示有M个矩阵 你的目标是找出M个该矩阵中每列元素的最大值 然后输出这M个值中的最小值 示例1 输入 1 2 3 4 输出 3 代码 import java util Scanner public class
  • 人工智能必备数学基础-目录

    数学基础学习笔记 为了学习人工智能 需要先打好数学基础 这里是为学习人工智能而准备的数学基础 线性代数 1 1 矩阵及其运算 1 1 1 矩阵基本概念及意义 1 1 2 基本运算 1 1 3 矩阵的迹 1 1 4 矩阵的转置 1 1 5 对
  • linux中文件权限

    linux中一切都是文件 这个设计秒不可言阿 在linux系统中每一个文件都有 三组权限 所有者 所属组 其它用户 文件类型 符号 作用 普通文件 d 目录文件 l 链接文件 b 块设备文件 c 字符设备文件 p 管道文件 文件权限 ls
  • 设计模式-原型模式

    文章目录 前言 什么是原型模式 Java中的原型模式 使用场景 优缺点 结论 前言 在软件开发中 设计模式是一种重要的思想和方法 用于解决常见的编程问题 原型模式是其中之一 它允许我们通过复制现有对象来创建新对象 而无需依赖具体类的构造函数
  • Java System.out.println()的简单理解

    前言 想必很多人对System out println 只是简单的进行运用 并未深入了解其背后的原理 例如当问及当中的out是什么 很多人可能一时答不上来 又比如问道println 方法属于那个类 你可能不假思索的答System类 可结果真
  • PostgreSQL(一)Windows安装

    目录 一 下载 二 安装PostgreSQL 三 安装StackBuilder 四 打开PostgreSQL管理工具pgAdmin 五 打开命令行 一 下载 下载地址 https www enterprisedb com downloads
  • openstack热迁移机制分析(libvirt热迁移模型、nova热迁移控制逻辑、调试方法)

    前段时间在解决大内存热迁移失败的时候 查阅了下openstack热迁移相关知识 有了一些记录跟大家分享下 以基于L版openstack qemu kvm 跟大家分享下API库libvirt的热迁移机制和nova控制逻辑的一些记录 注 这篇博
  • Jquery获取select选中的文本与值

    Jquery获取select选中的文本与值 jquery获取select选择的文本与值 获取select 获取select 选中的 text ddlregtype find option selected text 获取select选中的
  • Python3 unittest学习

    Python3 unittest学习 unittest单元测试框架 基本结构 执行测试 普通方式执行 通过unittest模块执行 跳过测试与预期失败 使用子测试区分测试迭代 类与函数 class unittest TestCase met
  • Linux内核中进程的初始化

    分析start kernel时应该会注意到Linux内核0号进程的初始化 见init main c set task stack end magic init task 其中 init task为第一个进程 0号进程 的进程描述符结构体变量
  • com.aspose.diagram.afr: Unexcepted eof.

    背景 SpringBoot项目 使用aspose diagram操作Visio 并且使用了模具文件 并将其放在了resource下面 代码 读取resource下面的文件 这种方法在linux环境上面依然可以使用 Resource reso
  • C#访问SQLite数据库,实现数据的增删改查功能

    说明 本文的代码是基于Winform中举例的 经过实测可用 1 封装Sqlite操作类 sqLiteHelper using System using System Collections Generic using System Linq