sqlite数据库 c语言

合集下载

C++操作SQLITE获得查询结果集的几种方法总结

C++操作SQLITE获得查询结果集的几种方法总结

C++操作SQLITE获得查询结果集的⼏种⽅法总结原⽂链接:使⽤sqlite的时候对查询结果的获得⼀直感觉⽐较混乱,⼀通google后收益匪浅,在此做个笔记。

⽅式⼀:利⽤回调函数callback回调函数格式:int callback(void para , int nCount, char** pValue, char** pName) {/*****************************************************************************sqlite 每查到⼀条记录,就调⽤⼀次这个回调para是你在 sqlite3_exec ⾥传⼊的 void * 参数, 通过para参数,你可以传⼊⼀些特殊的指针(⽐如类指 针、结构指针),然后在这⾥⾯强制转换成对应的类型(这⾥⾯是void类型,必须强制转换成你的类型才可⽤)。

然后操作这些数据nCount是这⼀条(⾏)记录有多少个字段 (即这条记录有多少列)char ** pValue 是个关键值,查出来的数据都保存在这⾥,它实际上是个1维数组(不要以为是2维数组),每⼀个元素都是⼀个 char*值,是⼀个字段内容(⽤字符串来表⽰,以/0结尾)char ** pName 跟pValue是对应的,表⽰这个字段的字段名称, 也是个1维数组****************************************************************************/string s;for(int i=0;i<nCount;i++){s+=pName[i];s+=":";s+=pValue[i];s+="\n";}cout<<s<<endl;return 0;}执⾏sql语句:int sqlite3_exec(sqlite3, const char *sql,sqlite3_callback, void ,char errmsg);第1个参数不再说了,是前⾯open函数得到的指针。

sqlite3的c语言编程

sqlite3的c语言编程

sqlite3的c语言编程
1、SQLite3介绍
SQLite3是一款非常小巧的数据库,它具备所有标准的SQL功能,是一款非常流行的关系型数据库,它以“文件”的形式来储存数据,拥有超小的体积(微型软件)、易于移植性、安装简单、低要求硬件以及低维护成本等特点,是目前移动设备应用中最流行的数据库。

2、SQLite3 C语言编程
(1)安装SQLite3
SQLite3可以通过源码或者二进制文件进行安装,通过源码安装需要先安装make编译器,在运行make命令之前,还需要先安装zlib、openssl、pcre等依赖库。

(2)创建数据库
在SQLite3中,不需要创建数据库,只需要指定数据库文件,即可将数据库文件初始化。

- 1 -。

C C++中使用SQLite_3 数据库

C C++中使用SQLite_3 数据库

在C/C++中使用SQLite廖卫东C/C++接口SQLite3.0依据以下需求而创建:支持UTF-16。

用户可定义的文本排序。

以索引列的形式存储BLOB。

SQLite3.0的API包括了83个独立的函数。

简单的程序可以通过三个函数工作:sqlite3_open()、sqlite3_exec()和sqlite3_close()。

更多的数据库引擎运行控制可以用sqlite3_prepare()来编译一个SQLite语句成字节代码并通过sqlite3_step()来执行它。

一个用sqlite3_column_开头的命令序列可以用来提取关于查询结果的信息。

许多接口函数是以UTF-8和UTF-16的形式成对出现的。

并且有一个用于实现用户定义SQL函数和用户定义的text比较。

打开与关闭一个数据库typedef struct sqlite3 sqlite3;int sqlite3_open(const char*, sqlite3**);int sqlite3_open16(const void*, sqlite3**);int sqlite3_close(sqlite3*);sqlite3_open()程序返回一个整型错误代码,而不是像sqlite2做的那样返回一个指向sqlite3结构。

sqlite3_open()与sqlite3_open16()间的区别是sqlite3_open16()采用UTF-16(以本地字节顺序)作为数据库文件名。

如果一个新数据库文件需要被创建,那么sqlite3_open16()设置本地的文本表达式为UTF-16而sqlite3_open()设置文本表达式为UTF-8。

const char *sqlite3_errmsg(sqlite3*);const void *sqlite3_errmsg16(sqlite3*);int sqlite3_errcode(sqlite3*);sqlite3_errcode()指令返回一个最近的主API调用的结果代码。

sqlite c++ 基本读写

sqlite c++ 基本读写

SQLite是一个轻量级的嵌入式数据库,它可以简单地集成到C++应用程序中,并提供了方便的读写操作。

本文将介绍在C++中使用SQLite 进行基本的读写操作的方法,包括数据库的创建、打开、关闭以及插入、查询、更新和删除数据等操作。

一、引入SQLite库在使用SQLite进行读写操作之前,首先需要引入SQLite的库文件。

SQLite的冠方全球信息站(xxx)可以下载到最新版本的SQLite源码及预编译的二进制文件。

在C++项目中引入SQLite的库文件,通常需要在项目配置中设置信息选项,将SQLite的库文件信息到项目中。

二、数据库的创建与打开1. 创建数据库文件在进行读写操作之前,需要先创建一个SQLite数据库文件。

可以使用SQLite提供的命令行工具sqlite3,或者在C++程序中使用SQLite的API来创建数据库文件。

