这是我的服务器端代码,大意是传递用户名 和密码进行验证,然后设定数据库连接,最后返回true 或falseSTDMETHODIMP TDataWebImpl::SetConn(BSTR UserName, BSTR UserPass,
TOLEBOOL* Flag)
{ AnsiString user,pass;
user=AnsiString(UserName);
pass=AnsiString(UserPass);
try{ if (m_DataModule->UserQuery->Active==true)
m_DataModule->UserQuery->Active=false;
m_DataModule->UserQuery->SQL->Text=Format("select * from tblUsers where flduserid='%s'",OPENARRAY(TVarRec,(user)));
m_DataModule->UserQuery->Open();
if(!(m_DataModule->UserQuery->Eof))
{
m_DataModule->CustomerDataSet->Close();
m_DataModule->LocalConnection->Connected=false;
AnsiString connString=Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=server2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TAO;Use Encryption for Data=False;Tag with column collation when possible=False",OPENARRAY(TVarRec,(user)));
m_DataModule->LocalConnection->ConnectionString=connString; // AnsiString temp=m_DataModule->LocalConnection->ConnectionString;
m_DataModule->LocalConnection->Connected=true;
m_DataModule->CustomerDataSet->Open();;
*Flag=true;
} else
*Flag=false;
m_DataModule->UserQuery->Close();
m_DataModule->UserQuery->SQL->Text=" ";
m_DataModule->CustomerDataSet->Close();
}
catch(Exception &e)
{
*Flag=false;
m_DataModule->CustomerDataSet->Close();
return Error(e.Message.c_str(),IID_IDataWeb); }
return S_OK;
}客户端有三种调用方式,我用的是派生接口调用,必须包含服务器的、XXX_TLB.cpp,和XXX_TLB.h到工程 TOLEBOOL temp; //接受返回值
IDataWebDisp MyCom; //申明对象
CustomerDataSet->Close();
MyCom.Bind(Connection->GetServer());//绑定接口
BSTR DbName=WideString("Master");
MyCom->SetConn(DbName,WideString("tao"),&temp);//调用接口,结果返回到temp中
if (MyCom.IsBound())
MyCom.Unbind(); //解除绑定
TOLEBOOL* Flag)
{ AnsiString user,pass;
user=AnsiString(UserName);
pass=AnsiString(UserPass);
try{ if (m_DataModule->UserQuery->Active==true)
m_DataModule->UserQuery->Active=false;
m_DataModule->UserQuery->SQL->Text=Format("select * from tblUsers where flduserid='%s'",OPENARRAY(TVarRec,(user)));
m_DataModule->UserQuery->Open();
if(!(m_DataModule->UserQuery->Eof))
{
m_DataModule->CustomerDataSet->Close();
m_DataModule->LocalConnection->Connected=false;
AnsiString connString=Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=server2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TAO;Use Encryption for Data=False;Tag with column collation when possible=False",OPENARRAY(TVarRec,(user)));
m_DataModule->LocalConnection->ConnectionString=connString; // AnsiString temp=m_DataModule->LocalConnection->ConnectionString;
m_DataModule->LocalConnection->Connected=true;
m_DataModule->CustomerDataSet->Open();;
*Flag=true;
} else
*Flag=false;
m_DataModule->UserQuery->Close();
m_DataModule->UserQuery->SQL->Text=" ";
m_DataModule->CustomerDataSet->Close();
}
catch(Exception &e)
{
*Flag=false;
m_DataModule->CustomerDataSet->Close();
return Error(e.Message.c_str(),IID_IDataWeb); }
return S_OK;
}客户端有三种调用方式,我用的是派生接口调用,必须包含服务器的、XXX_TLB.cpp,和XXX_TLB.h到工程 TOLEBOOL temp; //接受返回值
IDataWebDisp MyCom; //申明对象
CustomerDataSet->Close();
MyCom.Bind(Connection->GetServer());//绑定接口
BSTR DbName=WideString("Master");
MyCom->SetConn(DbName,WideString("tao"),&temp);//调用接口,结果返回到temp中
if (MyCom.IsBound())
MyCom.Unbind(); //解除绑定
还有没有人知道阿,我在delphi里,用很简单的
DCOMConnection1。AppServer.login(11); //一句话搞定 bcb里这么用阿!
1. 在验证用户及密码时,必须用一个合法的用户/密码打开数据库,然后在数据库中的一个用户/密码表中进行验证;
2. 所有连接都是基于一个用户名(SA)?这样是不是太危险?每个连接都是超级用户?是不是可以改成这样:AnsiString connString=Format("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=%s;Data Source=server2000;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TAO;Use Encryption for Data=False;Tag with column collation when possible=False",OPENARRAY(TVarRec,(user)));
m_DataModule->LocalConnection->ConnectionString=connString;将上面的connString里的User ID=sa,改为另一个名字?不管如何,给我的启示很大。
IAppServer是midas内欠的接口,通过它也能调用其它接口,不过效率低点(两次调用)
问题的核心就是怎样得到一个句柄,但是总是出错。
你可以这样试一下:(我记的绑定也是可以的)
IDispatch* disp = (IDispatch*)(DCOMConnection1->AppServer);
IRemoteADODisp TempInterface= (IRemoteADO*)disp;
ShowMessage(TempInterface->Calc(1,2));
一个很重要的问题是DCOMConnection 设计时在远程不可用,也就是说在客户机无法连接到服务器端的COM对象,(SOCKETCONNECTION可以),同时COM对象必须在客户机注册,(我估计就在注册表里写个CLSID就行了,)然后在客户机用三种方法的任一种都可以,不会出错了。
DCOMConnection1->AppServer.OleFunction("UserLogin",(long)ptmp);
应该可以吧.
DCOMConnection1->Connected = true;
CrmServer.Bind(DCOMConnection1->GetServer());
__try
{
CrmServer->UserLogin(ptmp);
}
__finally
{
}
请看
bcb 很多东西,没有delphi封装的,干净利落。