现在可移动通信设备、物联网、可穿戴智能设备,智能手机盛行,其主流操作系统均采用Android或MacOS,为存储App程序的数据,系统允许App单独使用其私有的SQLite数据库。这篇入门文章不仅提供了SQLite数据库其潜在的微型内核和适合手机存储特性,并示例介绍了SQLite的基本使用特性功能和局限以及类似Hibernate功能的反射机制来进行关系型数据库的增删改查等基本功能特性。

与Oracle和Microsoft SQL Server等运行在数据库Server上的重量级Database,SQLite数据库仅仅包含在系统Disk上的一个DB File中。例如Anroid的App将其私有数据库SQLite存储在特定的文件目录中:/data/data/<application package name>/databases/<databasename.db>。SQLite数据库采用了标准的文件格式,可以在多种操作系统中跨平台使用,数据库的文件采用了统一的格式,使得建立好的数据库db文件可以在多种操作系统中运行。还可以使用系统调试监视服务DDMS的文件浏览器或SQLite官方网站提供的数据库管理小程序来进行查看和管理。

1. SQLite3 安装

SQLite 的一个重要的特性是零配置的,这意味着不需要复杂的安装或管理。

· 在 Windows 上安装 SQLite

 从 Windows 区下载预编译的二进制文件。

 您需要下载 sqlite-tools-win32-*.zip 和 sqlite-dll-win32-*.zip 压缩文件。

 创建文件夹 C:\sqlite,并在此文件夹下解压上面两个压缩文件,将得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件。

 添加 C:\sqlite 到 PATH 环境变量,最后在命令提示符下,使用 sqlite3 命令,将显示如下结果。

C:\>sqlite3

SQLite version 3.7.15.2 2013-01-09 11:53:05

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite>

· 在 Linux 上安装 SQLite

目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite。

$ sqlite3

SQLite version 3.7.15.2 2013-01-09 11:53:05Enter ".help" for instructionsEnter SQL statements terminated with a ";"

sqlite>

如果没有看到上面的结果,那么就意味着没有在 Linux 机器上安装 SQLite。因此,让我们按照下面的步骤安装 SQLite:

 请访问 SQLite 下载页面,从源代码区下载 sqlite-autoconf-*.tar.gz。

 步骤如下:

$ tar xvzf sqlite-autoconf-3071502.tar.gz

$ cd sqlite-autoconf-3071502$ ./configure --prefix=/usr/local$ make

$ make install

上述步骤将在 Linux 机器上安装 SQLite,您可以按照上述讲解的进行验证。

· 在 Mac OS X 上安装 SQLite

最新版本的 Mac OS X 会预安装 SQLite,但是如果没有可用的安装,只需按照如下步骤进行:

 请访问 SQLite 下载页面,从源代码区下载 sqlite-autoconf-*.tar.gz。

 步骤如下:

$ tar xvzf sqlite-autoconf-3071502.tar.gz

$ cd sqlite-autoconf-3071502$ ./configure --prefix=/usr/local$ make

$ make install

上述步骤将在 Mac OS X 机器上安装 SQLite,您可以使用下列命令进行验证:

$ sqlite3

SQLite version 3.7.15.2 2013-01-09 11:53:05Enter ".help" for instructionsEnter SQL statements terminated with a ";"

sqlite>

2. 命令行探秘SQLite3

由于SQLite3数据库内核微小,使用官方的管理软件即SQLite3.exe即可对数据库进行各种操作,有条件的读者想简约的可视化操作,可下载SQLiteStudio软件对数据库进行可视化操作。

· 进入SQLite3.exe命令行

R:\Users\wang\workspace\sqltest>sqlite3

SQLite version 3.38.1 2022-03-12 13:37:29

Enter ".help" for usage hints.

Connected to a transient in-memory database.

Use ".open FILENAME" to re

open on a persistent database.

· 列出可用数据库文件

sqlite> .show

echo: off