以下是通过SQLite的API在C++中创建数据库文件的示例代码:```#include <sqlite3.h>int m本人n() {sqlite3* db;int rc = sqlite3_open("test.db", db);if (rc) {// 打开失败} else {// 打开成功}sqlite3_close(db);return 0;}```在上面的示例代码中,sqlite3_open函数用于打开或创建一个数据库文件,如果数据库文件不存在,则会创建一个新的数据库文件;如果数据库文件已经存在,则会打开该数据库文件。

sqlite3_open函数的第一个参数是数据库文件的路径,第二个参数是指向sqlite3*类型的指针,用于存储打开的数据库对象。

2. 关闭数据库文件在使用完数据库之后,需要及时关闭数据库文件,释放相关的资源。

可以使用sqlite3_close函数来关闭数据库文件,以下是示例代码:```sqlite3_close(db);```在示例代码中,db是指向已打开的数据库对象的指针,sqlite3_close 函数用于关闭该数据库对象,并释放相关资源。

SQLite之C#版System.Data.SQLite使用

SQLite之C#版System.Data.SQLite使用

SQLite之C#版System.Data.SQLite使⽤简介SQLite简介SQLite,是⼀款轻型的关系型数据库。

它的设计⽬标是嵌⼊式。

它能够⽀持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如 C++、C#、Object-C、PHP、Java等。

我是做⼿游开发的,在⼿机上使⽤SQLite 存储数据是很⽅便的。

System.Data.SqLite实践前期准备1. System.Data.SQLite 库下载,⽤于C#操作SQLite的dll⽂件。

下载地址:2. SQLite可视化⼯具下载,⽤于查看SQLite库数据表数据。

下载地址:Tips:1.根据⾃⼰的电脑是64bit或者32bit 以及使⽤的.NET Freamwork版本下载相应的的System.Data.SQLite。

下载解压⽂件如:安装在指定⽬录后⽣成多个dll⽂件:本⽂测试⽤的只有 System.Data.SQLite.dll 。

对于SQLite库数据的增删改查已经⾜够⽤了。

2.SQLite数据库⽂件以.db为后缀。

安装SQLite可视化⼯具后如图:mydb是我测试⽤的数据库。

实践对SQLite的增、删、改、查。

测试环境:VS2015 语⾔:C#创建控制台新⼯程,引⼊System.Data.SQLite.dll ⽂件。

1.编写SQLite 操作类,对SQLite数据操作进⾏封装为 SqLiteHelper,代码如下:///<summary>/// SQLite 操作类///</summary>class SqLiteHelper{///<summary>///数据库连接定义///</summary>private SQLiteConnection dbConnection;///<summary>/// SQL命令定义///</summary>private SQLiteCommand dbCommand;///<summary>///数据读取定义///</summary>private SQLiteDataReader dataReader;///<summary>///构造函数///</summary>///<param name="connectionString">连接SQLite库字符串</param>public SqLiteHelper(string connectionString){{dbConnection = new SQLiteConnection(connectionString);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();mandText = queryString;dataReader = dbCommand.ExecuteReader();}catch(Exception e){Log(e.Message);}return dataReader;}///<summary>///关闭数据库连接///</summary>public void CloseConnection(){//销毁Commendif(dbCommand !=null){dbCommand.Cancel();}dbCommand = null;//销毁Readerif(dataReader != null){dataReader.Close();}dataReader = null;//销毁Connectionif(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="="){//当字段名称和字段数值不对应时引发异常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>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);}}Tips:1.别忘了引⼊:using System.Data.SQLite;2.引⼊System.Data.SQLite.dll的同时,需要将 System.Data.SQLite.dll.config ⽂件放在同级⽬录下。

SQLite数据库利用详解程序

SQLite数据库利用详解程序

1.SQLite数据库的优势:1.1 轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,利用SQLite一样只需要带上它的一个动态库。

以版本为例,Windows下487KB、Linux下347KB。

1.2 绿色软件它的核心引擎本身不依托第三方的软件1.3 单一文件确实是数据库中所有的信息(比如表、视图、触发器、等)都包括在一个文件内。

那个文件能够copy到其它目录或其它机械上,也照用不误。

CSV也是单一文件格式。

它本身确实是用来表示二维的数据信息的。

一个CSV文件能够明白得为数据库的一张表。

CSV的缺点要紧在于:不便于存储非文本的数据信息(比如BLOB类型的信息);若是需要同时存储多张表的信息,就需要对应有多个CSV文件(文件一多,就嫌麻烦)。

1.4 跨平台/可移植性除主流操作系统,SQLite还支持了很多其他的操作系统。

如对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。

Access数据库最要紧的缺点确实是不能跨平台。

另外还有几个小缺点:文件大小有限制(2GB)、不支持内存数据库。

1.5 内存数据库(in-memory database)现在内存愈来愈廉价,很多一般PC都开始以GB为单位来衡量内存(效劳器就更甭提了)。

这时,SQLite的内存数据库特性就越发显得好用。

SQLite的API不区分当前操作的数据库是在内存仍是在文件(关于存储介质是透明的)。

因此若是你感觉磁盘I/O有可能成为瓶颈的话,能够考虑切换为内存方式。

切换的时候,操作SQLite的代码大体不用大改,只要在开始时把文件Load到内存,终止时把内存的数据库Dump回文件就OK了。

1.6 编程语言接口由于SQLite本身是C写的,它自带的API也是C接口的。

2.SQLite数据库的缺点:2.1并发访问的锁机制SQLite在并发(包括多进程和多线程)读写方面的性能不太理想。

