SQLite在C++ Builder里怎么用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite在C++ Builder里怎么用相关的知识,希望对你有一定的参考价值。

C++/C++builder中调用的方法都是一样的不需要任何组件,可以很方便的调用,,
1.在C++builder中 你要用implib 吧sqlite3.lib转换成C++builder可以用的库。
然后包含sqlite3.h头文件在文件目录下面放进去sqlite3.dll和sqlite3.lib
然后在程序中 import comment(lib,“sqlite3.lib”)就可以用了。

2.C++中的用法也是这样的。问价不需要转码, 但是要包含头文件。然后要sqlite3.dll
和sqlite3.lib,然后在程序下面import comment(lib,“sqlite3.lib”),也可以用了。

具体用法是,先用_sqlite3_open(),函数打开数据库文件,
然后执行数据库命令_sqlite3_exec();
要获取数据集的话用sqlite3_get_table()获取数据集合,
不过获取的都是字符串,你要自己选好位置,或者你可以写一个结构体,
像dataSet一样
参考技术A PC上可以先将操作缓存到内存里哦。
频繁进行增删改的话,建议使用事务处理(transaction),将操作先缓存到内存里,以减少数据库文件打开关闭次数,提升效率:

rc = sqlite3_exec(db, "BEGIN;", 0, 0, &zErrMsg);
//执行SQL语句
rc = sqlite3_exec(db, "COMMIT;", 0, 0, &zErrMsg);本回答被提问者采纳
参考技术B 把sqlite3加入项目中,include 后就可以使用了,项目目录下要带上sqlite3.dll。
如果把sqlite3.c 也加入项目中话,就不依赖sqlite3.dll了,发布时可以不带上dll,
当然编译出来的exe会比较大。
余下的就按照你搜到的那些资料照着做吧。顺带一提的是sqlite的数据库扩展名可以自己定义,通常用.db3或.db,也可以不指定扩展名。再一个需要注意的是utf8的转换。
如果不带sqlite3.c 则是要用到sqlite3.lib
做个示例给你瞅瞅(别照抄,看懂用法自己改一下),
压缩包里带上了转换好cb专用的sqlite3_for_bcb.lib
import comment (lib,"sqlite3_for_bcb.lib") 就行了

不过示例中不使用lib和dll,直接把sqlite3.c编译进去项目了
http://pan.baidu.com/s/1ntseyxj
// 打开数据库
// #define SQLITE_DB_PATH "XX数据库.db"
// sqlite3* sl3 = NULL;
result = sqlite3_open(SQLITE_DB_PATH,&sl3);

// 执行查询
// LoadDb是个回调函数,组织数据的逻辑放在回调函数里
// _sql 是sql语句
// srrMsg 是错误信息(如果无错则为空)
result = sqlite3_exec(sl3, _sql, LoadDb, NULL, &errMsg);

就那么简单,cb里用sqlite感觉比vc还方便,不用配置,c代码也能直接编译

Borland C++ Builder 中的 Windows 子类化

【中文标题】Borland C++ Builder 中的 Windows 子类化【英文标题】:Windows Subclassing in Borland C++ Builder 【发布时间】:2009-02-09 10:55:04 【问题描述】:

我们正在尝试将一段使用 CWnd.SubclassWindow 方法在 MFC 中编写的 C++ 代码转换为 Borland C++ Builder 代码。有谁知道如何进行子类化(使用 TForm 对象进行子类化) - 我们完全陷入困境。任何指针将不胜感激!蒂亚!

具体说明:

我们有一个现有的用 Borland C++ 编写的基类,它继承自 TForm,它用于为从它继承的所有表单赋予某种外观和感觉(例如,它处理 WM_NCPAINT 和 WM_NCHITTESTheavily)。

