关于文件打开GetOpenFileName和sqlite3_preprare的有关问题
关于文件打开GetOpenFileName和sqlite3_preprare的问题
本人最近在做一个VC项目需要用到sqlite3数据库和EXCEL功能,所以采用GetOpenFileName打开文件方式。本来是先打开excel文件取出内容释放excel再读取sqlite3数据库中的数据进行对比。最后发现sql语句运行到sqlite3_preprare这一句是产生了SQLITE_ERROR(第一个错误 SQL error or missing database这里的错误是sql语句错误或数据库丢失),但是我单调过只要不执行GetOpenFileName这条语句sqlite一切都正常所以不可能是sql语句错误,而且我打开excel取得数据之后也有对excel内容进行释放。请各位大神帮我看下为什么打开excel文件后会出现sqlite3错误的问题。
以下是打开excel文件的代码:
释放excel资源的代码:
sqlite3读取数据代码(其中在sqlite3_prepare位置出错返回值为1)
------解决方案--------------------
可能是当前目录改变了,调用GetOpenFileName前先用GetCurrentDirectory获取当前目录,调用GetOpenFileName后再用GetCurrentDirectory获取当前目录,看下是否一致,如果不一致用SetCurrentDirectory设置回去试试。
本人最近在做一个VC项目需要用到sqlite3数据库和EXCEL功能,所以采用GetOpenFileName打开文件方式。本来是先打开excel文件取出内容释放excel再读取sqlite3数据库中的数据进行对比。最后发现sql语句运行到sqlite3_preprare这一句是产生了SQLITE_ERROR(第一个错误 SQL error or missing database这里的错误是sql语句错误或数据库丢失),但是我单调过只要不执行GetOpenFileName这条语句sqlite一切都正常所以不可能是sql语句错误,而且我打开excel取得数据之后也有对excel内容进行释放。请各位大神帮我看下为什么打开excel文件后会出现sqlite3错误的问题。
以下是打开excel文件的代码:
int Excel::Excelopen()
{
ZeroMemory(&ofn, sizeof(ofn));
szBuffer = new TCHAR[MAX_PATH*sizeof(TCHAR)];
szBuffer[0] = NULL;
static const TCHAR szFilter[]
= TEXT("Excel Files (*.xls)\0*.xls"); //加\0限定只识别.xls文件
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = NULL;//g_hWnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.lpstrFile = szBuffer;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = TEXT("请打开Excel文件");
ofn.Flags = OFN_HIDEREADONLY;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = TEXT(".xls");
ofn.lCustData = 0L;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
//return 1;
return GetOpenFileName (&ofn); // user specified a file
}
释放excel资源的代码:
void Excel::Excelclose()
{
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();
delete covOptional;
}
sqlite3读取数据代码(其中在sqlite3_prepare位置出错返回值为1)
bool Csqlite::Readfromdb()//
{
CString sql;
// err_msg = new char[100];
//memset(err_msg,0,100);
char *err_msg;
char *tmp_char;
Source src_tmp;
if (sqlite3_open("source.db", &con)!=SQLITE_OK)
{
return FALSE;
}
sql = "select * from source";
if (sqlite3_prepare(con, sql, -1, &stmt, NULL)!=SQLITE_OK)
{
sqlite3_finalize(stmt);
}
else
{
while (sqlite3_step(stmt)==SQLITE_ROW)
{
src_tmp.name = sqlite3_column_text(stmt, 0);
src_tmp.cmd = sqlite3_column_text(stmt, 1);
myList.AddTail(src_tmp);
}
sqlite3_finalize(stmt);
}
sqlite3_close(con);
return TRUE;
}
------解决方案--------------------
可能是当前目录改变了,调用GetOpenFileName前先用GetCurrentDirectory获取当前目录,调用GetOpenFileName后再用GetCurrentDirectory获取当前目录,看下是否一致,如果不一致用SetCurrentDirectory设置回去试试。