zoukankan      html  css  js  c++  java
  • sqlite的几种访问方法

    方法1:直接执行SQL语句

    	sqlite3* db = Open(_T("./test.db3"), FALSE);
    	if (db != NULL)
    	{
    		ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
    
    		for (int i = 0; i < TEST_COUNT; i++)
    		{
    			CString s;
    			s.Format(_T("INSERT INTO Template(TName, TContent) VALUES('%d', '%d');"), i, i);
    			ExecuteSQL(db, s);
    		}
    
    		Close(db);
    	}
    

    方法2:批处理

    	sqlite3* db = Open(_T("./test.db3"), FALSE);
    	if (db != NULL)
    	{
    		ExecuteSQL(db, _T("BEGIN;"));
    
    		ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
    
    		for (int i = 0; i < TEST_COUNT; i++)
    		{
    			CString s;
    			s.Format(_T("INSERT INTO Template(TName, TContent) VALUES('%d', '%d');"), i, i);
    			ExecuteSQL(db, s);
    		}
    
    		ExecuteSQL(db, _T("COMMIT;"));
    
    		Close(db);
    	}
    

    方法3:数据绑定

    	sqlite3* db = Open(_T("./test.db3"), FALSE);
    	if (db != NULL)
    	{
    		ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
    
    		TCHAR szSQL[128];
    		_stprintf(szSQL, _T("INSERT INTO Template(TName, TContent) VALUES(?, ?);"));
    		sqlite3_stmt *stmt = NULL;
    		const char *pzTail = NULL;
    		int utf8Len = 0;
    		char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
    		int nRes = sqlite3_prepare_v2(db, utf8, utf8Len, &stmt, &pzTail);
    		delete []utf8;
    		if (SQLITE_OK != nRes)
    		{
    			return;
    		}
    
    		for (int i = 0; i < TEST_COUNT; i++)
    		{
    			sqlite3_reset(stmt);
    
    			sqlite3_bind_int(stmt, 1, i);
    			sqlite3_bind_int(stmt, 2, i);
    
    			sqlite3_step(stmt);
    		}
    		Close(db);
    	}
    

    方法4:批处理与数据绑定结合

    	sqlite3* db = Open(_T("./test.db3"), FALSE);
    	if (db != NULL)
    	{
     		ExecuteSQL(db, _T("BEGIN;"));
    
    		ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
    
    		TCHAR szSQL[128];
    		_stprintf(szSQL, _T("INSERT INTO Template(TName, TContent) VALUES(?, ?);"));
    		sqlite3_stmt *stmt = NULL;
    		const char *pzTail = NULL;
    		int utf8Len = 0;
    		char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
    		int nRes = sqlite3_prepare_v2(db.GetObject(), utf8, utf8Len, &stmt, &pzTail);
    
    		for (int i = 0; i < TEST_COUNT; i++)
    		{
    			sqlite3_reset(stmt);
    
    			sqlite3_bind_int(stmt, 1, i);
    			sqlite3_bind_int(stmt, 2, i);
    
    			sqlite3_step(stmt);
    		}
    		delete []utf8;
    		if (SQLITE_OK != nRes)
    		{
    			return;
    		}
    		sqlite3_finalize(stmt);
    
    		ExecuteSQL(db, _T("COMMIT;"));
    
    
    		Close(db);
    	}
    

    经过测试,给这几种方法的效率排序如下:方法4>方法2>方法3>方法1

    测试用的公共代码

    sqlite3* Open(LPCTSTR szFile, BOOL bReadOnly /* = FALSE */)
    {
    	int nStrlen = _tcslen(szFile);
    	if (0 == nStrlen)
    	{
    		return FALSE;
    	}
    
    	sqlite3* db = NULL;
    	char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szFile, nStrlen);
    	int nRes = sqlite3_open_v2(utf8, &db, bReadOnly ? SQLITE_OPEN_READONLY : (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE), NULL);
    	delete []utf8;
    	if (nRes != SQLITE_OK)
    	{
    		return NULL;
    	}
    	return ;
    }
    
    void Close(sqlite3* db)
    {
    	if (db != NULL)
    	{
    		sqlite3_close(db);
    	}
    }
    
    BOOL ExecuteSQL(sqlite3* db, LPCTSTR szSQL)
    {
    	sqlite3_stmt *stmt = NULL;
    	const char *pzTail = NULL;
    	int utf8Len = 0;
    	char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
    	int nRes = sqlite3_prepare_v2(db, utf8, utf8Len, &stmt, &pzTail);
    	delete []utf8;
    	if (SQLITE_OK != nRes)
    	{
    		return FALSE;
    	}
    
    	nRes = sqlite3_step(stmt);
    	for (int i = 0; i < 10; i++)
    	{
    		if (SQLITE_BUSY == nRes)
    		{
    			Sleep(1000);
    			continue;
    		}
    		else
    		{
    			break;
    		}
    	}
    	sqlite3_finalize(stmt);
    
    	if (SQLITE_DONE != nRes)
    	{
    		return FALSE;
    	}
    	return TRUE;
    }
    
  • 相关阅读:
    Java并发编程:如何创建线程?
    Java并发编程:volatile关键字解析
    Java并发编程:深入剖析ThreadLocal
    Java并发编程:同步容器
    Java ConcurrentModificationException异常原因和解决方法
    Java并发编程:并发容器之ConcurrentHashMap
    Java并发编程:并发容器之CopyOnWriteArrayList
    Java并发编程:Callable、Future和FutureTask
    rest-framework频率组件
    rest-framework的权限组件
  • 原文地址:https://www.cnblogs.com/licb/p/5976064.html
Copyright © 2011-2022 走看看