今天編寫一個MFC的應用程序,其中涉及到連接數據庫,單獨寫了一個類用來連接數據庫,代碼如下:
My.h
#include "stdafx.h"
class myApp : public CWinApp{
public:
_RecordsetPtr m_pRt;
_ConnectionPtr m_pConn;
public:
myApp();
virtual BOOL Instance();
void close();
};
My.cpp
#include "stdafx.h"
#include "My.h"
myApp theApp1;
BOOL myApp::Instance(){
try
{
CoInitialize(NULL);
m_pConn->ConnectionString="Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=orcl;Persist Security Info=True";
m_pConn->Open("","","",adConnectUnspecified);
}
catch (...)
{
::MessageBox(NULL,L"連接數據庫失敗!",L"提示信息",NULL);
return FALSE;
}
return TRUE;
}
void myApp::close(){
m_pRt->Close();
m_pConn->Close();
CoUninitialize();
}
myApp::myApp(){
}
編譯的時候發生錯誤,錯誤內容是彈出一個對話框,內容是:
Debug Assertion Failed!
Program:G:\C++\New_Conn\Debug\New_Conn.exe
File:f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appcore.cpp
Line:274
For information on how your program can cause an assertion failure,see
the Visual C++ documentation on asserts.
中止 重試 忽略
以上為對話框內容
但是如果將那個
myApp theApp1; 給註釋掉的話,編譯沒錯 可以運行。請大神指教不勝感激
该回答引用ChatGPT-3.5
根据你提供的代码和错误信息,问题出现在你声明了全局对象 myApp theApp1;
的地方。在 MFC 中,应用程序对象(CWinApp
的派生类)只能有一个全局实例。通常,这个实例是在自动生成的 MFC 应用程序类中声明和创建的。
你的代码中,你在自定义的 myApp
类中创建了一个全局对象 theApp1
,这与 MFC 的设计冲突。因此,在编译时发生了错误。
要解决这个问题,你可以删除自定义的 myApp
类,并使用自动生成的 MFC 应用程序类来处理数据库连接。以下是一种可能的解决方案:
删除 My.h
和 My.cpp
文件中的自定义 myApp
类的代码。
打开你的应用程序类头文件(通常是 YourAppName.h
),并将其更改为以下内容:
#include "stdafx.h"
class CYourAppNameApp : public CWinApp
{
public:
CYourAppNameApp();
virtual BOOL InitInstance();
virtual int ExitInstance();
};
YourAppName.cpp
),并将其更改为以下内容:#include "stdafx.h"
#include "YourAppName.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
BEGIN_MESSAGE_MAP(CYourAppNameApp, CWinApp)
END_MESSAGE_MAP()
CYourAppNameApp::CYourAppNameApp()
{
// TODO: 在此处添加构造代码
}
CYourAppNameApp theApp;
BOOL CYourAppNameApp::InitInstance()
{
// 初始化数据库连接
try
{
CoInitialize(NULL);
_ConnectionPtr pConn;
_RecordsetPtr pRt;
pConn.CreateInstance(__uuidof(Connection));
pConn->ConnectionString = "Provider=MSDAORA.1;Password=tiger;User ID=scott;Data Source=orcl;Persist Security Info=True";
pConn->Open("", "", "", adConnectUnspecified);
// 将数据库连接对象和记录集对象保存到应用程序类中
m_pMainWnd = NULL; // 设置主窗口指针为 NULL
m_pConn = pConn;
m_pRt = pRt;
}
catch (...)
{
::MessageBox(NULL, L"连接数据库失败!", L"提示信息", NULL);
return FALSE;
}
// TODO: 在此处执行应用程序的其他初始化操作
return CWinApp::InitInstance();
}
int CYourAppNameApp::ExitInstance()
{
// 关闭数据库连接
m_pRt->Close();
m_pConn->Close();
CoUninitialize();
return CWinApp::ExitInstance();
}
请注意,上述代码假设你的应用程序类名称为 CYourAppNameApp
。你需要将其替换为你实际使用的应用程序类名称。
这样修改后,你的应用程序将使用自动生成的应用程序类来处理数据库连接,并且不会再出现全局对象冲突的错误。