sqlite学习笔记8:C语言中使用sqlite之创建表

sqlite学习笔记8:C语言中使用sqlite之创建表

sqlite学习笔记8:C语⾔中使⽤sqlite之创建表前⾯已经说了怎样打开和关闭数据库,这次要说得是怎样运⾏SQL语句,来创建⼀张表。

要⽤的的函数:sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg)參数:db:已经打开的数据库实例sql:SQL语句,是⼀个字符串callback:是⼀个回调函数data:做为回调函数的第⼀个參数errmsg:⽤于带回错误信息该回调函数有两种返回值类型.1.返回零:sqlite3_exec() 将继续运⾏查询.2.返回⾮零:sqlite3_exec()将马上中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.回调函数的格式例如以下:int sqlite_callback(void* pv, /* 由 sqlite3_exec() 的第四个參数传递⽽来 */int argc, /* 表的列数 */char** argv, /* 指向查询结果的指针数组, 能够由 sqlite3_column_text() 得到 */char** col /* 指向表头名的指针数组, 能够由 sqlite3_column_name() 得到 */);參数格式:传给sqlite3_exec的回调函数,⽤来显⽰查询结果对每⼀条查询结果调⽤⼀次该回调函数參数:pv:由sqlite3_exec传递的初始化參数argc:表头的列数col:表头的名字数组指针argv:表头的数据数组指针返回值:1:中断查找0:继续列举查询到的数据实例:#include <stdio.h>#include <stdlib.h>#include "sqlite/sqlite3.h"#define DB_NANE "sqlite/test.db"sqlite3 *db = NULL;char* sql = NULL;char *zErrMsg = NULL;int ret = 0;typedef enum{false,true} bool;static int callback(void *NotUsed, int argc, char **argv, char **azColName){int i = 0;for(i=0; i < argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;}bool connectDB(){ret = sqlite3_open(DB_NANE, &db);if( ret != SQLITE_OK){fprintf(stderr, "Error open database: %s\n", sqlite3_errmsg(db));sqlite3_free(zErrMsg);return false;}fprintf(stdout, "Successfully opened database\n");return true;}/* 相对于前篇⽂章加⼊了这个函数 */bool createTable(){/* Create SQL statement */sql = "CREATE TABLE COMPANY(" \"ID INT PRIMARY KEY NOT NULL," \"NAME TEXT NOT NULL," \"AGE INT NOT NULL," \"ADDRESS CHAR(50)," \"SALARY REAL );";/* Execute SQL statement */ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if( ret != SQLITE_OK ){fprintf(stderr, "Error SQL: %s\n", zErrMsg);sqlite3_free(zErrMsg);return false;}fprintf(stdout, "Successfully table created\n");return true;}bool closeDB(){int ret = 0;ret = sqlite3_close(db);if ( ret == SQLITE_BUSY ){return false;}return true;}int main(int argc, char* argv[]){connectDB();createTable();/*添加了⼀个函数调⽤*/closeDB();return 0;}这个函数仅仅能运⾏⼀次,第⼆次运⾏会报错说表已经存在。

sqliteconnection类

sqliteconnection类

sqliteconnection类什么是SQLiteSQLite是一个轻量级的数据库引擎,它是一种嵌入式数据库引擎,可以在没有后台数据库服务器的情况下直接访问和操作数据库文件。

SQLite是使用C语言编写的,它具有简单、易用、高效、可靠的特点。

在移动设备和嵌入式系统中广泛应用,也被用作开发桌面应用程序的数据库存储引擎。

连接SQLite数据库在使用SQLite数据库之前,我们需要先与数据库建立连接。

连接SQLite数据库的过程可以通过SQLiteConnection类来实现。

SQLiteConnection类是SQLite库提供的一个类,用于与SQLite数据库进行交互。

创建SQLiteConnection对象要连接SQLite数据库,我们首先需要创建一个SQLiteConnection对象。

SQLiteConnection类在System.Data.SQLite命名空间中定义。

可以使用以下代码创建一个SQLiteConnection对象:using System.Data.SQLite;SQLiteConnection connection = new SQLiteConnection("data source = path/to/data base.db");在上面的代码中,我们使用SQLiteConnection的构造函数创建一个SQLiteConnection对象。

构造函数的参数是一个连接字符串,其中data source指定了要连接的数据库文件的路径。

打开和关闭连接连接SQLite数据库和其他数据库非常相似,我们可以使用Open和Close方法来打开和关闭数据库连接。

以下是打开和关闭连接的示例代码:connection.Open();// 需要执行一些操作...connection.Close();在上面的代码中,我们使用Open方法打开数据库连接,操作完成后使用Close方法关闭连接。

SQLITE源码分析

SQLITE源码分析

SQLITE源码分析SQLite是一个轻量级的关系型数据库管理系统,它的源码可以用C 语言编写。

在进行SQLite源码分析时,需要了解以下几个主要方面:1. 数据库文件格式:SQLite的数据存储在一个单一的文件中,文件中包含了一个或多个表格,每个表格又包含多个行和列。

文件格式采用了一种称为B树的数据结构,它能够高效地进行数据的插入、删除和查找操作。

2. 内存管理:SQLite使用了自己的内存管理系统,它通过使用一个称为“mem5”的内存分配器来管理内存。

这个内存分配器可以将整个虚拟内存空间划分为多个固定大小的块,以降低内存碎片化的程度,提高内存分配的效率。