eqp: off

explain: auto

headers: off

mode: list

nullvalue: ""

output: stdout

colseparator: "|"

rowseparator: "\n"

stats: off

width:

filename: test.db;

· 列表显示可用数据库

sqlite> .databases

main: R:\Users\wang\workspace\sqltest\test.db r/w

· 列表显示可用数据库表

sqlite> .tables

dustcart rubbish

· 列表显示表索引

sqlite> .indices dustcart

sqlite_autoindex_dustcart_1

· 列表显示表的数据库模式schema

sqlite> .schema dustcart

CREATE TABLE dustcart (ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,NUMBER TEX

T ,ADDRESS TEXT ,WEIGHT REAL ,REMARK TEXT );

sqlite> .schema

CREATE TABLE rubbish (ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,NUMBER TEXT

,ADDRESS TEXT ,WEIGHT REAL ,REMARK TEXT );

CREATE TABLE dustcart (ID INT PRIMARY KEY NOT NULL,NAME TEXT NOT NULL,NUMBER TEX

T ,ADDRESS TEXT ,WEIGHT REAL ,REMARK TEXT );

sqlite>

· 如果此处说的不详细或者未解决读者遇到的问题,可以使用help命令具体查看各种命令的使用方式

sqlite> .help

.archive ... Manage SQL archives

.auth ON|OFF Show authorizer callbacks

.backup ?DB? FILE Backup DB (default "main") to FILE

.bail on|off Stop after hitting an error. Default OFF

.binary on|off Turn binary output on or off. Default OFF

.cd DIRECTORY Change the working directory to DIRECTORY

.changes on|off Show number of rows changed by SQL

.check GLOB Fail if output since .testcase does not match

.clone NEWDB Clone data into NEWDB from the existing database

.connection [close] [#] Open or close an auxiliary database connection

.databases List names and files of attached databases

.dbconfig ?op? ?val? List or change sqlite3_db_config() options

.dbinfo ?DB? Show status information about the database

.dump ?OBJECTS? Render database content as SQL

.echo on|off Turn command echo on or off

.eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN

.excel Display the output of next command in spreadsheet

.exit ?CODE? Exit this program with return-code CODE

.expert EXPERIMENTAL. Suggest indexes for queries

.explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto

.filectrl CMD ... Run various sqlite3_file_control() operations

.fullschema ?--indent? Show schema and the content of sqlite_stat tables

.headers on|off Turn display of headers on or off

.help ?-all? ?PATTERN? Show help text for PATTERN

.import FILE TABLE Import data from FILE into TABLE

.imposter INDEX TABLE Create imposter table TABLE on index INDEX

.indexes ?TABLE? Show names of indexes

.limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT

.lint OPTIONS Report potential schema issues.

.load FILE ?ENTRY? Load an extension library

.log FILE|off Turn logging on or off. FILE can be stderr/stdout

.mode MODE ?OPTIONS? Set output mode

.nonce STRING Suspend safe mode for one command if nonce matches

.nullvalue STRING Use STRING in place of NULL values

.once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE

.open ?OPTIONS? ?FILE? Close existing database and reopen FILE

.output ?FILE? Send output to FILE or stdout if FILE is omitted

.parameter CMD ... Manage SQL parameter bindings

.print STRING... Print literal STRING

.progress N Invoke progress handler after every N opcodes

.prompt MAIN CONTINUE Replace the standard prompts

.quit Exit this program

.read FILE Read input from FILE or command output

.recover Recover as much data as possible from corrupt db.

.restore ?DB? FILE Restore content of DB (default "main") from FILE

.save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...)

.scanstats on|off Turn sqlite3_stmt_scanstatus() metrics on or off

.schema ?PATTERN? Show the CREATE statements matching PATTERN

.selftest ?OPTIONS? Run tests defined in the SELFTEST table

.separator COL ?ROW? Change the column and row separators

.session ?NAME? CMD ... Create or control sessions

