执行一个sql语句,使用CDatabase类的,标准的处理方式,包括异常处理部分的代码。
还有,我发现,他的源码中,在发生错误时,抛出异常,但是没有释放掉::SQLAllocStmt(m_hdbc, &hstmt)分配的句柄,谁能解释一下。满意给分。

解决方案 »

  1.   

    没有出错,是运行久了,数据库会越来越慢,有时数据库会死掉,即使重新启动程序也是一样,使用的sqlserver数据库,代码很多,而且插库的数据量很大,每天估计80M,函数最终的调用的函数就是CDatabase::ExecuteSQL。
    基本上就是这样的,还有其他的非数据库的处理我省略掉了。
    try
    {
    m_pDatabase->ExecuteSQL(strSQL);
    }
    catch(CDBException* e)
    {
    e->Delete();
    }
    // sql语句是可定正确的
      

  2.   

    代码没有错误,是不是处理会有什么隐含的原因啊,如有什么句柄泄漏啊,还有是sqlserver系统性能降低的原因啊之类的,我看MFC的调用就是这样的。
      

  3.   

    换个数据库试试,譬如oracle, mysql, db2等,或者用db2的bridge,sqlserver有很多莫名其妙的地方,有一个数据中心三套sqlserver服务器,居然每个的行为都不一样。有时候性能相差5倍(软硬件环境相同)。最后换成两套db2就好了。
      

  4.   

    你的SQL中有没有存贮过程?,MS-SQL中有些小地方会导致数据库出现你所说的情况。
    你给出的代码是正确的,不是你给出的代码中的错误。
      

  5.   

    to CodePage(代码页):
    数据库是不能换的,我没有这个权力啊。
    to zyc(zir)
    没有存储过程.会不会跟他的文件空间有关系吗?我指定他分配的文件空间是自动增长的。会不会有影响啊。
      

  6.   

    sql server好象是会这个样子的,你可以到 管理 下面去看一下被锁住的进程ID,一般会越来越多的;重起也没有用,好等一段时间才能等它自动解锁的;用户越多,被锁住的也越多;建议对不同的用户使用不同的ID/PWD来登陆数据库,似乎好一点。
      

  7.   

    jiangping_zhu:
    SQL_SERVER自动增长不会形成大量浪费资源的情况,不用怀疑。
    按你给出的代码,看不出问题在什么地方。
    这样吧,你打开数据的监控器,看下系统的连接数、SQL的运行时间等。
    对啦,你的程序与数据库之间用什么方法连接的?
      

  8.   

    如果你是ODBC来连接的话,而且odbc的版本较早,或是SQL server的版本较老(6.5),可能会出现这个问题。这是因为odbc的一个选项配置的问题。如果选中这个选项,它会在tempdb中缓存你的sql语句,导致数据库变慢。新版本的odbc和SQL server好像已经没有这个选项了或是不能选择了。
      

  9.   

    m_db.BeginTrans();
    m_db.ExecuteSQL(sql);
    m_db.CommitTrans(); 
    这样试一下。
      

  10.   

    我用的是ODBC方式连接的,版本是7.0的,写库时,要求很高的,7.5秒插一批数据,估计有几百条,多的话可能有1000条。我看过连接数,连接就只有一个。其他的就不是我的了。当系统变慢时,(估计)10秒左右才插入一条记录。
    to leisureful(慢慢工作) :
    还有,如果采用事务方式处理,会快一点儿吗?
      

  11.   

    try
    {
    m_pDatabase->ExecuteSQL(strSQL);
    }
    catch(ComError* e)
    {
    e->Delete();
    }
      

  12.   

    估计你用的连接类型和数据库都有关系。如果有可能,最好改用SQL2000,因为你的数据量太大了,建议你用存贮过程完成数据更新工作。你每一次插入数据都重新从工程文件中设置一次SQL语句,这不是一种好办法。至于数据库连接,如果有可能,请用OLE-DB(ADO), 它会比ODBC快很多。当然,你也可以专门为这个工作写一个数据更新引擎。
    还有,我听人说,在SQL-server中,数据量大到一定规模,连Select都会慢很多,不光是Insert和Update。
      

  13.   

    个人见解:你在VC中的代码应该没错。
    至于性能下降,可能是数据库的管理及配置上。如:用户连接比较多,其它用户连接做耗时的查询,数据库太大了(应空闲时转移备份),或者磁盘空间受限,日志太大,导至数据管引擎执行变慢。
    对了,做一个对比试试验。程序变慢时,其它所有的环境保持不变,只重启VC程序,即重建一个数据库连接。看是否能变快。这样能有效定位故障的模块。
      

  14.   

    程序已经写好了,要换成ADO是代码要修改的太多了。
    to freelybird(阿愚) :
    我已经试过了,程序变慢时,程序从新启动,建立连接还是会变慢的。曾经数据库不是很大时发生过,后来增加了文件空间,好了一段时间,后来又出现那种情况了,问是不是跟自动增长有关系啊。
      

  15.   

    这里很多,看是否有合你意的http://www.vckbase.com/code/listcode.asp?mclsid=11&sclsid=1125
      

  16.   

    I'm not sure ...focus on this question
      

  17.   

    不要用MFC,自己用API函数,这样速度要快不少,我曾经也有这样的经历
      

  18.   

    to liushch(老牛):
    其实页差不多的,调用ExecuteSQL函数是不会要多少时间的,除非不需要他的那种安全判断。