3. SQL解析和优化:SQLite使用了一个称为Lemon的工具来生成SQL解析器。

Lemon根据输入的语法规则生成一个状态机,并根据状态机解析输入的SQL语句。

一旦SQL语句被解析成功,SQLite会进行一系列的优化操作,例如重写查询计划、生成执行计划等。

4. 查询执行:SQLite的查询执行主要包括四个阶段:编译、优化、执行和返回结果。

编译阶段主要负责将SQL语句进行解析和编译成一个执行计划。

优化阶段对执行计划进行一系列的优化操作,例如选择最佳的索引、重写查询计划等。

执行阶段负责执行编译和优化生成的执行计划,并将结果返回给调用者。

5. 事务处理:SQLite支持ACID事务,它使用一个称为WAL(Write-Ahead-Logging)的机制来实现事务的持久化。

WAL允许多个读操作和一个写操作并发地访问数据库,从而提高了多用户并发访问数据库的效率。

总结来说,SQLite的源码分析涉及数据库文件格式、内存管理、SQL 解析和优化、查询执行和事务处理等多个方面。

在分析源码时,可以从这些方面入手,深入了解SQLite的工作原理和实现细节。

同时,由于SQLite源码较为庞大和复杂,建议阅读相关的文档和资料,以提高分析效率和理解深度。

C语言数据库操作

C语言数据库操作

C语言数据库操作C语言是一种通用的编程语言,也可以用于数据库操作。

在C语言中,我们可以使用一些库来连接和操作数据库,比如SQLite和MySQL。

本文将介绍如何在C语言中进行数据库操作,包括连接数据库、创建表、插入和查询数据等。

1.连接数据库:要在C语言中连接数据库,我们需要引入相应的库。

例如,使用SQLite库的代码如下:```c#include <stdio.h>#include <stdlib.h>#include <sqlite3.h>int maisqlite3 *db;int rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK)fprintf(stderr, "Cannot open database: %s\n",sqlite3_errmsg(db));return 1;} elsefprintf(stdout, "Database opened successfully\n");}sqlite3_close(db);return 0;```在上面的代码中,我们首先通过调用`sqlite3_open`函数打开一个名为`test.db`的数据库。

如果打开成功,函数将返回`SQLITE_OK`。

否则,我们可以通过`sqlite3_errmsg`函数获取错误信息。

2.创建表:在连接数据库后,我们可以在其中创建表。

下面的代码演示了如何在SQLite数据库中创建表:```c#include <stdio.h>#include <stdlib.h>#include <sqlite3.h>int maisqlite3 *db;char *sql;char *errmsg = 0;int rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK)fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));return 1;} elsefprintf(stdout, "Database opened successfully\n");}sql = "CREATE TABLE COMPANY(""IDINTPRIMARYKEYNOTNULL,""NAMETEXTNOTNULL,""AGEINTNOTNULL,""ADDRESSCHAR(50),""SALARYREAL);";rc = sqlite3_exec(db, sql, 0, 0, &errmsg);if (rc != SQLITE_OK)fprintf(stderr, "SQL error: %s\n", errmsg);sqlite3_free(errmsg);} elsefprintf(stdout, "Table created successfully\n");}sqlite3_close(db);return 0;```在上面的代码中,我们使用`sql`字符串来定义一个创建表的SQL语句。

C语言中的数据库操作与SQL语言

C语言中的数据库操作与SQL语言

C语言中的数据库操作与SQL语言在现代软件开发中,数据库操作是一个非常关键的环节。

C语言作为一种强大的编程语言,也提供了丰富的数据库操作功能。

在本文中,我们将深入探讨C语言中的数据库操作以及与之紧密相关的SQL语言。

一、数据库操作简介数据库是一个用于存储和管理数据的系统。

在数据库中,我们可以创建表格来组织和存储数据。

C语言可以通过数据库操作来实现对数据库的增删改查等操作。

二、C语言中的数据库操作库C语言中有许多优秀的数据库操作库,比如MySQL、SQLite等。

这些库提供了一系列函数来实现与数据库的交互。

我们可以使用这些函数来连接数据库、创建表格、插入数据、更新数据以及查询数据等操作。

三、SQL语言简介SQL是结构化查询语言,用于对数据库进行操作的标准语言。

无论是在C语言中,还是在其他编程语言中,我们都需要使用SQL语言来操作数据库。

SQL语言包括了数据定义语言(DDL)和数据操作语言(DML)两部分。

1. 数据定义语言(DDL)DDL用于创建和管理数据库中的表格、字段、索引等对象。

在C语言中,我们可以使用SQL语句来创建表格,定义字段的数据类型以及设定约束等。

2. 数据操作语言(DML)DML用于对数据库中的数据进行插入、更新、删除和查询等操作。

在C语言中,我们可以使用SQL语句来完成这些操作,比如通过INSERT语句插入数据,通过UPDATE语句更新数据,通过DELETE语句删除数据,通过SELECT语句查询数据。

四、示例:C语言中的数据库操作下面是一个简单的示例,演示了如何在C语言中进行数据库操作。

