救命啊!!!数据库开发高手请救命!!!

lzzqqq 2008-01-11 02:53:09
//我的DBF文件test.dbf在C:\\test\\001目录下.
//我按正常的逻辑创建ODBC连接,对test表进行插入或删除操作,然后关闭数据库,删除ODBC连接.
//可为何以下代码执行完后,C:\\test\\001目录无法删除呢?
//望高手速解决,立即给分,急! (不要改ODBC驱动!)

#include <afxdb.h>
#include <odbcinst.h>

void CTestDlg::OnButton1()
{
//创建ODBC DSN
CString strDriver="Microsoft dBase Driver (*.dbf)";
CString strPath="C:\\test\\001";
CString strAttrib;
strAttrib.Format("DSN=MYDBF;DefaultDir=%s;DriverId=%s;FIL=%s",strPath,"277","dBase IV; ",strPath);
char szAttrib[MAX_PATH];memset(szAttrib,0,MAX_PATH);
for(int i=0;i<strAttrib.GetLength();i++)
{
char c=strAttrib.GetAt(i);
if (c==';') continue;
szAttrib[i]=c;
}
SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,strDriver,szAttrib);

//打开表
CDatabase db;
db.OpenEx("DSN=MYDBF",CDatabase::noOdbcDialog);
db.ExecuteSQL("delete from test");
db.Close();

//删除ODBC 中的DSN
SQLConfigDataSource(NULL,ODBC_REMOVE_SYS_DSN,"Microsoft dBase Driver (*.dbf)","DSN=MYDBF");
}
...全文
189 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
有问题请先GOOGLE,BAIDU
UltraBejing 2008-04-30
  • 打赏
  • 举报
回复
接分是王道!
lzzqqq 2008-02-25
  • 打赏
  • 举报
回复
郁闷,裸机的ODBC驱动中,DBF数据库的驱动不支持长文件名,如 Create I_WANT_FUCK_DBF(CHAR(100)) 是不行的,结果只能生成出 I_WANT_F.DBF这个文件(只支持8位文件名)
用Borland的BDE升级了DBF驱动后,虽然能正确地执行上面的SQL语句了.但又出这个问题.
因为我是需要生成几千个目录的中的数据库的,现在输出到2400多个目录时,系统就出错了.可能是打开的文件句柄占用太多的事.
在任务管理器里能看到文件句柄数持续上升...
jsjszg 2008-02-21
  • 打赏
  • 举报
回复
你好,我也遇到了这个问题。前段时间没有问题,文件夹可以删除,但最近开始也无法删除了。无从下手。不知道你解决了没?能共享下你 是 怎么解决的吗?
jxufeng 2008-01-15
  • 打赏
  • 举报
回复
用ado试一试,这样不需要建立odbc的dsn,也许就行了呢?!
但是我遇到了一些奇怪的问题,比如某些表打不开等等!
还可以读文件的方式,具体的代码你可以到网上搜读shape文件的源代码,里面有文件读写dbf的方法。
zhoujianhei 2008-01-15
  • 打赏
  • 举报
回复

同样的代码为什么我的可以完全删除啊,是不是有其它地方使用了这个文件?
另外在
//删除ODBC 中的DSN
SQLConfigDataSource(NULL,ODBC_REMOVE_DSN,"Microsoft dBase Driver (*.dbf)","DSN=MYDBF");
这句执行失败后,仍然可以正常删除。
内存泄漏 2008-01-11
  • 打赏
  • 举报
回复
怪就怪在他在裸机上试没有问题..
jameshooo 2008-01-11
  • 打赏
  • 举报
回复
程序中有没有SetCurrentDirectory或者cd之类的调用导致占用了文件夹?
shakaqrj 2008-01-11
  • 打赏
  • 举报
回复
单单执行drop也不行??
fanerde 2008-01-11
  • 打赏
  • 举报
回复
学习.
内存泄漏 2008-01-11
  • 打赏
  • 举报
回复
晕..我这只有ACCESS, 可能有差别吧...
lzzqqq 2008-01-11
  • 打赏
  • 举报
回复
我刚在裸机上试了一下也可以,看来是Borland BDE的 DBF驱动有问题.
lzzqqq 2008-01-11
  • 打赏
  • 举报
回复

泄漏兄,不太可能吧?
你试一下下面代码,执行完后先不关程序,应该能在 c:\test\001目录下看到 I_WANT_FUCK_DBF.DBF表,
然后就无法删除c:\test\001目录了,郁闷哪,难道你那儿可以?

#include <afxdb.h>
#include <odbcinst.h>

void CTestDlg::OnButton1()
{
//为何以下代码执行完后,C:\\test\\001目录无法删除呢?

//创建ODBC DSN
CString strAttrib="DSN=MYDBF;DefaultDir=C:\\test\\001;DriverId=277;FIL=dBase IV;";
char szAttrib[MAX_PATH];memset(szAttrib,0,MAX_PATH);
for(int i=0;i<strAttrib.GetLength();i++)
{
char c=strAttrib.GetAt(i);
if (c==';') continue;
szAttrib[i]=c;
}
BOOL b=SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft dBase Driver (*.dbf)",szAttrib);

//打开表
CDatabase db;
db.OpenEx("DSN=MYDBF",CDatabase::noOdbcDialog);

try{db.ExecuteSQL("DROP TABLE I_WANT_FUCK_DBF");}
catch (CException* e) {}
db.ExecuteSQL("CREATE TABLE I_WANT_FUCK_DBF(NAME CHAR(20))");
db.ExecuteSQL("INSERT INTO I_WANT_FUCK_DBF(NAME) VALUES('FUCK')");

db.Close();

//删除ODBC 中的DSN
SQLConfigDataSource(NULL,ODBC_REMOVE_DSN,"Microsoft dBase Driver (*.dbf)","DSN=MYDBF");
}
内存泄漏 2008-01-11
  • 打赏
  • 举报
回复
程序调用 SetCurrentDirectory("C:\\"); 试试..
lzzqqq 2008-01-11
  • 打赏
  • 举报
回复
程序中根本没其他地方用这个目录,如果只执行 Create Table命令完后,可以删除001目录.
但要是执行 Drop table 或 Insert语句后,这个001目录就无法删除了,虽然db.close了,但只要程序不关闭这个001目录就无法删除!!
郁闷啊,这个问题都弄了两天了,还是没找到根本原因和解决方法.唉!!
shakaqrj 2008-01-11
  • 打赏
  • 举报
回复
那是其他地方问题了?
内存泄漏 2008-01-11
  • 打赏
  • 举报
回复
怪了,我按你的代码写的程序没有这个问题啊,exe不退出,目录可以删除..
shakaqrj 2008-01-11
  • 打赏
  • 举报
回复
1.其他地方在用,你程序的其他地方?
检查的方法就是把数据库操作全部注释掉,只留下删除目录
2.会不会你让他断开删除,他却不立刻执行?
无责任猜想 - -|||
lzzqqq 2008-01-11
  • 打赏
  • 举报
回复
唉!各位仁兄,换成用户DSN也不行.如果我的程序一直开着,我想手动删除 C:\test\001目录时就提示:

无法删除001:文件正在被另一个人或程序使用.
关闭任何可能使用这个文件的程序,重试一次.
zhoujianhei 2008-01-11
  • 打赏
  • 举报
回复
使用用户DNS试试。
加载更多回复(3)

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