`
betty_betty2008
  • 浏览: 24884 次
  • 性别: Icon_minigender_1
  • 来自: 东莞
最近访客 更多访客>>
社区版块
存档分类
最新评论

再学SQLite3 API

    博客分类:
  • D
阅读更多
这次进一步看了看SQLigte3 的API,不用上次写的类包装,而直接用C式写法做了一个练习。列在这里备忘。

module sqlite3Ex01;

import samsTools.utils;

import sqlite4D.sqlite3_imp;

import std.stdio;
import std.string;
import std.conv;

import core.stdc.stdlib;
import core.stdc.stdio;
import core.stdc.string;

bool createContacts(sqlite3* db)
{
	
	char* errmsg;
	
	db=initDB();
	if(db is null)
	{
		printf("error occurred.cann't create new table.\n");
		return false;
	}
	
	//printf("Init success.creating new table...\n");
	
	
	int ret=sqlite3_exec(db,toCstring("create table contacts (\n"
			" id integer primary key,	\n"
			" first_name char,			\n"
			" last_name char,			\n"
			" email char)"),
			null,
			null,
			&errmsg);

		if( ret!=SQLITE_OK)
		{
			printf("\n----------------------------------\n"
					"Create table 'contacts' failed because:\n%s.\n"
					"You can still use this table anyhow.\n"
					"------------------------------------\n",errmsg);
			sqlite3_free(errmsg);
			return false;
		}
		else
		{
			printf("contacts table was created.\n");
			return true;
		}
		closeDB(db);
		assert(0);
	
}
sqlite3* initDB(string dbname="progdb")
{
	
	sqlite* db;
	int result=sqlite3_open(toCstring(dbname),&db);

	
	if( result==SQLITE_OK)//just to make sure 'result' doesn't return other value 
	{
		printf("Successfully connected to database.\n");
		printf("Version:%s\n",sqlite3_libversion);
		
		return db;
	}
	else
	{
		printf("Error occurred.\nError code: %d\nError msg: %s\n",
			sqlite3_errcode(db),sqlite3_errmsg(db));
		sqlite3_free(db);
		
		return null;
	}
	
}
bool closeDB(sqlite3* db)
{
	
	if(sqlite3_close(db)!=SQLITE_OK)
		return false;
	return true;
}
void addRecordsToContacts(sqlite3* db)
{
	db=initDB();
	if(db !is null)
	{
		char* errmsg;
		char* first_name;
		char* last_name;
		char* email;
		char* qry;

		char input;//determine for more input
		
		do{
		string fname=askFor!(string)("Please enter first name:");
		first_name=toCstring(fname);
		printf("%s\n",first_name);
		
		string lname=askFor!(string)("Please enter last name:");
		last_name=toCstring(lname);
		printf("you entered:%s\n",last_name);

		string stremail=askFor!(string)("Please enter email:");
		email=toCstring(stremail);
		printf("You entered:%s\n",email);
		
		char* sql = sqlite3_mprintf(toCstring("INSERT INTO contacts(first_name,last_name,email)\n"
				"VALUES('%q','%q','%q');"),
			first_name,
			last_name,
			email);
			
		int ret=sqlite3_exec(db,sql,null,null,&errmsg);
	
		if(ret!=SQLITE_OK)
		{
			printf("SQL error:%s\n%s\n",errmsg,sql);
			sqlite3_free(errmsg);
			
		}
		else
		{
			printf("%s %s (%s) was inserted as ID %d\n",
				first_name,
				last_name,
				email,
				sqlite3_last_insert_rowid(db));
			
		}
		}while((input=askForChar("continue to add?(N/Y)"))=='y'|| input=='Y');
		
		closeDB(db);
	}
	
}
void menu()
{
	string menuStr="*** SQLite 3 Database System Exam ***\n"
				"\n"
				"1.	Create contact table\n"
				"2.	Add new record to contacts\n"
				"3.	Update record to contacts\n"
				"4.	Print contacts\n"
				"5.	Drop contacts\n"
				"6.	Quit\n--------------------------------------\n";

	write(menuStr);
	char input=askForChar("Your choice(1-6):");
	while(input!='6')
	{
		doMenuChoice(input);
		write(menuStr);
		input=askForChar("Your choice(1-6):");
	}

}
void updateContacts(sqlite3* db)
{
	db=initDB;
	char* errmsg;
	if(db !is null)
	{
		char* sql=sqlite3_mprintf(
			toCstring("UPDATE contacts "
			" SET first_name=lower(first_name),\n"
			"     last_name=lower(last_name)"));
		
		int ret=sqlite3_exec(db,sql,null,null,&errmsg);
		if( ret!=SQLITE_OK)
		{
			printf("Cann't update records because:\n%s\n",errmsg);
			sqlite3_free(errmsg);
				   
		}
		else
		{
			printf("%d row(s) were changed\n",sqlite3_changes(db));
		}
		closeDB(db);
	}
}



void printContacts(sqlite3* db)
{
	/* below code caused a compile error
	*** "can not convert 'int function(...) to intC function(...)"
	*** I don't know why and what the hell intC is.
	*** So I have to use another way sqlite3_prepare,step,finalize...
	*** If anybody know the reason why callback can not work,
	*** please let me know with thank!!
	
	int function(void* parg,int argc,char** argv,char** columnNames) callbacks;

	static int printTable( void* parg,int argc,char** argv,char** columnNames)
	{
		for(int i=0;i<argc;i++)
					{
						printf("%-10s\t%-8s\t%s\n",
						columnNames[i],columnNames[i+argc],argv[i]);
					}
						return 0;
		
	}
	
	callbacks=&printTable;
	printf("will print contents of contacts...\n");
	
	db=initDB;
	if(db ! is null)
	{
		char* errmsg;
		int ret=sqlite3_exec(db,toCstring("PRAGMA SHOW_DATATYPES=ON;"),null,null,null);
			ret=sqlite3_exec(db,toCstring("select * from contacts;"),
				&callbacks,//callbacks,printTable,&printTable all the same,can't compile!!
				null,&errmsg);
		if(ret!=SQLITE_OK)
		{
			printf("SQL error:%s\n",errmsg);
			sqlite3_free(db);
		}
		closeDB(db);
	}

	*/

	void error(char* msg)
	{
		printf("SQLite error:%s\n",msg);
	}
	
	char* sql=toCstring("select * from contacts;");
	uint cols;
	sqlite3_stmt* stmt;
	db=initDB;

	uint totalRecords;
	if(db)
	{
		int result=sqlite3_prepare_v2(db,
			sql,
			/*strlen(sql)+1,*/-1,
			&stmt,
			null);
		if( result!=SQLITE_OK)
		{
			sqlite3_finalize(stmt);
			error(sqlite3_errmsg(db));
			
		}
		cols=sqlite3_column_count(stmt);
		bool read()
		{
			result=sqlite3_step(stmt);

			if(result!= SQLITE_OK && result!=SQLITE_ROW && result!=SQLITE_DONE)
			{
				sqlite3_finalize(stmt);
				error(sqlite3_errmsg(db));
				return false;
			}
			if( result==SQLITE_DONE)
			{
				return false;
			}
			return true;
		}
		void printSepLine()
		{
			printf("------------------------------------"
				   "----------------------------------\n");
		}
		void printColumnHead()
		{
			printf("%-8s",sqlite3_column_name(stmt,0));
			for(int i=1;i<cols;i++)
			{
				printf("%-15s\t",sqlite3_column_name(stmt,i));
			}
			printf("\n");
			printSepLine;
		}
		
		void printColumnValue()
		{
			
			char* cValue=sqlite3_column_text(stmt,0);
			printf("%-8s",strlen(cValue)==0?toCstring("N/A"):cValue);
			for(int i=1;i<cols;i++)
			{
				cValue=sqlite3_column_text(stmt,i);
				printf("%-15s\t",strlen(cValue)==0?toCstring("N/A"):cValue);
			}
			printf("\n");
		}
		printColumnHead();
		while(read)
		{
			++totalRecords;
			printColumnValue();
		}
		printSepLine;
		printf("Total %8u records.\n\n",totalRecords);

		if(stmt)
		{
			sqlite3_finalize(stmt);
		}

		closeDB(db);
	}
}
void deleteContacts(sqlite3* db)
{
	printf("will delete table contacts...\n");
}

int doMenuChoice(char input)
{
	sqlite3* db;
	switch(input)
	{
		case '1':
		createContacts(db);
		return 1;
		break;
		case '2':
		addRecordsToContacts(db);
		return 2;
		break;
		case '3':
		updateContacts(db);
		return 3;
		break;
		case '4':
		printContacts(db);
		return 4;
		break;
		case '5':
		deleteContacts(db);
		return 5;
		break;
		case '6':
		return 6;
		break;
	}
	assert(0);
}

int main(string[] args)
{
	menu;
	pause;
	return 0;
}

分享到:
评论

相关推荐

    sqlite3API的封装

    SQLite3 API的封装是数据库开发中的一个重要环节,它允许开发者以更加简洁、高效的方式与SQLite数据库进行交互。在本文中,我们将深入探讨SQLite3 API的封装技术,以及如何通过实例来调用这些封装好的接口。 SQLite...

    sqlite3 c API 测试程序

    1. SQLite3 C API:SQLite3的C API提供了许多函数,如`sqlite3_open()`用于打开或创建数据库连接,`sqlite3_close()`用于关闭数据库连接,`sqlite3_exec()`用于执行SQL语句,以及`sqlite3_prepare_v2()`和`sqlite3_...

    sqlite(中文API)

    这个帮助文件是学习和参考SQLite API的重要资源,它覆盖了如`sqlite3_open()`用于打开数据库连接,`sqlite3_exec()`用于执行SQL语句,`sqlite3_prepare_v2()`和`sqlite3_step()`用于编译和执行预编译的SQL语句等关键...

    sqlite3.lib sqlite3.h sqlite3.dll sqlite3.exe

    `sqlite3.h`是SQLite3的头文件,包含了所有用于访问SQLite3数据库的API(应用程序编程接口)声明。开发人员在编写代码时需要包含这个头文件,以便能够调用如`sqlite3_open()`、`sqlite3_exec()`等函数来创建、查询或...

    sqlite_api.rar_sqlite_sqlite数据库表

    同时,SQLite API还提供了错误处理机制,如`sqlite3_errcode()`和`sqlite3_errmsg()`,帮助开发者调试和诊断问题。 总之,这个压缩包提供的源码示例是关于如何使用SQLite API在C语言环境中进行数据库操作的实例,...

    blackberry sqlite 封装API例子

    包含的`SqliteAPI`可能是一个包含上述功能的类,开发者可以参考其提供的示例代码来学习如何在Blackberry应用中使用SQLite数据库。例如,创建一个新用户可能涉及如下步骤: - 打开数据库 - 创建(或检查是否存在)...

    sqlite_test_all.zip 使用不同的Sqlite库API,对数据库操作

    本源码使用不同的Sqlite库API,对数据库创建表、读取、插入、更新等操作,是学习API的例子。sqlite数据库是一款比较小巧的数据库,应用到好多设备和软件中。从本质上说,SQLite数据库本质上来讲就是一个磁盘上的文件...

    sqlite3+图形界面+汉化包jar包中文文档JDBC连接sqlite

    中文文档是学习SQLite3的重要资料,它包含了关于SQLite3的详细信息,包括安装、使用、SQL语法、API参考等内容。有了这份中文文档,即使是对数据库不熟悉的开发者也能迅速上手。 总的来说,这个压缩包为学习SQLite3...

    sqlite源码_学习sqlite必备

    `sqlite3.h` 是SQLite的头文件,定义了SQLite的API接口,供外部程序调用。这个头文件包含了创建、打开、关闭数据库,执行SQL语句,以及获取查询结果等一系列操作的函数声明。开发者可以通过这些API与SQLite进行交互...

    Golang Gin RESTFul API with SQLite

    【Golang Gin RESTFul API with SQLite】是一个项目,它教你如何使用Go语言的Gin框架来构建符合RESTful架构的API,并结合SQLite数据库进行数据存储。在这个项目中,我们将探讨Gin框架的核心特性,RESTful API设计...

    SQLite3参考手册

    SQLite3是一种轻量级的、开源的、嵌入式的关系型数据库管理系统,广泛应用于移动设备、桌面应用甚至服务器环境中。它的设计目标是提供一个可移植的、可靠的、自包含的数据库解决方案,无需单独的服务器进程,可以...

    sqlite3已在VS2010编译,并带学习资料及实例

    5. SQLite3 API:SQLite3提供了一套C语言接口,包括了各种函数,如`sqlite3_open()`用于打开或创建数据库,`sqlite3_exec()`用于执行SQL命令,`sqlite3_prepare_v2()`和`sqlite3_step()`用于预编译和执行SQL语句,...

    使用sqlite3的类库和.h文件

    在提供的压缩包"sqlite3资源包"中,你应该能找到sqlite3.h头文件,它是SQLite3的API接口定义,以及.lib和.dll文件,分别代表静态库和动态库。在Windows环境下,.lib文件用于链接阶段,而.dll文件则是在运行时提供...

    sqlite3 简易DEMO

    `sqlite3.h`是头文件,包含了所有与SQLite3 API相关的声明,而`sqlite3.c`则是实现文件,包含了SQLite3的全部功能。 在DEMO中,`TestSqlite3.c`是主要的C语言源码文件。这个文件通常会展示如何打开一个SQLite3...

    sqlite3数据库.rar

    在Windows环境下,SQLite3通常通过编程接口(API)与C++等编程语言集成,用于开发数据库应用程序。在这个"sqlite3数据库.rar"压缩包中,包含了几个与SQLite3开发相关的资源。 首先,`vld-内存检查工具.rar`可能是一...

    Sqlite3中文路径解决

    在使用SQLite3数据库时,有时会遇到一个常见问题:无法处理中文路径。这主要是由于SQLite3默认不支持非ASCII字符,包括中文字符,导致在读取或写入带有中文路径的数据库时出现乱码或错误。针对这个问题,我们可以...

    SQLite 详细教程和 ANDROID API chm格式

    这篇教程将深入探讨 SQLite 的使用以及它在 Android API 中的应用。 首先,SQLite 提供了一个 SQL 接口,使得开发者可以通过执行 SQL 语句来创建、更新、查询和删除数据库中的数据。这些基本操作包括: 1. **创建...

    MFC 使用sqlite3 例子

    在本文中,我们将深入探讨如何在Microsoft Foundation Class (MFC) 应用程序中使用SQLite3数据库引擎。这个示例项目是使用Visual Studio 2010开发的,它演示了MFC对话框中对SQLite数据库的基本操作,包括添加、删除...

    micropython-sqlite3

    MicroPython的sqlite3库提供了与标准Python环境相似的API接口,使得在MicroPython环境中创建、操作数据库变得简单易行。 使用MicroPython的sqlite3库,首先需要确保你的MicroPython环境已经集成了该库。例如,对于...

    Sqlite3源码及示例

    在C++中封装Sqlite3,可以创建一个易于使用的API,使得在C++应用中集成数据库操作变得更加便捷。 首先,Sqlite3的核心功能包括: 1. 数据库创建:通过调用`sqlite3_open()`函数,可以打开或创建一个新的数据库文件...

Global site tag (gtag.js) - Google Analytics