2 allesa allesa 于 2015.07.21 17:58 提问

关于VS2005对SqlServer数据库操作的问题

对数据库Student进行查询时运行到msado.tli文件中的下面这个函数中的raw_Open时就崩溃掉。

 inline HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options ) {
    HRESULT _hr = raw_Open(Source, ActiveConnection, CursorType, LockType, Options);
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
    return _hr;
}

调用代码:

        CString strsql = _T("select * from LoginInfo where Name='");
        strsql+=name;
        strsql+="' and Password='";
        strsql+=psw;
        strsql+="'";
        MessageBox(hwnd, strsql, _T("查询字符串"), MB_OK);
        CString strcolumn[6] = {_T("Name"),_T("Sex"),_T("Password"),_T("School"),_T("Major"),_T("Number")};
        int ncolumn = 6;
        CStringArray strvalue;
        theApp.m_dao.GetData(strsql,strcolumn,ncolumn,strvalue);
 BOOL CDao::GetData(CString strSql,CString *strQueryCloum,int nCloumNum,CStringArray& strDataValue)
{
    HRESULT het;
    //_bstr_t    字符串          _variant_t 多种数据类型集合 vt类型   ..value值                               //com
    _bstr_t bstrSql = strSql;               //执行sql
    _bstr_t bstrConnect = m_strConnect;     //连库串
    _bstr_t bstrQueryCloum;                 //列名

    Fields *fields;
    FieldPtr fieldPtr;

    CString strValue;
    _variant_t varBLOB;
    try
    {
        //1.打开表
        /*m_pRecordset->Open(查询SQL语句,连接串,打开方式,数据源更新时如何锁定结果集,以什么形式传入)
            打开方式:
            adOpenUnspecified = -1,  默认的方式打开
            adOpenForwardOnly = 0,    向前移动的游标打开
            adOpenKeyset = 1,         以键值打开
            adOpenDynamic = 2,        当你添加数据时别人也有可能往这个表添加数据,谁在前谁添加到前面(多人用数据库时)
            adOpenStatic = 3          别人也想往里面添加数据一直停留在打开时候

            锁定结果集方式:
            adLockReadOnly = 1,         只读的不能改变数据
            adLockPessimistic = 2,       (保守式锁定)逐个 – 编辑时立即锁定数据源的纪录
            adLockOptimistic = 3,        (开放式锁定)逐个 – 只在调用update方法时才锁定纪录
            adLockBatchOptimistic = 4     开方式 可以更新一批数据更新模式
            +       bstrConnect {"Driver={SQL Native Client};Server=192.168.1.92,2433;Uid=sa;Pwd=sa;Database=colin0716" (1)}    _bstr_t
            +       bstrSql {"select * from student" (1)}   _bstr_t

        */
        het = m_pRecordset->Open(bstrSql,bstrConnect,adOpenDynamic,adLockOptimistic,adCmdText);
        if (!SUCCEEDED(het))
        {
            AfxMessageBox(_T("打开表失败"));
            m_strErrorMsg = _T("查询表失败");
            return FALSE;
        }
        //循环结果
        while(!m_pRecordset->ADOEOF)
        {
                        //按行遍历
            for(int i=0;i<nCloumNum;i++)
            {
                bstrQueryCloum = strQueryCloum[i];
                fields = m_pRecordset->GetFields(); //fields 结果集中的字段集合。由于一行记录中可以包含多个字段,因此fileds属性是一个数组形式,数组中每一个元素代表一个字段

                fieldPtr = fields->GetItem(bstrQueryCloum);//field对象表示记录集中数据的某个单独的列。

                varBLOB = fieldPtr->GetValue();//获得当前列的值

                //long nSize =fieldPtr->ActualSize;


                //注意图片名称必须为图片流的前一个字段
                //strValue = DataToCStringType(varBLOB,nSize,strValue);
                strValue = DataToCStringType(varBLOB);
                strDataValue.Add(strValue);
                //varBLOB.Detach();
            }
            m_pRecordset->MoveNext();
        }

        m_pRecordset->Close();
    }
    catch(_com_error *e)
    {
        m_strErrorMsg = e->ErrorMessage();
        AfxMessageBox(e->ErrorMessage());
    }

    return TRUE;
}

那个_hr是总是返回E_FAIL,然后return的时候就崩溃掉。
这几天在写一个对数据库操作的项目,但是这几天被这个问题给卡住了,实在是找不到如何解决了,还请各位大神指点迷津。图片说明

3个回答

oyljerry
oyljerry   Ds   Rxr 2015.07.21 18:45
已采纳

主要是你的数据库连接字符串,有两种类型,你选择你对应的

 //设置连接字符串
 //一个是数据库身份验证
_bstr_t strConnect = "Provider=SQLOLEDB.1;Data Source=ZHOUWEI\\MYSQL;Initial Catalog=AMS;User ID=sa;PWD=123456";
 //下面是Windows身份验证方式
_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security = SSPI;Persist Security Info = FALSE;Data Source=WANGLIANG\\SQLEXPRESS;Initial Catalog=ADODemo"; 
allesa
allesa 果然是我的连接串的问题,错把SQL Server 写成了Native Client,还有SQL Server的端口写错了,太大意了,下次一定吸取教训,谢谢。
2 年多之前 回复
allesa
allesa   2015.07.21 18:00

求大神帮忙,小女子不胜感激。

caozhy
caozhy   Ds   Rxr 2015.07.21 18:25

连接字符串有问题,或者sql有问题。

检查连接字符串,驱动、用户名、密码、数据库文件路径
sql字符串的拼接

Csdn user default icon
上传中...
上传图片
插入图片