.sha3sum ... Compute a SHA3 hash of database content

.shell CMD ARGS... Run CMD ARGS... in a system shell

.show Show the current values for various settings

.stats ?ARG? Show stats or turn stats on or off

.system CMD ARGS... Run CMD ARGS... in a system shell

.tables ?TABLE? List names of tables matching LIKE pattern TABLE

.testcase NAME Begin redirecting output to 'testcase-out.txt'

.testctrl CMD ... Run various sqlite3_test_control() operations

.timeout MS Try opening locked tables for MS milliseconds

.timer on|off Turn SQL timer on or off

.trace ?OPTIONS? Output each SQL statement as it is run

.vfsinfo ?AUX? Information about the top-level VFS

.vfslist List all available VFSes

.vfsname ?AUX? Print the name of the VFS stack

.width NUM1 NUM2 ... Set minimum column widths for columnar output

sqlite>

3. 列举SQLite的局限性

 SQLite并不能代替高性能、多并发的、以及服务器驱动的重量级数据库。

 由于它基于文件方式存储,所以只能串行地访问,而不能以并发方式进行访问。但同时也具有某些并发特性。

 对SQLite访问是由文件权限控制的,而非数据库用户权限控制。

 不能进行引用完整性维护,例如,Foreign Key约束能够被解析但并不能自动强制执行。

 不能删除或修改列,对Alter Table的支持有局限性。

 不能使用For Each Statement 或 Instead of,而且不能使用递归触发器,对Trigger的支持有局限性。

 不能嵌套Transaction操作。

 View是只读操作,不可修改。

 不能使用 Right outer join 和 Full outer join 特性。

 SQLite不支持Stored或审核auditing特性。

 对SQL语言内建Function的支持有一定的局限性。

 对数据库和表以及行的尺寸大小进行了一定的限制。

4. SQLite的Java程序样例

此样例使用eclipse中的框架:采用MVC三层架构,在Model层采用Javabean模式,并采用Hibernate技术的反射原理,将数据模型一一对立建好,既能查询数据,又能得到数据的具体存储信息。这个样例采用物联网中某一个垃圾车的智能垃圾分类系统中设备数据采集和分析及上报功能,其数据存储采用SQLite数据库由于文档篇幅有限,此处只给出SQLite数据库的Java自动创建数据库和两张表的自动建立过程,至于数据表的增删改查四种操作下一篇进行详细介绍。

