VS2010MFC中ADO方式连接SQL Server2008学习心得

1,连接数据库:
这个也是在网上有各种各样的方法,包括直接连接或者用DNS连接,大家多去试试肯定会有一种能行,这里说我的:
比如我的程序名叫ma的一个对话框,那么在Cmaapp里面的initialize函数里面添加:
BOOL CmaApp::InitInstance()
{
    // 如¨?果?一°?个?运?行D在¨² Windows XP 上¦?的Ì?应®|用®?程¨¬序¨°清?单Ì£¤指?定¡§要°a
    // 使º1用®? ComCtl32.dll 版ã?本À? 6 或¨°更¨¹高?版ã?本À?来¤¡ä启?用®?可¨¦视º¨®化¡¥方¤?式º?,ê?
    //则¨°需¨¨要°a InitCommonControlsEx()。¡ê否¤?则¨°,ê?将?无T法¤¡§创ä¡ä建¡§窗ä¡ã口¨²。¡ê
    INITCOMMONCONTROLSEX InitCtrls;
    InitCtrls.dwSize = sizeof(InitCtrls);
    // 将?它¨¹设¦¨¨置?为a包㨹括¤¡§所¨´有®D要°a在¨²应®|用®?程¨¬序¨°中D使º1用®?的Ì?
    // 公?共2控?件t类¤¨¤。¡ê
    InitCtrls.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&InitCtrls);
    CWinApp::InitInstance();
//从这里开始时自己写的代码
    AfxOleInit();
    AfxEnableControlContainer();
    if(FAILED(::CoInitialize(NULL)))
    {
        AfxMessageBox(L"ADO初?始º?化¡¥失º¡ì败㨹");
        return 失效分析与预防false;
袁菲微博    }
    HRESULT hr;
    try
    {
        hr=m_con.CreateInstance("ADODB.Connection");
        if(SUCCEEDED(hr))
        {
            m_con->ConnectionTimeout=3;
            _bstr_t str;
            m_con->Open("Provider=SQLOLEDB;server=LIYI;Uid=sa;Pwd=libuyibu2332;Database=weist","","",adModeUnknown);
谷物大脑        }
    } 
    catch(_com_error e)
    {
        AfxMessageBox(L"数ºy据Y库a连¢?接¨®失º¡ì败㨹");
        return false;
    }
绿一行,为最重要的连接代码,其中provider就是数据库的提供者,我用sql 那么提供者
就是SQLOLEDB不用管版本的问题,第二个参数就是服务器嘛,我自己的电脑名字叫做LIYI那么我直接写就行了,要是用于网络通信肯定写数据库所在电脑的IP地址,比如本地当然就是127,0,0,1(好像是哈,要不是的话,烦请再去问问呗)接下来是登陆名和密码,就和我上次的文档《VS2010的ADO和ODBC方式连接sql 2008》(其中还把ODBC写成了OBDC)里说的一样,您需要在安装SQL 2008时选择混合模式,并且给sa用户设置密码,最后一个就是你的数据库的名字,比如我这里的weist数据库,最后是读写模式,我设置为缺省模式,也有读写模式,只读模式或者只写模式等。该代码在上述我说的VS2010MFC+SQL Server 2008连接通过,信誉保证!
另一个问题,就是有同学问我那么我不想要,在代码里面能够直接看到登陆名和密码怎么办,这个您可以进入下面的连接:
blog.csdn/zyq5945/article/details/5586423
他里面就写得很清楚了,呵呵。偷偷懒,自己去看吧!
2,获取表中项目条数,很多网上去问大家都说了很多方法,其中有SELECT COUNT FROM database(你的数据库),那么你执行了以后,怎么把这个条数取出来喃?
比如说ADO方式:
m_pRecordset =  m_pConnection->Execute("SELECT COUNT(*) FROM  database",&RecordsAffected,adCmdText); 
  _variant_t Count = m_pRecordset->GetCollect(short(0));///取得第一个字段的值放入vCount变量 
就行了
Int a=Count.ival; 就把值给了int变量 a;
也可以直接用如下代码获取:
Int count=theapp.m_recordset->GetRecordCount();
中国领导团队新阵容注意:这是在ADO方式下,我以前用ODBC方式的GetRecordCount()函数获得的数据往往是1,很多人也在网上问:说为什么只能是1呢,或者没有。首先这说明用ODBC方式用该函数是不行的,我想该函数用1来表明有记录用0来表明没有记录吧,但是第一个方法ODB
C方式是能成功的,你们可以去试一试。
我之前在用ADO获取表中的字符串的时候总出现的是乱码的数字 还一直不知道原因:如下:
_variant_t var,name;
            var=m_set->GetCollect("mid");
            if(var.vt!=VT_NULL)
                m_id=var.iVal;
            name=(TCHAR*)_bstr_t(m_set->GetCollect("mname"));
            if(name.vt!=VT_NULL)
                m_name=(TCHAR*)_bstr_t(name.iVal);
id是数字而name是字符串 为啥字符串取出来总是乱码喃,我就不信初学者像我一样的没有
遇到这种问题,后来才发现,_variant_t 类型数据获取字符串应该是name.bstrval
即:
name=(TCHAR*)_bstr_t(m_set->GetCollect("mname"));
            if(name.vt!=VT_NULL)
                m_name=(TCHAR*)_bstr_t(name.bstrVal);
那么相应的如果是时间型数据的话:
m_time = COleDateTime::GetCurrentTime();//缺省时间为当前时间
var=m_set->GetCollect("intime");
            if(var.vt!=VT_NULL)
                m_time=var.date;
但是,读出来之后发现时间总是1899-12-30,很明显这是个错误的时间
如果你用的是VS2010+sql2008,数据库里面日期类型用的是date,MFC里面对应的时间变量是系统里面自带的COleDateTime m_time;
那么要得到正确时间把上面的代码改成:
var=m_set->GetCollect("intime");
            if(var.vt!=VT_NULL)
                m_time=(COleDateTime)var;
强制转换成鼓词ColeDateTime就行了!
希望对有这种疑问的人有所帮助。

本文发布于:2024-09-22 12:53:54,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/292537.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:时间   模式   连接
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议