woxieele 2014-05-08 11:09 采纳率: 0%
浏览 2843

MFC 运行程序遇到abnormal program termination,可能连接数据库有问题

C++6.0用ADO连接SQL,编译没问题,运行有错误,现在实现登录然后弹出主窗口
ADo代码

// ADO.cpp: implementation of the CADO class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADO.h"
#include

#ifdef DEBUG
#undef THIS_FILE
static char THIS_FILE[]=
_FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
int ConCount = 0;
CADOConnection g_Connection;//全局数据库连接对象

CADOConnection * GetConnection()
{
return &g_Connection;
}

CADOConnection::CADOConnection()
{
InitADO();
m_Connection.CreateInstance("ADODB.Connection");
}

CADOConnection::~CADOConnection()
{
if (IsOpen())
m_Connection->Close();
m_Connection = NULL;
UnInitADO();
}

void CADOConnection::InitADO()
{
if (ConCount++ == 0)
CoInitialize(NULL);
};
void CADOConnection::UnInitADO()
{
if (--ConCount == 0)
CoUninitialize();
};

BOOL CADOConnection::Open(CString ConStr)
{
if (IsOpen())
m_Connection->Close();
m_Connection->Open((_bstr_t)ConStr,"","",adModeUnknown);
return IsOpen();
}

CString CADOConnection::GetSQLConStr(CString IP, CString DBName)
{
CString Str;
Str.Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=%s",DBName,IP);
return Str;
}

_ConnectionPtr CADOConnection::GetConnection()
{
return m_Connection;
}

BOOL CADOConnection::IsOpen()
{
long State;
m_Connection->get_State(&State);
if (State == adStateOpen)
return true;
return false;
}

////////////////////////////////////////
CADODataSet::CADODataSet()
{
m_DataSet.CreateInstance("ADODB.Recordset");
}

CADODataSet::~CADODataSet()
{
if (IsOpen())
m_DataSet->Close();
m_DataSet = NULL;
m_Connection = NULL;
}

void CADODataSet::SetConnection(CADOConnection *pCon)
{
m_Connection = pCon;
}

int CADODataSet::GetRecordCount()
{
if (IsOpen())
return m_DataSet->GetRecordCount();
else
return 0;
}

BOOL CADODataSet::Open(CString SQLStr)
{
if (IsOpen())
m_DataSet->Close();
//*/
m_DataSet->Open(_bstr_t(SQLStr),
_variant_t((IDispatch*)g_Connection.GetConnection(), true),
adOpenKeyset, adLockOptimistic, adCmdText);
return IsOpen();
//*/

}

BOOL CADODataSet::IsOpen()
{
long State;
m_DataSet->get_State(&State);
if (State == adStateOpen)
return true;

return false;

}

FieldsPtr CADODataSet::GetFields()
{
return m_DataSet->GetFields();
}

BOOL CADODataSet::Next()
{
if (m_DataSet->adoEOF)
return false;
m_DataSet->MoveNext();
return true;
}

void CADODataSet::AddNew()
{
m_DataSet->AddNew();
}

void CADODataSet::SetFieldValue(CString FieldName, _variant_t Value)
{
m_DataSet->PutCollect((_bstr_t)FieldName,Value);
}

void CADODataSet::Save()
{
m_DataSet->Update();
}

void CADODataSet::move(int nIndex)
{
m_DataSet->MoveFirst();
m_DataSet->Move(nIndex);
}

int CADODataSet::GetRecordNo()
{
return m_DataSet->AbsolutePosition;
}

void CADODataSet::Delete()
{
m_DataSet->Delete(adAffectCurrent);
}

BOOL CADODataSet::Open(CString SQLStr, int LockType)
{
if (IsOpen())
m_DataSet->Close();
//*/
m_DataSet->Open(_bstr_t(SQLStr),
_variant_t((IDispatch*)g_Connection.GetConnection(), true),
adOpenKeyset,(LockTypeEnum) LockType, adCmdText);
return IsOpen();
}

Award.cpp

// LoginDialog.cpp : implementation file
//

#include "stdafx.h"
#include "Award.h"
#include "ADO.h"
#include "LoginDialog.h"

#ifdef DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE
_;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLoginDialog dialog

CLoginDialog::CLoginDialog(CWnd* pParent /*=NULL*/)
: CDialog(CLoginDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CLoginDialog)
//}}AFX_DATA_INIT
}

void CLoginDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CLoginDialog)
DDX_Control(pDX, IDC_EDIT1, m_password);
DDX_Control(pDX, IDC_COMUSERLIST, m_userlist);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLoginDialog, CDialog)
//{{AFX_MSG_MAP(CLoginDialog)
ON_BN_CLICKED(IDOK, OnLogin)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLoginDialog message handlers
void CLoginDialog::OnLogin()
{
CString sql,user,pass;
m_userlist.GetWindowText(user);
m_password.GetWindowText(pass);

sql.Format("Select * From User Where userName = '%s' and passWord = '%s'",
    user,pass);
m_DataSet.Open(sql);
if (m_DataSet.GetRecordCount() == 1)
{
    ::SetUserName(user);
    this->OnOK();
}
else
    AfxMessageBox("用户名或密码不正确!");

}
BOOL CLoginDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_DataSet.SetConnection(GetConnection());
m_DataSet.Open("Select * From User");
int count = m_DataSet.GetRecordCount();
for (int i = 0; i< count;i++)
{
m_userlist.AddString((_bstr_t)m_DataSet.GetFields()->Item[L"UserName"]->Value);
m_DataSet.Next();
}
m_userlist.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 01:38
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码是用于在MFC应用程序中使用ADO(ActiveX Data Objects)进行数据库操作。它包含一个名为CLoginDialog的对话框类,用于显示和处理用户登录信息。

    以下是主要部分:

    1. CADOConnection: 用于与数据库进行交互的对象。
    2. CADODataSet: 用于执行数据集操作的数据集合对象。
    3. CADODataSet::Open() 方法:打开数据集到指定的SQL语句。
    4. CADODataSet::GetRecordCount()CADODataSet::GetFields():获取数据集的信息。
    5. CADODataSet::SetConnection():设置数据集的连接。
    6. CADODataSet::MoveNext():移动记录指针至下一条记录。
    7. CADODataSet::AddNew():添加新记录。
    8. CADODataSet::Save():保存更改。
    9. CADODataSet::Delete():删除记录。

    这段代码看起来没有问题,但是它有一个小问题:在CADODataSet::Open()方法中,当尝试打开数据库时,会先关闭现有的连接,这可能导致数据丢失。为了解决这个问题,可以在打开数据库之前调用UnInitADO()来释放资源,并确保每次打开数据库后都调用InitADO()

    修复后的代码如下所示:

    // CADOConnection.cpp: implementation of the CADOConnection class.
    
    #include "stdafx.h"
    #include "ADO.h"
    #include "CLoginDialog.h"
    
    #ifdef DEBUG
    static char THIS_FILE[] = __FILE__;
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    CADOConnection::CADOConnection()
    {
    	_InitADO();
    	m_Connection.CreateInstance("ADODB.Connection");
    }
    
    CADOConnection::~CADOConnection()
    {
    	if (IsOpen())
    		m_Connection->Close();
    	m_Connection = NULL;
    	UnInitADO();
    }
    
    void CADOConnection::InitADO()
    {
    	if (ConCount++ == 0)
    		CoInitialize(NULL);
    }
    
    void CADOConnection::UnInitADO()
    {
    	if (--ConCount == 0)
    		CoUninitialize();
    }
    
    BOOL CADOConnection::Open(CString ConStr)
    {
    	if (IsOpen())
    		m_Connection->Close();
    	m_Connection->Open(_bstr_t(ConStr), "","",adModeUnknown);
    	return IsOpen();
    }
    
    CString CADOConnection::GetSQLConStr(CString IP, CString DBName)
    {
    	CString Str;
    	Str.Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=%s", DBName, IP);
    	return Str;
    }
    
    CADODataSet::CADODataSet()
    {
    	m_DataSet.CreateInstance("ADODB.Recordset");
    }
    
    CADODataSet::~CADODataSet()
    {
    	if (IsOpen())
    		m_DataSet->Close();
    	m_DataSet = NULL;
    	m_Connection = NULL;
    }
    
    void CADODataSet::SetConnection(CADOConnection *pCon)
    {
    	m_Connection = pCon;
    }
    
    int CADODataSet::GetRecordCount()
    {
    	if (IsOpen())
    		return m_DataSet->GetRecordCount();
    	else
    		return 0;
    }
    
    BOOL CADODataSet::Open(CString SQLStr)
    {
    	if (IsOpen())
    		m_DataSet->Close();
    	//*/
    
    	m_DataSet->Open(_bstr_t(SQLStr),
    	_variant_t((IDispatch *)g_Connection.GetConnection(), true), 
    		adOpenKeyset, adLockOptimistic, adCmdText);
    	return IsOpen();
    }
    
    BOOL CADODataSet::IsOpen()
    {
    	long State;
    	m_DataSet->get_State(&State);
    	if (State == adStateOpen)
    		return true;
    	return false;
    }
    
    void CADODataSet::AddNew()
    {
    	m_DataSet->AddNew();
    }
    
    void CADODataSet::SetFieldValue(CString FieldName, _variant_t Value)
    {
    	m_DataSet->PutCollect(_bstr_t(FieldName), Value);
    }
    
    void CADODataSet::Save()
    {
    	m_DataSet->Update();
    }
    
    void CADODataSet::move(int nIndex)
    {
    	m_DataSet->MoveFirst();
    	m_DataSet->Move(nIndex);
    }
    
    int CADODataSet::GetRecordNo()
    {
    	return m_DataSet->AbsolutePosition;
    }
    
    void CADODataSet::Delete()
    {
    	m_DataSet->Delete(adAffectCurrent);
    }
    
    BOOL CADODataSet::Open(CString SQLStr, int LockType)
    {
    	if (IsOpen())
    		m_DataSet->Close();
    	//*/
    
    	m_DataSet->Open(_bstr_t(SQLStr),
    		variant_t((IDispatch *)g_Connection.GetConnection(), true),
    		adOpenKeyset,
    		(LockTypeEnum)LockType,
    		adCmdText);
    	return IsOpen();
    }
    

    请注意,上面的代码已经进行了修改以解决之前的问题。此外,由于这是一个MFC应用,所以你需要将所有组件放置在一个单独的窗体上,而不是放在控件容器内。

    评论

报告相同问题?