现在我们想使用此代码为用其他语言(确切地说是 MSVC++/MFC 和 C#)编写的表单提供相同的外观和感觉。

我们认为使用 Windows 子类化将是一个好主意,而不是重写所有代码。然后我们可以将所有现有的和经过测试的代码填充到一个 DLL 中,然后只需使用 hWnd 调用它,该窗口就会自动获得新的外观和感觉。

究竟为什么这是不可能的,我真的不能说——我自己不使用 Borland C++ 编写代码。我只用了几分钟就在 MFC 中编写了一个存根,向 Borland C++ 开发人员展示了我想要什么,他们花了几天时间试图模仿 MFC 的 CWnd::SubclassWindow 方法,但没有成功。

据我了解,问题在于当您执行“new TForm()”时,会在您有机会停止之前自动创建一个新窗口。所以替换然后 WindowProc works 但是一个不需要的 TForm 窗口在屏幕上浮动,没有用!!!!

【问题讨论】:

你真的是指 Borland 必须在 10 多年前停止销售和支持的 OWL 吗? 嗯,我以为它被称为... MFC中的代码行... 【参考方案1】:

我假设你的意思是 VCL。您可以将 TControl 对象的 WindowProc 属性设置为您自己的窗口过程或其他控件的 WindowProc。

编辑:更多答案,基于更多细节

为防止new TForm 创建一个窗口在屏幕上无用地浮动,您只需要将其 Visible 属性设置为 false。或者,您可以覆盖 CreateParams 以从窗口中删除 WS_VISIBLE 样式:

void __fastcall TBlahForm::CreateParams(TCreateParams &Params)

    TForm::CreateParams(Params);
    Params.Style&=~WS_VISIBLE;

//---------------------------------------------------------------------------

仍然会创建一个不可见的窗口,但据我了解用例,这应该没什么大不了的。

覆盖TCustomForm::CreateWnd 可能是解决相同问题的另一种方法。

我的另一个建议是将代码从 BCB 移植到 VC++。如果它对WM_NCPAINTWM_NCHITTEST 进行了很多处理,那么其中包含大量VCL 特定的东西听起来不太可能——它可能只是直接敲击Win32 API?如果里面没有任何 VCL,那么在 VC++ 中编译应该可以神奇地工作。

无论如何:这几乎肯定是可能的。我有一个用 BCB5(早于 WinXP)构建的应用程序,通过巧妙地使用窗口挂钩、子类化等(其中大部分不是我自己的)仍然非常乐意处理 XP 甚至 Aero(这不是说维护并不痛苦)。如果这是可能的,你的应用程序当然应该是。 VCL 遵循与 MFC 不同的范式,但它仍然很灵活。

【讨论】:

我无法将我的答案塞进 300 个字符的评论中,所以我编辑了原来的问题! 非常感谢您的回答!!!但是,我查看了代码并重新编译到 MSVC++ 是我真正想要避免的事情。除此之外,它还有将近100个小位图资源,恐怕我必须手动添加。 叹息【参考方案2】:

查看Codegear Online Docs,它描述了用于子类化的 WindowProc 机制。

C++Builder 使用底层的 Delphi VCL,因此搜索“Delphi Window subclassing”将比试图找到专门的 C++ 更富有成效。 C++Builder 程序员必须至少能够阅读 Delphi 代码,即使他们不必编写任何代码!

【讨论】:

寻找 Delphi 示例听起来不错,谢谢! :-) (你发给我的例子恐怕不适用,因为我想子类化一个已经由另一个应用程序创建的窗口,尽管在同一个进程中)。

以上是关于SQLite在C++ Builder里怎么用的主要内容,如果未能解决你的问题,请参考以下文章

c++ builder 鼠标移开窗体时的事件

怎么查看用C++ builder编写的程序都调用了哪些dll文件,谢谢!

oracle forms builder里SET_BLOCK_PROPERY是干啥用的?怎么用

我想问一下,怎么导出SQlite数据库sql脚本啊,用C++实现

C++ Builder托盘控件

如何逐条读出文件中的sql语句并且在sqlite3中批量执行 c、C++都可以