数据库(sql server)使用及其中遇到的问题

由于项目需要,需要在windows平台上连接sql server,于是就学了一下,在其中遇到了一些问题,现在自己总结一下.

总结如下:

首先,我们需要连接数据库:

#include "stdafx.h"
#include <windows.h>  
#include <sqltypes.h>  
#include <sql.h>  
#include <sqlext.h>

#import "c:\program files\common files\system\ado\msado15.dll"  no_namespace rename("EOF", "adoEOF")(这个必须导入)

以上是包含windows的头文件,并且引入ado所需的dll文件,后面是不引用命 名空间,并且改变EOF和BOF的声明,防止冲突。

_ConnectionPtr pConnection;//连接指针

_CommandPtr pCmd;//命令指针

_RecordsetPtr pRecord;//结果集指针

long m_row_count=0;

long m_col_count=0;

1.bool connect()

{

    HRESULT Hr = ::CoInitialize(NULL);   //这句话必须添加,否则创建实例会失败(要成功使用ADO,需要先初始化COM)

    HRESULT hr;

    hr = m_pConnection.CreateInstance(_uuidof(Connection));

    _bstr_t strConnect = "Driver={sql server};server;uid;pwd;database;";

    if(SUCCEEDED(hr))

   {

    m_pConnection->ConnectionTimeout = 0;

    hr = m_pConnection->Open(strConnect,"","",adModeUnknown);

    if(SUCCEEDED(hr))

   { 

    m_pCommand.CreateInstance(__uuidof(Command));

    m_pCommand->CommandTimeout = 5;

    m_pCommand->ActiveConnection = m_pConnection;

    return TRUE;

  }

   else

  {

    return FALSE;

  }

}

OutputDebugString("创建实例失败");

return FALSE;

}

server uid;pwd;database:这四个是我们要填的四个参数,即是ip地址,用户名,密码,数据库名字。

2.查找表:

HRESULT hr = m_pRecord.CreateInstance(__uuidof(Recordset));

hr = m_pRecord->Open(esqlexitdata.c_str(),

        m_pConnection.GetInterfacePtr(),  

        adOpenStatic,

        adLockOptimistic,

        adCmdText);

m_row_count = m_pRecord->GetRecordCount();   //记录即行数(如果参数是adOpenDynamic,得到记录会是-1

m_col_count = m_pRecord->GetFields()->Count;   //列数

3.关闭数据库和结果集

这个pRecord->Close()是用来关闭结果集的,但是如果没有结果集,那么关闭会报错。

pConnection->Close()是关闭数据库连接的;如果没有连接数据库就关闭会报错

m_pRecord->GetRecordCount()这个函数得到的函数有可能不准,可以用下面这个方法:

while(!m_pRecord->adoEOF)   //这个就是前面#import导入语句的作用

    m_row_count++;  

    m_pRecord->MoveNext();