/*** 智能垃圾车表数据对象*/
package com.sqltest.sqliteJdbc;/*** @author wacky wang* @datetime 22/3/18 12:30*/
public class Dustcart extends TableObject {private int id;private String idFieldName;private String idFieldType;private boolean idFieldPK;private boolean idFieldNotNull;private String name;private String nameFieldName;private String nameFieldType;private boolean nameFieldPK;private boolean nameFieldNotNull;private String number;private String numberFieldName;private String numberFieldType;private boolean numberFieldPK;private boolean numberFieldNotNull;private String address;private String addressFieldName;private String addressFieldType;private boolean addressFieldPK;private boolean addressFieldNotNull;private float weight;private String weightFieldName;private String weightFieldType;private boolean weightFieldPK;private boolean weightFieldNotNull;private float remark;private String remarkFieldName;private String remarkFieldType;private boolean remarkFieldPK;private boolean remarkFieldNotNull;/*** @return the id*/public int getId() {return id;}/*** @param id the id to set*/public void setId(int id) {this.id = id;}/*** @return the idFieldName*/public String getIdFieldName() {return idFieldName;}/*** @param idFieldName the idFieldName to set*/public void setIdFieldName(String idFieldName) {this.idFieldName = idFieldName;}/*** @return the idFieldType*/public String getIdFieldType() {return idFieldType;}/*** @param idFieldType the idFieldType to set*/public void setIdFieldType(String idFieldType) {this.idFieldType = idFieldType;}/*** @return the idFieldPK*/public boolean isIdFieldPK() {return idFieldPK;}/*** @param idFieldPK the idFieldPK to set*/public void setIdFieldPK(boolean idFieldPK) {this.idFieldPK = idFieldPK;}/*** @return the idFieldNotNull*/public boolean isIdFieldNotNull() {return idFieldNotNull;}/*** @param idFieldNotNull the idFieldNotNull to set*/public void setIdFieldNotNull(boolean idFieldNotNull) {this.idFieldNotNull = idFieldNotNull;}/*** @return the name*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}/*** @return the nameFieldName*/public String getNameFieldName() {return nameFieldName;}/*** @param nameFieldName the nameFieldName to set*/public void setNameFieldName(String nameFieldName) {this.nameFieldName = nameFieldName;}/*** @return the nameFieldType*/public String getNameFieldType() {return nameFieldType;}/*** @param nameFieldType the nameFieldType to set*/public void setNameFieldType(String nameFieldType) {this.nameFieldType = nameFieldType;}/*** @return the nameFieldPK*/public boolean isNameFieldPK() {return nameFieldPK;}/*** @param nameFieldPK the nameFieldPK to set*/public void setNameFieldPK(boolean nameFieldPK) {this.nameFieldPK = nameFieldPK;}/*** @return the nameFieldNotNull*/public boolean isNameFieldNotNull() {return nameFieldNotNull;}/*** @param nameFieldNotNull the nameFieldNotNull to set*/public void setNameFieldNotNull(boolean nameFieldNotNull) {this.nameFieldNotNull = nameFieldNotNull;}/*** @return the number*/public String getNumber() {return number;}/*** @param number the number to set*/public void setNumber(String number) {this.number = number;}/*** @return the numberFieldName*/public String getNumberFieldName() {return numberFieldName;}/*** @param numberFieldName the numberFieldName to set*/public void setNumberFieldName(String numberFieldName) {this.numberFieldName = numberFieldName;}/*** @return the numberFieldType*/public String getNumberFieldType() {return numberFieldType;}/*** @param numberFieldType the numberFieldType to set*/public void setNumberFieldType(String numberFieldType) {this.numberFieldType = numberFieldType;}/*** @return the numberFieldPK*/public boolean isNumberFieldPK() {return numberFieldPK;}/*** @param numberFieldPK the numberFieldPK to set*/public void setNumberFieldPK(boolean numberFieldPK) {this.numberFieldPK = numberFieldPK;}/*** @return the numberFieldNotNull*/public boolean isNumberFieldNotNull() {return numberFieldNotNull;}/*** @param numberFieldNotNull the numberFieldNotNull to set*/public void setNumberFieldNotNull(boolean numberFieldNotNull) {this.numberFieldNotNull = numberFieldNotNull;}/*** @return the address*/public String getAddress() {return address;}/*** @param address the address to set*/public void setAddress(String address) {this.address = address;}/*** @return the addressFieldName*/public String getAddressFieldName() {return addressFieldName;}/*** @param addressFieldName the addressFieldName to set*/public void setAddressFieldName(String addressFieldName) {this.addressFieldName = addressFieldName;}/*** @return the addressFieldType*/public String getAddressFieldType() {return addressFieldType;}/*** @param addressFieldType the addressFieldType to set*/public void setAddressFieldType(String addressFieldType) {this.addressFieldType = addressFieldType;}/*** @return the addressFieldPK*/public boolean isAddressFieldPK() {return addressFieldPK;}/*** @param addressFieldPK the addressFieldPK to set*/public void setAddressFieldPK(boolean addressFieldPK) {this.addressFieldPK = addressFieldPK;}/*** @return the addressFieldNotNull*/public boolean isAddressFieldNotNull() {return addressFieldNotNull;}/*** @param addressFieldNotNull the addressFieldNotNull to set*/public void setAddressFieldNotNull(boolean addressFieldNotNull) {this.addressFieldNotNull = addressFieldNotNull;}/*** @return the weight*/public float getWeight() {return weight;}/*** @param weight the weight to set*/public void setWeight(float weight) {this.weight = weight;}/*** @return the weightFieldName*/public String getWeightFieldName() {return weightFieldName;}/*** @param weightFieldName the weightFieldName to set*/public void setWeightFieldName(String weightFieldName) {this.weightFieldName = weightFieldName;}/*** @return the weightFieldType*/public String getWeightFieldType() {return weightFieldType;}/*** @param weightFieldType the weightFieldType to set*/public void setWeightFieldType(String weightFieldType) {this.weightFieldType = weightFieldType;}/*** @return the weightFieldPK*/public boolean isWeightFieldPK() {return weightFieldPK;}/*** @param weightFieldPK the weightFieldPK to set*/public void setWeightFieldPK(boolean weightFieldPK) {this.weightFieldPK = weightFieldPK;}/*** @return the weightFieldNotNull*/public boolean isWeightFieldNotNull() {return weightFieldNotNull;}/*** @param weightFieldNotNull the weightFieldNotNull to set*/public void setWeightFieldNotNull(boolean weightFieldNotNull) {this.weightFieldNotNull = weightFieldNotNull;}/*** @return the remark*/public float getRemark() {return remark;}/*** @param remark the remark to set*/public void setRemark(float remark) {this.remark = remark;}/*** @return the remarkFieldName*/public String getRemarkFieldName() {return remarkFieldName;}/*** @param remarkFieldName the remarkFieldName to set*/public void setRemarkFieldName(String remarkFieldName) {this.remarkFieldName = remarkFieldName;}/*** @return the remarkFieldType*/public String getRemarkFieldType() {return remarkFieldType;}/*** @param remarkFieldType the remarkFieldType to set*/public void setRemarkFieldType(String remarkFieldType) {this.remarkFieldType = remarkFieldType;}/*** @return the remarkFieldPK*/public boolean isRemarkFieldPK() {return remarkFieldPK;}/*** @param remarkFieldPK the remarkFieldPK to set*/public void setRemarkFieldPK(boolean remarkFieldPK) {this.remarkFieldPK = remarkFieldPK;}/*** @return the remarkFieldNotNull*/public boolean isRemarkFieldNotNull() {return remarkFieldNotNull;}/*** @param remarkFieldNotNull the remarkFieldNotNull to set*/public void setRemarkFieldNotNull(boolean remarkFieldNotNull) {this.remarkFieldNotNull = remarkFieldNotNull;}public void createTableObj(Dustcart dustcart) {if(dustcart == null) return;dustcart.setIdFieldName("ID");dustcart.setIdFieldType("INT");dustcart.setIdFieldPK(true);dustcart.setIdFieldNotNull(true);dustcart.setNameFieldName("NAME");dustcart.setNameFieldType("TEXT");dustcart.setNameFieldPK(false);dustcart.setNameFieldNotNull(true);dustcart.setNumberFieldName("NUMBER");dustcart.setNumberFieldType("TEXT");dustcart.setNumberFieldPK(false);dustcart.setNumberFieldNotNull(false);dustcart.setAddressFieldName("ADDRESS");dustcart.setAddressFieldType("TEXT");dustcart.setAddressFieldPK(false);dustcart.setAddressFieldNotNull(false);dustcart.setWeightFieldName("WEIGHT");dustcart.setWeightFieldType("REAL");dustcart.setWeightFieldPK(false);dustcart.setWeightFieldNotNull(false);dustcart.setRemarkFieldName("REMARK");dustcart.setRemarkFieldType("TEXT");dustcart.setRemarkFieldPK(false);dustcart.setRemarkFieldNotNull(false);}/* (non-Javadoc)* @see com.sqltest.sqliteJdbc.TableObject#getStrCreateTable()*/@Overridepublic String getStrCreateTable() {//dustcart dustcart = new dustcart();Dustcart dustcart = this;dustcart.setTableName("dustcart");createTableObj(dustcart);StringBuilder sb = new StringBuilder();String str = "CREATE TABLE " + dustcart.getTableName() + " (";sb.append(str);str = dustcart.getIdFieldName() + " " + dustcart.getIdFieldType() + " ";sb.append(str);if(dustcart.isIdFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isIdFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(",");str = dustcart.getNameFieldName() + " " + dustcart.getNameFieldType() + " ";sb.append(str);if(dustcart.isNameFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isNameFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(",");str = dustcart.getNumberFieldName() + " " + dustcart.getNumberFieldType() + " ";sb.append(str);if(dustcart.isNumberFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isNumberFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(",");str = dustcart.getAddressFieldName() + " " + dustcart.getAddressFieldType() + " ";sb.append(str);if(dustcart.isAddressFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isAddressFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(",");str = dustcart.getWeightFieldName() + " " + dustcart.getWeightFieldType() + " ";sb.append(str);if(dustcart.isWeightFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isWeightFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(",");str = dustcart.getRemarkFieldName() + " " + dustcart.getRemarkFieldType() + " ";sb.append(str);if(dustcart.isRemarkFieldPK())sb.append(DefSqliteFieldsAttr.pkIsTrue).append(" ");if(dustcart.isRemarkFieldNotNull())sb.append(DefSqliteFieldsAttr.nullIsTrue);sb.append(")");return sb.toString();}/* (non-Javadoc)* @see com.sqltest.sqliteJdbc.TableObject#setStrCreateTable(java.lang.String)*/@Overridepublic void setStrCreateTable(String strCreateTable) {// TODO Auto-generated method stub}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub}}/*** 创建数据库表信息*/
package com.sqltest.sqliteJdbc;/*** @author wacky wang* @datetime 22/3/18 12:30*/
import java.sql.*;public class CreateTables {public static Integer createTable(TableObject tabObj) {if(tabObj == null) {System.out.println("Table rubbish created failure");return new Integer(0);}Connection c = null;Statement stmt = null;try {Class.forName("org.sqlite.JDBC");//创建数据库qlite连接c = DriverManager.getConnection("jdbc:sqlite:test.db");System.out.println("Opened database successfully");stmt = c.createStatement();//执行数据表的创建stmt.executeUpdate(tabObj.getStrCreateTable());//关闭数据库连接stmt.close();c.close();} catch (Exception e) {System.err.println(e.getClass().getName() + ": " + e.getMessage());System.exit(0);}System.out.println("Table rubbish created successfully");return new Integer(1);}/*** @param args*/public static void main(String args[]) {//垃圾表信息的创建Rubbish rubbish = new Rubbish();createTable(rubbish);//垃圾车的表信息创建Dustcart dustcart = new Dustcart();createTable(dustcart);}}​

5. 小结

通过阅读本篇SQLite技术文档,读者已经初步了解SQLite数据库的基本特性和功能,并能够安装和使用SQLite数据库,并针对例子程序,读者可以使用反射机制模式来进行数据库表的创建过程。在下篇文档中,作者将详细介绍使用SQLite数据库的反射机制模式进行增删改查数据库表及视图等具体操作的开发过程。

快速入门Sqlite数据库应用相关推荐

  1. .net mvc html访问数据库,【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6) - 三生石上...

    图挂了的说明: 我是在Word中写的本系列文章,然后转成的HTML,所以图片都存在于 fineui.com 服务器,由于临时访问量太多,服务器喘不过气了.... 你可以稍后访问,实在是抱歉...... ...

  2. apache2.4.9 开启path_info访问_【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)...

    新建项目 打开VS2015,找到菜单项[文件->新建->项目],打开向导对话框: 注意我们的选择项: 运行平台:.NET FrameWork 4.5 项目模板:ASP.NET Web Ap ...

  3. mvc5 ef mysql_ASP.NET MVC快速入门之数据库操作(MVC5+EF6)[第一篇][上] | Rickytsang洛水寒...

    新建项目 打开VS2015,找到菜单项[文件->新建->项目],打开向导对话框: 注意我们的选择项: 运行平台:.NET FrameWork 4.5 项目模板:ASP.NET Web Ap ...

  4. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  5. python能做数据库开发吗_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...

    1. 它是内置的,不需要安装,节省很多麻烦.2. 使用方便,不需要复杂的连接配置,打开本地文件一样简单.3.方便转移.数据库是一个文件.复制.传输和删除可以很容易地处理.4所示.轻量级的性能比大多数其 ...

  6. python建立sqlite数据库_5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学...

    1.它内置,无需安装,省了很多麻烦. 2.使用方便,无需复杂的连接配置,和打开本地文件一样简单. 3.转移方便,数据库就是一个文件,复制.转移.删除都能简单处理 4.轻量级应用中性能优于多数其它的数据 ...

  7. 易百教程Oracle,SQLite快速入门教程

    这个SQLite快速入门教程教你如何有效地开始学习并使用SQLite.通过本教程的实践操作学习之后,相信你应该可以了解并能够熟练地使用SQLite了. 如果您一直在使用其他关系数据库管理系统,例如:M ...

  8. Spread for Windows Forms快速入门(10)---绑定到数据库

    下面的教程将带你创建一个工程, 并将Spread控件绑定到一个数据库. 在这个教程中,主要的步骤为: 1. 将Spread添加到一个数据绑定工程中 2. 设置数据库连接 3. 指定要使用的数据 4. ...

  9. [JavaWeb-JDBC]JDBC_快速入门_idea jdbc连接Mysql数据库

    快速入门: * 步骤:1. 导入驱动jar包 mysql-connector-java-8.0.17.jar1.复制mysql-connector-java-8.0.17.jar到项目的libs目录下 ...

最新文章

  1. 浙江大学软件学院2020年保研上机模拟练习 7-4 Shopping With Coupons
  2. 移动apn接入点哪个快_移动4g网速最快接入点_2020移动最佳APN接入点
  3. 个人博客代码_这四个博客模板美观大气,做个漂亮的个人博客必须得收藏
  4. 分组中查询不符合条件的组
  5. mysql markdown_mysql+数据库学习笔记(markdown)
  6. java mvc页面传值方式_详解SpringMVC的ModelAndView传值方法
  7. C++对象在内存中的布局
  8. Lambda表达式公共拼接函数(原创)
  9. 挑选了适合测试边界的汉字及截图
  10. 使用socks5将游戏的服务器连接通过本地SS服务器代理连接到加速服务器,实现游戏加速。
  11. 诺顿误杀事件造成“疑似病毒大爆发”恐慌
  12. WinRAR_5.40 绿色!!!无广告
  13. 【电子技术】【2019.03】【含源码】低成本转子动力学数据采集系统的设计
  14. 第十一章:项目风险管理 - (11.5 规划风险应对)
  15. 如何将多个Excel 表合并成一个
  16. 微信小程序实现二维码签到考勤
  17. super关键字详解
  18. 关于网站被挂马的症状以及处理解决方法
  19. python的基本数据类型关键字_Python3 基本数据类型
  20. NPM => npm登录-发包-删包-整体流程

热门文章

  1. 乐得瑞推出多款USB Type-C接口方案,显示器和电视机专用
  2. 机器学习之监督学习:分类
  3. win11 删除系统自带输入法
  4. 163邮箱如何登录,在哪可以登录邮箱?
  5. opencv 图像修复 inpaint()
  6. Striped64 与 LongAdder
  7. 如何在微图中提取生成等高线
  8. 数据结构——图的创建以及遍历
  9. 数据库中查出的树形,获取其所有子孙(递归方式)
  10. 关于iOS中UITableView下拉距离短刷新没事,下拉距离长就会崩溃的问题解决方案