void CNewprojectDlg::OnOK() 

// TODO: Add extra validation here 
CoInitialize(NULL); 
_ConnectionPtr pConn(_uuidof(Connection)); 
_RecordsetPtr pRst(_uuidof(Recordset));                                    pConn->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=operator"; 
pConn->Open("","","",adConnectUnspecified); 
    CString loginstr,m_username,m_password,str;//输入数据字符,输入的用户名,密码,和sql语 
CNewprojectApp* addapp=(CNewprojectApp*)AfxGetApp();                //登陆数值传入app全局变量 
    addapp->allusername=m_username;               GetDlgItemText(IDC_EDIT1,m_username); 
GetDlgItemText(IDC_EDIT2,m_password); 
loginstr.Format("%s","登陆系统");                              //输入数据库的登路字符     str="SELECT*FROM operator WHERE username='"+m_username+"'and password='"+m_password+"'"; 
pRst=pConn->Execute((_bstr_t)str,NULL,adCmdText); 
if(pRst->rsEOF)                                                //是否查询到最后是否有数据 
{  MessageBox("密码错误,重新输入"); 

else 

        
CDialog::OnOK(); 
pRst->Close(); 
pConn->Close(); 
pRst.Release(); 
pConn.Release(); 
    CoUninitialize(); 
        CoInitialize(NULL); 
        pConn->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=log2"; 
    pConn->Open("","","",adConnectUnspecified); 
char a[200]; 
sprintf(a,"insert into log values ('%s','%s','%s')",alltime,loginstr,m_username); 
pConn->Execute((_bstr_t)a,NULL,adCmdText); 
pConn->Close(); 
//pRst.Release(); 
pConn.Release(); 
    CoUninitialize();         CMainWindow mainwindow; 
mainwindow.DoModal();                                                      //创建主窗口对话框         
      

我解释下..我在onok里面 
首先初始化com连接数据库查询名字密码..如果不成功则messagebox通知,如果成功 
则关闭对话矿..并且向数据库插入数据... 
这里问题出来了...如果把数据库插入数据这段去除..那么程序可以正常运行 
如果把数据库插入数据这段代码加上.程序就不可仪运行..这里是不是com初始化的问题... 
谢谢大家了!~我很急~~~~~我喜欢对一次操作数据库就初始化一次com然后释放....CoInitialize(NULL),CoUninitialize(); 
是不是这里出错了??谢谢大家~~~ 

解决方案 »

  1.   

    我运行到pConn->Execute((_bstr_t)a,NULL,adCmdText);这里就不行了~~~~ 
    说明我连接的时候出现问题了。.但是我检查了数据库语言是没有错的。.. 
    那我究竟错在哪里了~~~
      

  2.   


    数据库关了又开
    把CDialog::OnOK();放到最后
      

  3.   

    还是不行~~~~
    是执行到pConn->Execute((_bstr_t)a,NULL,adCmdText); 这里不行的...
    不知道出什么毛病了。..
    我用sql查询语言尝试了下可以...
    我另外键立了个工程...运行了下
     CoInitialize(NULL); 
            pConn->ConnectionString="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=log2"; 
        pConn->Open("","","",adConnectUnspecified); 
    char a[200]; 
    sprintf(a,"insert into log values ('%s','%s','%s')",alltime,loginstr,m_username); 
    pConn->Execute((_bstr_t)a,NULL,adCmdText); 
    pConn->Close(); 
    //pRst.Release(); 
    pConn.Release(); 
        CoUninitialize(); 
    可以执行.....我很奇怪啊..我郁闷了.......
      

  4.   

    pConn->Execute((_bstr_t)a,NULL,adCmdText); 
    数据库执行是不是不能在一个函数里面执行两次??
      

  5.   

    跟踪看一下m_username这些值是否正确。
      

  6.   

    初始化COM库只需要在整个程序的初始化时调用AfxOleInit()即可。而CoInitialize(NULL); 只有在线程函数里访问COM对象时用,而在你的这代码里是不需要调用些代码的,非线程函数里调用此函数肯定会失败。
      

  7.   

    7楼的是一个好办法
    你在后面的代码中下一个断,看程序在哪行代码中出错,再看当时设置的变量值,从而分析出出错原因.
    从你的代码来看:一是原来打开的数据关闭是否成功,二是设置的变量是否有正常的格式和值;三是SQL语句有无错误
      

  8.   

    就你贴出来的程序看上去没什么问题,问题可能还是在SQL上,检查
    1.你的log表是否只有三个字段
    2.你的log表的三个字段是否都是varchar
    3.用VC IDE调试一看系统的出错信息是什么
      

  9.   

    按理说另建工程没有问题,那应该是没有问题的。你调试一下看看你的SQL语句是不是正常,再看看数据库里面是否不允许为空。再者,在一个工程里面,COM库只初始化一次比较好。在程序退出时释放就可以了。