```c#include <stdio.h>#include <stdlib.h>#include <mysql.h>int main() {MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;conn = mysql_init(NULL);if (!mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0)) {printf("连接失败: %s\n", mysql_error(conn));exit(1);}if (mysql_query(conn, "SELECT * FROM students")) {printf("查询失败: %s\n", mysql_error(conn));exit(1);}res = mysql_use_result(conn);printf("学生列表:\n");while ((row = mysql_fetch_row(res)) != NULL) {printf("%s %s\n", row[0], row[1]);}mysql_free_result(res);mysql_close(conn);return 0;}```以上代码演示了如何使用MySQL库来连接数据库并查询学生表中的数据。

sqlite 原理

sqlite 原理

sqlite 原理SQLite是一种轻型、自包含的关系型数据库管理系统,使用C语言编写,其设计重点是小型型和嵌入式应用领域。

SQLite是一个开源的软件,它的数据库文件可以跨平台使用,是许多应用程序中经常使用的数据库。

SQLite的特点:1. 轻量级:SQLite相对于其他数据库而言,它的体积很小,可以很容易地集成到其他应用程序中,并且占用的内存较小。

2. 简单易用:SQLite的语法非常简洁明了,操作也很方便,即使是新手也可以很快上手。

3. 稳定可靠:SQLite的数据存储是基于文件,这种存储方式非常稳定可靠,即使在系统崩溃的情况下也不会出现数据丢失的情况。

4. 高性能:SQLite的读写速度非常快,在数据量较小的情况下,可以达到很高的读写性能。

SQLite的原理:1. 数据存储:SQLite的存储方式是基于文件的,其数据存储在一个文件中,这个文件的扩展名为.db。

每个数据库文件中可以包含多个表,每个表包含多行数据,以及每行数据对应的多个列。

2. 数据类型:SQLite支持的数据类型包括NULL、INTEGER、REAL、TEXT和BLOB。

其中,INTEGER可以存储整数值,REAL可以存储浮点数值,TEXT可以存储字符串,BLOB可以存储二进制数据。

3. 数据查询语句:SQLite的查询语句是基于SQL语言的,查询语句中可以包含SELECT、FROM、WHERE等关键字。

例如,SELECT * FROM table_name WHERE column_name = 'value',这个查询语句表示从名为table_name的表中获取所有行的数据,并且其中column_name列的值等于'value'。

4. 数据索引:为了使SQLite的查询速度更快,可以在表中创建索引。

索引可以加快数据查询的速度,但是索引也会降低插入和更新数据的速度。

在SQLite中,可以使用CREATE INDEX语句来创建索引。

sqlite c.execute返回对象

sqlite c.execute返回对象

sqlite c.execute返回对象文章主题:深入理解SQLite C.execute返回对象SQLite是一种轻量级的嵌入式数据库系统,广泛应用于各种移动应用和小型项目中。

在SQLite中,C语言作为主要的编程语言与数据库进行交互。

当我们执行SQL语句时,常常会使用C语言的C.execute函数,它可以执行SQL语句并返回一个对象。

本文将深入探讨SQLite C.execute返回对象,帮助读者更好地理解和应用这个功能。

第一步:介绍SQLite C.execute函数在开始深入探讨SQLite C.execute返回对象之前,先来了解一下C.execute函数的基本用法和功能。

C.execute是SQLite C语言接口提供的一个函数,用于执行SQL语句,其函数原型为:int sqlite3_exec(sqlite3 *db, 数据库连接对象const char *sql, SQL语句int (*callback)(void*,int,char,char), 回调函数void *, 回调函数参数char errmsg 错误信息);C.execute函数的参数包括数据库连接对象db、要执行的SQL语句sql、一个回调函数callback、回调函数的参数和一个错误信息指针errmsg。

回调函数是可选的,它可以用于在执行SQL语句时获取返回的结果。

C.execute函数的主要功能是执行SQL语句,并返回一个整数值,表示SQL语句的执行结果。

通常情况下,返回值为SQLITE_OK(0)表示执行成功,其他非零值表示执行失败。

如果执行失败,可以通过错误信息指针errmsg来获取错误信息。

第二步:SQLite C.execute函数返回的对象类型当我们执行一个SQL语句后,SQLite C.execute函数返回一个对象类型,这个对象类型代表了执行SQL语句的结果。

根据不同的SQL语句,可以有不同类型的返回对象,包括但不限于下面几种:1. 无返回对象(返回值为整数):对于没有返回结果的SQL语句,如创建表、插入数据等操作,C.execute函数返回的是一个整数值,表示操作的结果。

C语言数据库编程SQL和数据库操作

C语言数据库编程SQL和数据库操作

C语言数据库编程SQL和数据库操作C语言数据库编程:SQL和数据库操作C语言是一种高效、灵活的编程语言,适用于各种应用领域,包括数据库编程。

在C语言中,我们可以使用SQL语句来进行数据库操作,从而实现对数据库的增、删、改、查等功能。

本文将介绍C语言中的SQL和数据库操作。

一、连接数据库在进行数据库操作之前,我们首先需要连接到数据库。

C语言提供了各种数据库接口库,比如MySQL提供的Connector/C库、SQLite提供的SQLite3库等,这些库可以帮助我们连接数据库。

连接数据库的基本步骤如下:1. 引入库文件:在程序中引入相应的库文件,以便使用数据库接口函数。

2. 建立连接:使用数据库接口函数建立与数据库之间的连接,并指定连接参数,比如数据库名称、用户名、密码等。

3. 检查连接状态:检查连接是否成功建立,如果连接失败,则需要处理错误信息。

二、执行SQL语句连接成功后,我们就可以执行SQL语句来对数据库进行操作。

