VC+ODBC删除EXCEL一行记录出现有关问题
VC+ODBC删除EXCEL一行记录出现问题?
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile,sPath;
//获取主程序所在路径,存在sPath中
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
sFile = sPath + "\\Demo.xls"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
// 设置删除记录的语句
// sSql = "DELETE FROM [Sheet1$] WHERE 学号=110101171";//(1)
sSql="UPDATE [Sheet1$] SET 学号=100 WHERE 学号=110101171";//(2)
database.ExecuteSQL(sSql);
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
错误分析:
1、若用语句(1)那么会出现错误:无法从指定数据表中删除。查找原因发现是:http://topic.****.net/u/20080116/20/4eb4553c-24e2-4178-bd02-2b6adb520d98.html。因为Excel工作表中的行与真正的关系型数据库的行是有些不一样的,所以如果通过编程来访问Excel工作表的数据,那么检索,插入,更新应该是没有问题的,但要是删除的话,就会有一些限制。
2、采用1中所附帖子的方法利UPDATE语句更新,只不过把要删除的那行所有字段值赋值为NULL。类似这样的写法:
UPDATE dept$@hsxls_link SET NAME = NULL, dept_no = NULL WHERE dept_no = 3;
当然,你要知道的是,这一行并没有真正删除掉,所以通常在select的时候要进行一定的筛选,例如:
SELECT * FROM dept$@hsxls_link WHERE dept_no IS NOT NULL;
这也就是上面的语句(2) 。。。。。但运行报错:操作必须使用一个可更新的查询
请教!!!
------解决方案--------------------
链接字符串出现问题,
楼主怎么不直接用ADO访问阿
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile,sPath;
//获取主程序所在路径,存在sPath中
GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
sPath.ReleaseBuffer ();
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
sFile = sPath + "\\Demo.xls"; // 将被读取的Excel文件名
// 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)"
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
// 没有发现Excel驱动
AfxMessageBox("没有安装Excel驱动!");
return;
}
// 创建进行存取的字符串
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY
{
// 打开数据库(既Excel文件)
database.Open(NULL, false, false, sDsn);
// 设置删除记录的语句
// sSql = "DELETE FROM [Sheet1$] WHERE 学号=110101171";//(1)
sSql="UPDATE [Sheet1$] SET 学号=100 WHERE 学号=110101171";//(2)
database.ExecuteSQL(sSql);
// 关闭数据库
database.Close();
}
CATCH(CDBException, e)
{
// 数据库操作产生异常时...
AfxMessageBox("数据库错误: " + e->m_strError);
}
END_CATCH;
错误分析:
1、若用语句(1)那么会出现错误:无法从指定数据表中删除。查找原因发现是:http://topic.****.net/u/20080116/20/4eb4553c-24e2-4178-bd02-2b6adb520d98.html。因为Excel工作表中的行与真正的关系型数据库的行是有些不一样的,所以如果通过编程来访问Excel工作表的数据,那么检索,插入,更新应该是没有问题的,但要是删除的话,就会有一些限制。
2、采用1中所附帖子的方法利UPDATE语句更新,只不过把要删除的那行所有字段值赋值为NULL。类似这样的写法:
UPDATE dept$@hsxls_link SET NAME = NULL, dept_no = NULL WHERE dept_no = 3;
当然,你要知道的是,这一行并没有真正删除掉,所以通常在select的时候要进行一定的筛选,例如:
SELECT * FROM dept$@hsxls_link WHERE dept_no IS NOT NULL;
这也就是上面的语句(2) 。。。。。但运行报错:操作必须使用一个可更新的查询
请教!!!
------解决方案--------------------
链接字符串出现问题,
楼主怎么不直接用ADO访问阿