4.在这个期间,遇到的一个奇怪问题,在自己的电脑上,写了一个exe应用程序,运行代码,没有什么问题,把编译出来的dll程序拷贝到另一个电脑进行测试,其它的一个exe应用程序调用这个总是dump,具体现象就是会报告:故障模块名称:MSVRC100.dll,一开始以为是这个dll问题,于是把本地电脑上的MSVRC100.dll拷贝过去,现象是一样的,试了很多方法,都不行,但是在本地电脑上是好的(现在知道是因为本地连接数据库网络信号相对计较好,不容易出现),感觉很懵逼,最后不知道怎么突然想到是不是数据库的问题,为了验证这个问题,做了好多次尝试,总结出是网络信号不好,导致数据库刚开始连接成功后,在后面操作数据表时,像这种m_pRecord->MoveNext();语句,m_pRecord有可能会变为NULL空指针。知道原因之后,操作时,先判断数据库连接是否成功,不成功,重新建立连接,现在这个现象没有再复现,在整个过程中,遇到很多其它小问题,下次再把细节总结一下。由于本人以前没有搞过数据库,从这里学到了很多,在这里也感谢我的导师提供的帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您的SQL Server数据库发生卡顿,可以尝试以下方法解决问题: 1. 检查系统资源是否紧张。如果内存或CPU使用率很高,则需要进行资源加倍或优化查询来释放资源。 2. 检查是否存在长时间运行的查询。使用SQL Server管理工具(例如SQL Server Management Studio)可以查看正在运行的查询,并分析是否需要优化。 3. 检查系统日志,了解是否存在任何故障或错误信息。 4. 在生产环境,应安装最新的服务包和修补程序,以避免可能导致卡顿的已知问题。 5. 如果仍然无法解决问题,则可能需要与数据库管理员或技术支持人员联系,获取进一步的帮助。 ### 回答2: SQL Server数据库卡顿的问题在实际应用经常会遇到,以下是处理这种问题的一些建议。 首先,可以通过查看系统资源利用情况来确定数据库卡顿的具体原因。可以使用Windows任务管理器或SQL Server自带的性能监视工具来查看CPU、内存和磁盘IO等指标的使用情况,以确定是否出现资源瓶颈。 其次,可以通过优化查询语句和索引来提升数据库性能。可以使用SQL Server提供的执行计划分析工具来查看查询语句的执行计划,并根据建议进行优化操作,如增加索引、重新编写查询语句等。 另外,可以设置适当的数据库参数来调整性能。例如,可以调整最大内存使用量、最大并发连接数、日志文件大小等参数,以提高数据库的性能。 此外,可以对数据库进行定期的维护和优化操作。可以通过执行数据库备份、重建索引、压缩数据库等操作来清理和优化数据库,从而提高其性能。 还可以考虑将数据库文件和日志文件分散到不同的物理磁盘上,以减轻IO负载。 最后,可以考虑升级硬件和调整服务器配置以提高数据库性能。例如,可以增加更高性能的CPU和内存、使用更快的磁盘阵列等,以满足数据库的需求。 总之,处理SQL Server数据库卡顿的问题需要综合考虑系统资源、查询语句、索引优化、数据库参数设置、定期维护等多个方面。通过适当的优化和调整,可以提高数据库的性能,解决卡顿问题。 ### 回答3: 处理SQL Server数据库卡的问题可以从以下几个方面着手: 1. 优化查询语句:检查慢查询语句,使用合适的索引、避免全表扫描等方式来提高查询效率。 2. 优化数据库结构:检查表的设计,合理拆分大表、选择合适的数据类型、规范化数据库等,以提高数据库的性能和可维护性。 3. 调整数据库配置:根据服务器的配置和负载情况,调整SQL Server的参数设置,例如内存、并发连接数、最大请求等,以提升数据库的性能。 4. 监控数据库性能:使用SQL Server Profiler工具或系统监控指标来监测数据库的性能,及时发现异常和瓶颈,并采取相应的措施进行优化。 5. 清理不必要的数据和日志:删除过期或无用的数据,定期备份和清理事务日志,以释放存储空间和提高数据库的性能。 6. 定期维护数据库:执行数据库维护任务,如索引重建、统计信息更新数据库收缩等,以减少数据库碎片和提升查询性能。 7. 调整服务器硬件:如果数据库性能问题无法通过优化软件来解决,可以考虑升级服务器硬件,增加内存、CPU或存储空间等来提升数据库性能。 8. 使用缓存和缓存技术:通过引入缓存层、使用缓存技术如Redis等,可以减少对数据库的访问,提高系统的响应速度。 综上所述,处理SQL Server数据库卡的问题需要从多个方面综合考虑,包括优化查询、数据库结构、配置、清理数据、监控性能、维护数据库、硬件升级和使用缓存等。通过系统地分析和优化,可以提高数据库的性能和可靠性,有效解决卡顿问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值