SQL 语句是一种专门用于与关系型数据库交互的语言,可以用于查询、插入、更新和删除数据。

在C语言中,我们可以使用数据库接口库提供的函数来执行SQL 语句,其中包括以下常用函数:1. 执行查询语句:使用函数执行SELECT语句,从数据库中检索数据。

2. 执行插入语句:使用函数执行INSERT语句,向数据库中插入新的数据。

3. 执行更新语句:使用函数执行UPDATE语句,更新数据库中的数据。

4. 执行删除语句:使用函数执行DELETE语句,从数据库中删除数据。

执行SQL语句的具体步骤如下:1. 构造SQL语句:根据需求构造合适的SQL语句,包括语法、条件等。

2. 执行SQL语句:使用数据库接口函数执行SQL语句,获取执行结果。

3. 处理结果:根据执行结果进行相应的操作,比如提取查询结果、处理错误信息等。

三、事务处理事务是数据库操作的基本单位,它是由一组数据库操作组成的逻辑单位,要么全部成功执行,要么全部回滚。

(C#)SQLite数据库连接字符串

(C#)SQLite数据库连接字符串

(C#)SQLite数据库连接字符串最常⽤的:Data Source=filename;Version=3;⾃增主键:Create test1([id] integer PRIMARY KEY AUTOINCREMENT,[name]);Basic(基本的)Data Source=filename;Version=3;Using UTF16(使⽤UTF16编码)Data Source=filename;Version=3;UseUTF16Encoding=True;With password(带密码的)Data Source=filename;Version=3;Password=myPassword;Using the pre 3.3x database format(使⽤3.3x前数据库格式)Data Source=filename;Version=3;Legacy Format=True;Read only connection(只读连接)Data Source=filename;Version=3;Read Only=True;With connection pooling(设置连接池)Data Source=filename;Version=3;Pooling=False;Max Pool Size=100;Using DateTime.Ticks as datetime format()Data Source=filename;Version=3;DateTimeFormat=Ticks;Store GUID as text(把Guid作为⽂本存储,默认是Binary)Data Source=filename;Version=3;BinaryGUID=False;如果把Guid作为⽂本存储需要更多的存储空间Specify cache size(指定Cache⼤⼩)Data Source=filename;Version=3;Cache Size=2000;Cache Size 单位是字节Specify page size(指定页⼤⼩)Data Source=filename;Version=3;Page Size=1024;Page Size 单位是字节Disable enlistment in distributed transactionsData Source=filename;Version=3;Enlist=N;Disable create database behaviour(禁⽤创建数据库⾏为)Data Source=filename;Version=3;FailIfMissing=True;默认情况下,如果数据库⽂件不存在,会⾃动创建⼀个新的,使⽤这个参数,将不会创建,⽽是抛出异常信息Limit the size of database(限制数据库⼤⼩)Data Source=filename;Version=3;Max Page Count=5000;The Max Page Count is measured in pages. This parameter limits the maximum number of pages of the database.Disable the Journal File (禁⽤⽇志回滚)Data Source=filename;Version=3;Journal Mode=Off;This one disables the rollback journal entirely.Persist the Journal File(持久)Data Source=filename;Version=3;Journal Mode=Persist;基本连接Sqlite数据库:Data Source=mydb.db;Version=3;--"Version" 的可能值: "2″指 SQLite 2.x (default);"3″指 SQLite 3.x 连接同时创建⼀个新的Sqlite数据库:Data Source=mydb.db;Version=3;New=True;启⽤压缩连接Sqlite数据库:Data Source=mydb.db;Version=3;Compress=True;指定连接Sqlite数据库的缓存⼤⼩:Data Source=mydb.db;Version=3;Cache Size=3000;。

sqlite begin transaction c语言

sqlite begin transaction c语言

sqlite begin transaction c语言sqlite是一种轻量级的嵌入式关系型数据库,可以在各种应用程序中使用。

在C语言中,我们可以使用sqlite API来访问和操作数据库。

开始一个事务是管理数据库操作的一种方式,它允许多个相关操作作为一个逻辑单位执行,以保持数据的完整性和一致性。

本文将逐步介绍如何在C语言中使用sqlite API来开始和管理事务。

步骤1:安装sqlite库首先,我们需要在C语言项目中安装sqlite库。

可以从sqlite官方网站(API。

步骤2:打开数据库连接在开始一个事务之前,我们需要打开与数据库的连接。

可以使用sqlite3_open函数打开一个指定的数据库文件,如果数据库文件不存在,则会自动创建一个新文件。

示例代码:c#include <sqlite3.h>int main() {sqlite3 *db;int rc = sqlite3_open("mydatabase.db", &db);if (rc != SQLITE_OK) {打开数据库失败return -1;}数据库连接已经打开,我们可以开始进行数据库操作...return 0;}在上述示例中,我们使用sqlite3_open函数打开名为"mydatabase.db"的数据库文件。

如果打开成功,函数将返回SQLITE_OK,否则返回一个错误码。

步骤3:开始事务在打开数据库连接之后,我们可以开始一个事务。

一个事务可以通过调用sqlite3_exec函数来执行一条SQL语句。

为了开始一个事务,我们可以执行"BEGIN TRANSACTION"语句。

示例代码:c#include <sqlite3.h>int main() {sqlite3 *db;int rc = sqlite3_open("mydatabase.db", &db);if (rc != SQLITE_OK) {打开数据库失败return -1;}rc = sqlite3_exec(db, "BEGIN TRANSACTION;", 0, 0, 0);if (rc != SQLITE_OK) {开始事务失败sqlite3_close(db);return -1;}数据库连接已经打开,事务已经开始,我们可以进行数据库操作 ...return 0;}在上述示例中,我们使用sqlite3_exec函数执行"BEGIN TRANSACTION;"语句,它会开始一个事务。

C#操作SQLite数据库之读写数据库的方法

C#操作SQLite数据库之读写数据库的方法

C#操作SQLite数据库之读写数据库的⽅法本⽂实例讲述了C#操作SQLite数据库之读写数据库的⽅法。

分享给⼤家供⼤家参考,具体如下:这⾥演⽰读写数据库并在窗体(Form)中显⽰其数据,其⽅式为:读:Database(SQLite) -> DataAdapter -> DataSet -> DataGridView写:Database(SQLite) <- DataAdapter <- DataSet <- DataGridView1、假设现有数据库表student,其字段如下:ID(⾃增字段,主键)number name grade120120001jackey12、DataGrideView控件和DataSet控件在Form上拖放⼀个DataGrideView控件(注意:不需要指定数据源(DataSource),⽽只需要在代码中对DataGridView对象的DataSource成员幅值即可);然后再拖放⼀个DataSet控件(此控制不在窗体上显⽰出来)。

3、读并在DataGrideView中显⽰出来mDbConn = new SQLiteConnection("Data Source=sqlite.student.db");mDbConn.Open();dataAdapter = new SQLiteDataAdapter("SELECT * FROM student;", mDbConn);//读数据库dataAdapter.FillSchema(dataSet1, SchemaType.Source, "student");//将数据库表student的架构信息(此时为主键约束)填充到dataSet1的student表中dataAdapter.Fill(dataSet1, "student");//填充DataSet控件dataGridView1.DataSource = dataSet1.Tables["Table"];//注意,DataSet中的数据表依次为Table, Table1, Table2...mDbConn.Close();注意:dataAdapter.FillSchema(dataSet1, SchemaType.Source, "student");将数据库表student的架构信息(此时为主键约束)填充到dataSet1的student表中4、写并更新DataGrideView中mDbConn.Open();DataRow dataRow = dataSet1.Tables["student"].NewRow();dataRow["number"] = "20120010";dataRow["name"] = "李四";dataRow["grade"] = "2";dataSet1.Tables["Table"].Rows.Add(dataRow);dataGridView1.Invalidate();//实时更新dataGridView1dataAdapter.InsertCommand = new SQLiteCommand("INSERT INTO student(number, name, grade) VALUES('" + dataRow["number"] + "','" + dataRow["name"] + "','" + dataRow["grade"] + "')", mDbConn); dataAdapter.Update(dataSet1, "student"");mDbConn.Close();参数⽂献更多关于C#相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家C#程序设计有所帮助。

C#操作SQLiteDB

C#操作SQLiteDB

C#操作SQLiteDBC#操作SQLite DatabaseC#下SQLite操作驱动dll下载:System.Data.SQLite C#使用SQLite步骤:(1)新建一个project(2)添加SQLite操作驱动dll引用(3)使用API操作SQLite DataBaseusing System;using System.Data.SQLite;namespace SQLiteSamples {class Program {//数据库连接SQLiteConnection m_dbConnection;static void Main(string[] args) {Program p = new Program(); }public Program() {createNewDatabase(); connectToDatabase(); createTable(); fillTable();printHighscores(); }//创建一个空的数据库 void createNewDatabase() {SQLiteConnection.CreateFile(\ }//创建一个连接到指定数据库 void connectToDatabase() {m_dbConnection = newSQLiteConnection(\Source=MyDatabase.sqlite;Version=3;\m_dbConnection.Open(); }//在指定数据库中创建一个table void createTable() {string sql = \SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); }//插入一些数据 void fillTable() {string sql = \SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery();sql = \ command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery();sql = \ command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); }//使用sql查询语句,并显示结果 void printHighscores() {string sql = \SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection); SQLiteDataReader reader = command.ExecuteReader(); while(reader.Read())Console.WriteLine(\\+ reader[\+ \reader[\Console.ReadLine(); } } }\+ 操作SQLite Database的C#帮助类SQLite Helper 将一些常用的功能封装一下,封装成SQLite Helper类using System;using System.Data;using System.Text.RegularExpressions; using System.Xml; using System.IO;using System.Collections; using System.Data.SQLite;namespace DBUtility.SQLite {////// SQLiteHelper is a utility class similar to \ /// Data Access Application Block and follows similar pattern. ///public class SQLiteHelper {////// Creates a newprivate SQLiteHelper() { }////// Creates the command. //////////// SQLite Commandpublic static SQLiteCommand CreateCommand(SQLiteConnection connection, string commandText, params SQLiteParameter[] commandParameters) {SQLiteCommand cmd = new SQLiteCommand(commandText, connection); if (commandParameters.Length > 0) {foreach (SQLiteParameter parm in commandParameters) cmd.Parameters.Add(parm); }return cmd; }////// Creates the command. ///////// SQLite Commandpublic static SQLiteCommand CreateCommand(string connectionString, string commandText, params SQLiteParameter[] commandParameters) {SQLiteConnection cn = new SQLiteConnection(connectionString);SQLiteCommand cmd = new SQLiteCommand(commandText, cn);if (commandParameters.Length > 0) {foreach (SQLiteParameter parm in commandParameters) cmd.Parameters.Add(parm); }return cmd; }////// Creates the parameter. ////// SQLiteParameter public static SQLiteParameterCreateParameter(string parameterName, System.Data.DbType parameterType, object parameterValue) {SQLiteParameter parameter = new SQLiteParameter();parameter.DbType = parameterType;parameter.ParameterName = parameterName; parameter.Value = parameterValue; return parameter; }////// Shortcut method to execute dataset from SQL Statement and object[]arrray of parameter values////////////public static DataSet ExecuteDataSet(string connectionString, string commandText, object[] paramList) {SQLiteConnection cn = new SQLiteConnection(connectionString); SQLiteCommand cmd = cn.CreateCommand();mandText = commandText; if (paramList != null) {AttachParameters(cmd,commandText, paramList); }DataSet ds = new DataSet();if (cn.State == ConnectionState.Closed) cn.Open();SQLiteDataAdapter da = new SQLiteDataAdapter(cmd); da.Fill(ds); da.Dispose(); cmd.Dispose(); cn.Close();return ds; }////// Shortcut method to execute dataset from SQL Statement and object[]arrray of parameter values/////////public static DataSet ExecuteDataSet(SQLiteConnection cn, stringcommandText, object[] paramList) {SQLiteCommand cmd = cn.CreateCommand();mandText = commandText; if (paramList != null){感谢您的阅读,祝您生活愉快。

sqlite 查询in语句 预编译

sqlite 查询in语句 预编译

sqlite 查询in语句预编译摘要:1.SQLite 简介2.SQLite 查询IN 语句3.预编译IN 语句正文:SQLite 是一款轻量级的数据库,它具有可移植性、自给自足、高度灵活的特点,非常适合嵌入到应用程序中。

在SQLite 中,查询IN 语句是一种非常常见的操作,可以用来查询多个值之间的关联关系。

为了提高查询性能,可以使用预编译技术优化IN 语句。

首先,我们简要了解一下SQLite。

SQLite 是一款基于C 语言开发的关系型数据库,其设计目标是提供一种小巧、高效、功能强大的嵌入式数据库解决方案。

SQLite 支持SQL 语言,允许在应用程序中方便地实现数据存储和管理。

在SQLite 中,查询IN 语句是非常常见的操作。

IN 语句用于查询一个字段值在多个值列表中的记录。

例如,假设有一个名为“students”的表,包含以下字段:id(整数)、name(字符串)和age(整数)。

如果我们想要查询年龄在18 到25 岁之间的所有学生,可以使用如下IN 语句:```sqlSELECT * FROM students WHERE age IN (18, 19, 20, 21, 22, 23, 24, 25);```为了提高查询性能,可以使用预编译技术优化IN 语句。

预编译技术的核心思想是将IN 语句中的一部分计算结果提前生成,从而避免在每次查询时都进行复杂的计算。

在SQLite 中,可以使用预编译的IN 语句来提高查询性能。

具体操作步骤如下:1.首先,创建一个临时的唯一索引,用于加速查询。

例如,在上面的例子中,可以创建一个基于年龄的临时唯一索引:```sqlCREATE TEMPORARY UNIQUE INDEX age_idx ON students (age);```2.使用预编译的IN 语句进行查询。

例如,要查询年龄在18 到25 岁之间的所有学生,可以使用以下预编译的IN 语句:```sqlSELECT * FROM students WHERE age IN (18, 19, 20, 21, 22, 23, 24, 25) AND age_idx;```通过使用预编译技术,SQLite 可以在查询时更快地找到满足条件的记录,从而提高查询性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sqlite数据库 c语言
SQLite 是一个 C 语言库,用于轻量级的磁盘文件数据库。

它的特点是数据库文件是单个磁盘文件,可以通过常规的读写文件系统来访问。

SQLite 提供了 SQL 语言接口,可以执行 SQL 查询和更新。

以下是一个简单的 C 语言示例,使用 SQLite 进行数据库操作:
```c
include <>
include <>
int main() {
sqlite3 db;
char err_msg = 0;
int rc;
char sql;
rc = sqlite3_open("", &db);
if (rc) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db)); return(0);
} else {
fprintf(stderr, "成功打开数据库\n");
}
// 创建表格
sql = "CREATE TABLE Friends (Id INT, Name TEXT);"
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
fprintf(stdout, "表格创建成功\n");
}
// 插入数据
sql = "INSERT INTO Friends (Id, Name) VALUES (1, 'Tom');" rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
fprintf(stdout, "数据插入成功\n");
}
// 查询数据
sql = "SELECT FROM Friends;"
rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", err_msg);
sqlite3_free(err_msg);
} else {
fprintf(stdout, "查询成功\n");
}
sqlite3_close(db);
return 0;
}
```
这个示例首先打开一个名为 "" 的数据库,然后创建一个名为 "Friends" 的表格,插入一行数据,然后查询所有的数据。

你需要将回调函数 `callback`
替换为处理查询结果的实际函数。

注意,你需要在编译时链接 SQLite 库。

例如,如果你使用 gcc,你可能需要这样编译你的程序:`gcc -lsqlite3 your_ -o your_program`。

相关文档
最新文档