我用MFC做了一个程序,现要加入对数据库的支持,我采用ODBC连接,用ORACLE数据库,直接加入了一个继承自CRecordSet的类来对数据库的一个表进行处理。
默认情况下在开始使用此继承自CRecordSet类的对象时,会弹出ORACLE登录对话框。
我现在需要在程序里处理哪个登录用户在使用此程序,即需要知道登录用户名,该怎么实现? 是在登录之前得到用户,还是在登录之后用其它方法得到当前正在使用的用户???
请各位大侠们指教,我对数据库是一窍不通。
请详细告诉我在继承自CRecordSet的类的哪个函数里添加些什么代码。谢谢!!!
解决之后另开贴送200分
默认情况下在开始使用此继承自CRecordSet类的对象时,会弹出ORACLE登录对话框。
我现在需要在程序里处理哪个登录用户在使用此程序,即需要知道登录用户名,该怎么实现? 是在登录之前得到用户,还是在登录之后用其它方法得到当前正在使用的用户???
请各位大侠们指教,我对数据库是一窍不通。
请详细告诉我在继承自CRecordSet的类的哪个函数里添加些什么代码。谢谢!!!
解决之后另开贴送200分
解决方案 »
- 用libnet构造TCP的ack包回应syn包,很神奇的事
- 请教高人:在控制台程序中如何遍历文件目录?
- 如何将一个LPBYTE类型转换成CString类型?Unicode的
- 先散1000分,抗议某些人滥用职权!!!(2)
- WH_KEYBOARD_LL和WH_KEYBOARD这两个参数在拦截键盘消息的时候有什么区别啊,什么是低级键盘操作啊?
- 我将控件修改后再运行时出现这样的错误是怎么回事?
- 请问如何改变对话框的背景颜色.
- 有什么办法得到FrameWnd 的ID号
- 还是关于研华采集卡的,我先做软件采集再高速采集,这之间应该先closedevice再opendevice吧
- 项目属性为应用程序 却生成lib文件与exp文件(DLL的)
- 请 zhouwenjie(小周) ( ) 信誉:100 过来领分(5)
- 基于SDI的服务器程序能否做成服务?
{
return _T("ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD");
}
但是如果第一次没有正确界输入就会弹出ORACLE登陆界面
不过直接写在程序里,万一你服务器的用户名和密码改变了,你不好改。
但有时候,你不想让用户每一次都输入用户名和密码。我是把他们存放在一个文件中,然后每次我程序一运行,就取出文件中存取的DSN,UID,PWD.然后
CDatabase database;
try
{
database.Open(strConnect);//strConnect就是读出来的"ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD";
}
catch (CDBException* e)
{
AfxMessageBox(e->m_strError); e->Delete();
return FALSE;
}
然后复用database.
CMyset rs(&database);
//这样子打开失败就不会弹出登陆对话框
CMyRecordset rs(&database);
或CMyRecordset rs;
rs.m_pDatabase=database;
这时候打开的recordset是使用database建立的线程(后台Oracle),用户名和密码都和database.Open时用的一样。如果没用复用CMyRecordset rs;
rs.Open();//这时候是依照CString CMySet::GetDefaultConnect()中的打开的,这时候Open一次就创建一个新进程。如果同时有很多的CRecordset打开,后台的进程太多,Oracle就会报错。
谢了,不过我不想把用户和密码放在一个文件里,就用ORACLE定添加的用户,
不知strConnect第一次不正确的话,这种方法会不会又弹出ORACLE登当对话框?
我先试试,
UpdateData();
if (!g_database.OpenEx("ODBC;DSN=MyDSN;UID=UserID;PWD=PASSWD",CDatabase::noOdbcDialog))
return;......直到输入正确才向下继续运行程序。
UpdateData();
try
{
database.OpenEx(str,CDatabase::noOdbcDialog);
}
catch(CDBException *e)
{
AfxMessageBox(e->m_strError);
e->Delete();
return;
} .........
我用了下面的语句:
CMyRecordset rs;
rs.m_pDatabase=database;//此处错误如下:
/*error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CDatabase' (or there is no acceptable conversion) */
难道CDatabase类没有“=”操作???
rs.m_pDatabase=database;//不能赋值
要用rs.m_pDatabase = &database
应用赋值
CString strConnect;
CLoginDlg* dlg = new CLoginDlg;
if (dlg->DoModal()== IDOK)
{
strConnect = "ODBC;DSN=pdms;UID=" + dlg->m_name + ";pwd=" + dlg->m_password;
try
{
database.Open(strConnect,CDatabase::noOdbcDialog);
}
catch (CDBException* e)
{
AfxMessageBox(e->m_strError);
e->Delete();
}
}
当strConnect没有正确输入时,又弹出ORACLE登录对话框,这又怎么办呢??
void CLoginDlg::OnOK()
{
UpdateData();
strConnect = "ODBC;DSN=pdms;UID=" + dlg->m_name + ";pwd=" + dlg->m_password;
try
{
database.OpenEx(strConnect,CDatabase::noOdbcDialog);
}
catch (CDBException* e)
{
AfxMessageBox(e->m_strError);
e->Delete();
return;
}
}然后你刚才主程序的地方只要
CLoginDlg* dlg = new CLoginDlg;
if (dlg.DoModal()==IDCANCEL)
return;就行了会弹出吗?你要用database.OpenEx(str,CDatabase::noOdbcDialog);
是OpenEx,不是Open.m_database.OpenEx(str,CDafdftabase::noOdbcDialog);df
CDatabase database;
database.ExecuteSQL("begin myprocedure;end");就行了。这个问题你可以搜索以前的帖子,以前的有详细的解答。或者开个新贴问。
其中就含有用户名一项,在字符串中解析出来就可以了