我工作用的计算机是32位的intel cpu,最近要用虚拟机安装64位的操作系统,本来以为是不可能解决的问题,没想到intel有一种技术叫Virtualization Technology,可以解决此问题,只要将BIOS里的VT选项打开,即可以在32位机器上正常安装64位的操作系统了。
How to avoid “Error writing output file” in C++ Builder 6
在C++ Builder6编译程序的时,有时会出现”Error writing output file”的错误,通常情况下,是由于某个OBJ文件或者TDS文件被锁定(如属性是只读,或者被其他程序使用),解决方法也很简单,直接删除掉这些文件即可,如果删不掉的话,那就先关闭C++ Builder或者其他应用程序再试。
How to avoid E2015 Ambiguity between ‘ULONG_PTR’ and “Wmplib_tlb::ULONG_PTR’
近日在程序里引用了windows media player组件,编译程序报了E2015的错。
E2015 Ambiguity between ‘ULONG_PTR’ and “Wmplib_tlb::ULONG_PTR’
解决方法很多,个人觉得最一劳永逸的方法是直接修改Wmplib_tlb.h,把里面所有的Wmplib_tlb::ULONG_PTR全部替换为ULONG_PTR
注:此问题只存在于在C++Builder中导入Windows Media Player时,其他情况下不一定会发生。
Tips about calling stored procedure from Oracle pro*c
今天写一个测试程序,实验一下在pro*c里面调用存储过程,程序写好之后,发现预编译总是报错,错误代码是PCC-S-02022和PCC-F-02102,这两个错误看起来跟连锁错误一样。后来发现有如下几点需要注意的:
1、END-EXEC和END_EXEC
有部分教材的代码上写的是END_EXEC,不知道是不是教材陈旧,还是印刷错误,反正我查证之后发现应该写成END-EXEC才对。
2、proc编译选项
这个很重要,我曾经被次困扰了很长时间,我现在使用的选项如下
proc iname=test.cp include=./include userid=test/123456 mode=ansi code=ansi_c parse=full dynamic=ansi type_code=ansi ltype=none sqlcheck=full
其中sqlcheck=semantics也可以。但一定要保证userid的选项正确填写,否则肯定报错。
SQLITE3的C++简单封装类
几年前写过一个简单的sqlite3读写,非常简陋,bug在所难免,旨在给初学者一点帮助,欢迎高手交流
// mySQLITE3.hpp
// 该文件在visual c++ 6.0和c++ builder 6.0上均编译通过,在我自己的程序上运行好几年了
#ifndef __MY_SQLITE3_HPP__
#define __MY_SQLITE3_HPP__
#include "sqlite3_lib\sqlite3.h"
#ifdef
//---------------------------------------------------------------------------
class TMySQLite3
{
private:
sqlite3* _db; // 数据库实例
char* _errmsg; // 错误信息
char** _dbResult; // 记录集
public:
TMySQLite3() { _db=NULL; _errmsg=NULL; }
// 释放时,要先释放表并关闭数据库
~TMySQLite3() {
if (_dbResult) {
sqlite3_free_table(_dbResult);
}
if (_db) {
sqlite3_close(_db);
}
}
// 打开数据库
bool OpenDB(char* FullDBPath) {
int result = sqlite3_open(FullDBPath, &_db);
if (result!=SQLITE_OK) return false;
return true;
}
// 取数据记录
char** FetchRecord(char* SQL, int* Row, int* Col) {
int result = sqlite3_get_table(_db, SQL, &_dbResult, Row, Col, &_errmsg);
if (result==SQLITE_OK) return _dbResult;
else return NULL;
}
// 释放记录集
void FreeRecord() {
sqlite3_free_table(_dbResult);
_dbResult = NULL;
}
// 执行SQL语句
bool ExecSQL(char* SQL) {
int result = sqlite3_exec(_db, SQL, NULL, NULL, &_errmsg);
if (result!=SQLITE_OK) return false;
return true;
}
// 取得错误信息
char* GetMessage() {
return _errmsg;
}
};
#endif
下面是一段测试代码,Visual C++ 6.0的工程里面提炼出来的,供参考。
TMySQLite3 *pLite;
pLite = new TMySQLite3(); // 创建实例
// 打开数据库文件
if (pLite->OpenDB("E:\\task.db")==false) {
AfxMessageBox(pLite->GetMessage());
}
char** rs = NULL;
int nRow=0, nCol=0;
// 打开数据集
rs = pLite->FetchRecord("select * from t_task", &nRow, &nCol);
if (rs==NULL) AfxMessageBox(pLite->GetMessage());
else {
int nIndex=nCol;
// 循环输出每行数据
for (int i=0; i<nRow; i++) {
fprintf(stderr, "[%s]\t-\t[%s]\t-\t[%s]", rs[nIndex], rs[nIndex+1], rs[nIndex+2]);
nIndex += nCol;
}
pLite->FreeRecord();
}
if (pLite) {
delete pLite;
pLite = NULL;
}
t_task的建表脚本可以如下
CREATE TABLE t_task
(
taskid integer not null,
tasktitle varchar(255) not null,
tasktype char(2) not null,
taskdate char(8) null
)
CREATE UNIQUE INDEX idx_task ON t_task(taskid)


