|
I have ADO in my project with a #import msado25.tlb. I see that if I want to peek into my db and check the name of the table, I need to use ADOX. But when I do the #import msadox.dll I get redefinition problems.
So, is there a way to get the table name using only ADO. If not how do I get ADOX and ADO to reconcile. As soon as i put in the #import for ADOX I get errors of redefinition!
Thanks,
Need to know this desperately.
ns
|
|
|
|
|
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile")<br />
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
If I remember correctly you need to specify a namespace for ADO.
Michael
Programming is great. First they pay you to introduce bugs into software. Then they pay you to remove them again.
|
|
|
|
|
All I did was replace my
#import "C:\\Program Files\\Common Files\\System\\ADO\\msado25.tlb" \
no_namespace \
rename( "EOF", "adoEOF" )
with your
rename_namespace "ADO" and I got 234 compile errors! I hadnt even breathed ADOX yet!!
Now what?
thanks,
ns
|
|
|
|
|
All the ADO objects are now in the ADO namespace and will need to be accessed via the namespace.
e.g
_ConnectionPtr becomes ADO::_ConnectionPtr
Michael
Programming is great. First they pay you to introduce bugs into software. Then they pay you to remove them again.
|
|
|
|
|
|
I want tio use a CP CADOX class which has stuff called ADODB::_CommandPtr etc. Will this cause a conflict with ADO::_CommandPtr etc?
thanks,
ns
|
|
|
|
|
does this (__uuidof(Recordset) ) become ADO::Recordset?
|
|
|
|
|
Okay. I have been able to compile doing what you said. Now the test will be if I can do ADOX stuff!!!
Thanks forhelping as much as you have. I'm sure I'll be back with ADOX questions in a bit!
Appreciate the hint!
Still, why does this work?
|
|
|
|
|
Is it okay if I have multiple #imports in various files? I need to use a CP ADOX class, and it has
a #import msadox.dll in it as well...
Or should these #imports be declared only once in the project?
Also is it okay that I'm using msado25.tlb not msado15.dll? On some machines my project only works if I have the former (they dont have the latest mdac) . No conflict with msadox.dll right?
|
|
|
|
|
nss wrote:
Also is it okay that I'm using msado25.tlb not msado15.dll? On some machines my project only works if I have the former (they dont have the latest mdac) . No conflict with msadox.dll right?
There shouldn't be any problem.
nss wrote:
Or should these #imports be declared only once in the project?
I just have the #imports declared in one place, in my header file for my ADOConnection wrapper class.
Michael
Programming is great. First they pay you to introduce bugs into software. Then they pay you to remove them again.
|
|
|
|
|
Try this:
#pragma warning(disable: 4146)
#import "msado15.dll" rename("EOF", "adoEOF")
#import "msadox.dll" rename("DataTypeEnum", "AdoxDataTypeEnum")
#pragma warning(default: 4146)
All of the ADO stuff will be in the ADODB namespace.
All of the ADOX stuff will be in the ADOX namespace.
|
|
|
|
|
I have a databadse project with
#import msado25.tlb
Now i want some ADOX functionlaity so I added:
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
I get 18 redefinition errors! How can I get around this and use ADOX and ADO in the same project?
Thanks,
ns
|
|
|
|
|
Hello ns. I don't know much about ADO(X), but this might help:- Can't you just use ADOX and forget about ADO? As it name suggests, probably ADOX covers ADO as well.
- If you can't, you might try using ADO and ADOX in different
.cpp s so that no name clash occurs.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I added #include "adox.h" to my db project and got these errors:
--------------------Configuration: Train1 - Win32 Release--------------------
Compiling...
Train1View.cpp
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tlh(104) : error C2011: '_Collection' : 'struct' type redefinition
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tlh(133) : error C2011: '_DynaCollection' : 'struct' type redefinition
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tlh(511) : error C2011: 'DataTypeEnum' : 'enum' type redefinition
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tlh(554) : error C2011: 'Properties' : 'struct' type redefinition
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tlh(580) : error C2011: 'Property' : 'struct' type redefinition
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(14) : error C2084: function 'long __thiscall _Collection::GetCount(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(21) : error C2084: function 'class _com_ptr_t<class _com_IIID<struct IUnknown,&struct __s_GUID _GUID_00000000_0000_0000_c000_000000000046> > __thiscall _Collection::_NewEnum(void)' a
lready has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(28) : error C2084: function 'long __thiscall _Collection::Refresh(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(38) : error C2084: function 'long __thiscall _DynaCollection::Append(struct IDispatch *)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(44) : error C2084: function 'long __thiscall _DynaCollection::Delete(const class _variant_t &)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(386) : error C2084: function 'class _com_ptr_t<class _com_IIID<struct Property,&struct __s_GUID _GUID_00000503_0000_0010_8000_00aa006d2ea4> > __thiscall Properties::GetItem(const cla
ss _variant_t &)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(397) : error C2084: function 'class _variant_t __thiscall Property::GetValue(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(405) : error C2084: function 'void __thiscall Property::PutValue(const class _variant_t &)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(410) : error C2084: function 'class _bstr_t __thiscall Property::GetName(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(417) : error C2084: function 'enum DataTypeEnum __thiscall Property::GetType(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(424) : error C2084: function 'long __thiscall Property::GetAttributes(void)' already has a body
c:\trainer\a_tr noblob indb series\trnoblob13g\release\msadox.tli(431) : error C2084: function 'void __thiscall Property::PutAttributes(long)' already has a body
C:\Trainer\A_TR NOBlob inDB series\TrNoBlob13g\Train1View.cpp(3991) : warning C4553: '==' : operator has no effect; did you intend '='?
C:\Trainer\A_TR NOBlob inDB series\TrNoBlob13g\Train1View.cpp(4449) : error C2264: 'GetCount' : error in function definition or declaration; function not called
Error executing cl.exe.
Train1.exe - 18 error(s), 9 warning(s)
I like the class but dont know how to make errors disapppear. I have #import msado25.tlb
|
|
|
|
|
Maybe it's very stupid question. I'm talking about application working on LAN. I can get IP adress but i need send a broadcast message. IMO is simplest way replace part of IP adress with 0xFF(or something like this depending on adressing of LAN) and send UDP packet. But i don't know how to get mask and find right part of adress to replace. Can anybody help me?
|
|
|
|
|
I'm not sure what you're talking about here. Mask? Anyways, if you want to send a broadcast message just set the destination IP address to 255.255.255.255 and set the port to whatever port you're going to be using. I believe most routers will block that (not routeable) so it won't go out on the Internet but remain on your LAN and probably won't cross any segments.
|
|
|
|
|
Ok, after doing some research on a related topic, I stumbled across what you were talking about. You're asking about the subnet mask.
I don't know how you get it. But, as I stated earlier you can send 255.255.255.255 as a broadcast for all subnets. If your IP address was 192.168.1.22 and your subnet mask was 255.255.255.0 then sending a broadcast message with IP address 192.168.1.255 would work also. Thus, that becomes a broadcast message for that subnet only.
The procedure I read said negate OR the subnet mask with your IP address to get that value.
e.g. ip |= ~mask to get broadcast address.
|
|
|
|
|
I have to supply documentation for the user of the app (not docs for the code). Things like features and instructions and troubleshooting etc. I'd like to make this like the help system we see that pops up with tabs for index, search, contents etc. Can you please point me to links, sample code etc on how to do this?
Thanks,
ns
|
|
|
|
|
try HtmlHelp released by microsoft
I am seeking...
For what?
Why did you ask me for what? I don't know!
|
|
|
|
|
|
In the Solution Explorer window, right-click on your project and select Properties. In the dialog box, unfold the Linker folder, click on Input. Then add your .lib file(s) in Additional Dependencies.
MS quote (http://www.microsoft.com/ddk) : As of September 30, 2002, the Microsoft® Windows® 2000 DDK, the Microsoft Windows 98 DDK, and the Microsoft Windows NT® 4.0 DDK will no longer be available for purchase or download on this site. Support for development will ship at the same time as the Windows XP Service Pack 1 (SP1) release.
|
|
|
|
|
-Projects
-Add existing item...
Kuphryn
|
|
|
|
|
|
If you have a "simple" ADO application in C++ that shows the usage of stored procedures, then please write the code here .
|
|
|
|
|
Yes Sir!
// AdoHelper.cpp: implementation of the CAdoHelper class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AdoHelper.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CConnection* CConnection::m_pInstance = NULL;
void CConnection::SetConnection(const CString& strConnectString)
{
m_strConnectString = strConnectString;
}
CConnection::CConnection()
{
m_pInstance = NULL;
m_bConnect = FALSE;
}
CConnection::~CConnection()
{
}
void CConnection::Disconnect()
{
try
{
if (m_Conn != NULL)
m_Conn->Close();
}
catch (...)
{
}
}
CString CConnection::GetConnectString()
{
return m_strConnectString;
}
BOOL CConnection::Connect()
{
BOOL bRet = FALSE;
CString str;
try
{
m_Conn = _ConnectionPtr(__uuidof( Connection ));
_bstr_t bstrConn(GetConnectString());
_bstr_t n;
if (SUCCEEDED(m_Conn->Open(bstrConn,n,n,0)))
{
bRet = TRUE;
}
else
{
CString str;
str.Format("%s Connection Failed",bstrConn);
AfxMessageBox(str);
}
}
catch (_com_error& e)
{
}
m_bConnect = bRet;
return bRet;
}
BOOL CConnection::IsConnected()
{
return m_bConnect;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
CAdoCmd::CAdoCmd()
{
m_pConnection = NULL;
m_bParamSet = false;
}
CAdoCmd::CAdoCmd(const CString& strSP, CConnection* pConnection)
{
m_bParamSet = false;
m_pConnection = pConnection;
ASSERT(pConnection != NULL);
ASSERT(m_pConnection->m_Conn != NULL);
m_cmd = _CommandPtr(__uuidof(Command));
ASSERT(m_cmd != NULL);
m_cmd->ActiveConnection = m_pConnection->m_Conn;
m_cmd->CommandText = _bstr_t(strSP);
m_cmd->CommandType = adCmdStoredProc;
m_cmd->CommandTimeout = 15;
}
void CAdoCmd::SetProcedureName(const CString& strSP, CConnection* pConnection)
{
m_pConnection = pConnection;
ASSERT(pConnection != NULL);
ASSERT(m_pConnection->m_Conn != NULL);
m_strSP = strSP;
m_cmd = _CommandPtr(__uuidof(Command));
ASSERT(m_cmd != NULL);
m_cmd->ActiveConnection = m_pConnection->m_Conn;
m_cmd->CommandText = _bstr_t(strSP);
m_cmd->CommandType = adCmdStoredProc;
m_cmd->CommandTimeout = 15;
}
BOOL CAdoCmd::CreateParameter(DataTypeEnum dtEnum, ParameterDirectionEnum pdEnum, int nSize)
{
_ParameterPtr pParam = _ParameterPtr(__uuidof(Parameter));
pParam = m_cmd->CreateParameter("", dtEnum, pdEnum, nSize);
m_cmd->Parameters->Append(pParam);
m_unkArray.Add(pParam);
m_bParamSet = true;
return TRUE;
}
BOOL CAdoCmd::CreateReturnParameter(DataTypeEnum dtEnum, int nSize)
{
// Return Parameter MUST be create first
ASSERT(m_bParamSet == 0);
if (m_bParamSet)
return FALSE;
m_pRetParam = _ParameterPtr(__uuidof(Parameter));
ASSERT(m_pRetParam != NULL);
m_pRetParam = m_cmd->CreateParameter("", dtEnum, adParamReturnValue, nSize);
m_cmd->Parameters->Append(m_pRetParam);
return TRUE;
}
BOOL CAdoCmd::Execute()
{
BOOL b = TRUE;
try
{
m_cmd->Execute(NULL, NULL, 0);
}
catch (_com_error& e)
{
ASSERT(0);
b = FALSE;
}
return b;
}
_variant_t CAdoCmd::GetReturnValue()
{
return m_pRetParam->Value;
}
_variant_t CAdoCmd::GetParamValue(int nParam)
{
_ParameterPtr pParam = m_unkArray.GetAt(nParam);
_variant_t v = pParam->Value;
if (v.vt == VT_NULL)
v = "";
return v;
}
void CAdoCmd::SetParamValue(int nParam, _variant_t val)
{
_ParameterPtr pParam = m_unkArray.GetAt(nParam);
pParam->Value = val;
}
void CAdoCmd::SetParamValue(int nParam, _bstr_t val)
{
_ParameterPtr pParam = m_unkArray.GetAt(nParam);
pParam->Value = val;
}
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
Normski. - the next bit of code is self modifying ... jmp 0xCODE
|
|
|
|