|
Larry Mills Sr wrote: I tried that, and while it gave me no errors; it also DID NOT put all the data from m_Instructions into the database (It has the data in the varable before calling Update();)
Well I'm afraid I'm a bit lost now as I thought you were trying to read data out of the database. I cannot see anything wrong with the last set of calls unless you are doing it in the wrong direction somehow.
|
|
|
|
|
Larry Mills Sr wrote: it also DID NOT put all the data from m_Instructions into the database (It has the data in the varable before calling Update();)
Well having slept on this I guess we are now into a new problem. May I suggest you post as a new question showing how you are trying the database update and how your program variables map to the database fields. I know there are a lot of very smart DB experts on this site so I'm sure one of them will pick it up quite quickly.
|
|
|
|
|
Because of the prior code listing I'll post all the code here.
How I write to the DB
void CCookItDBDoc::OnRecordNew(CRecipeData cData, int nIndex)
{
m_cRecipeData.CleanUp();
m_cRecipeData = cData;
//CheckStrSize();
//m_CookItDBSet.CleanUp();
TRY
{
if (m_CookItDBSet.Open(CRecordset::dynaset, NULL, CRecordset::appendOnly))
{
m_CookItDBSet.AddNew();
if(nIndex == 0)
{
m_CookItDBSet.m_ID = 1;
}
//nRecord = m_CookItDBSet.m_ID;
//m_CookItDBSet.CleanUp();
m_CookItDBSet.m_Category = m_cRecipeData.m_csCategory;
m_CookItDBSet.m_RecipeName = m_cRecipeData.m_csRecipeName;
m_CookItDBSet.m_RecipeType = m_cRecipeData.m_csRecipeType;
m_CookItDBSet.m_FullFilePath = m_cRecipeData.m_csFullFilePath;
m_CookItDBSet.m_Ingred1 = m_cRecipeData.m_csIngred1;
m_CookItDBSet.m_Amt1 = m_cRecipeData.m_csAmt1;
m_CookItDBSet.m_Unit1 = m_cRecipeData.m_csUnit1;
m_CookItDBSet.m_Ingred2 = m_cRecipeData.m_csIngred2;
m_CookItDBSet.m_Amt2 = m_cRecipeData.m_csAmt2;
m_CookItDBSet.m_Unit2 = m_cRecipeData.m_csUnit2;
m_CookItDBSet.m_Ingred3 = m_cRecipeData.m_csIngred3;
m_CookItDBSet.m_Amt3 = m_cRecipeData.m_csAmt3;
m_CookItDBSet.m_Unit3 = m_cRecipeData.m_csUnit3;
m_CookItDBSet.m_Ingred4 = m_cRecipeData.m_csIngred4;
m_CookItDBSet.m_Amt4 = m_cRecipeData.m_csAmt4;
m_CookItDBSet.m_Unit4 = m_cRecipeData.m_csUnit4;
m_CookItDBSet.m_Ingred5 = m_cRecipeData.m_csIngred5;
m_CookItDBSet.m_Amt5 = m_cRecipeData.m_csAmt5;
m_CookItDBSet.m_Unit5 = m_cRecipeData.m_csUnit5;
m_CookItDBSet.m_Ingred6 = m_cRecipeData.m_csIngred6;
m_CookItDBSet.m_Amt6 = m_cRecipeData.m_csAmt6;
m_CookItDBSet.m_Unit6 = m_cRecipeData.m_csUnit6;
m_CookItDBSet.m_Ingred7 = m_cRecipeData.m_csIngred7;//23
m_CookItDBSet.m_Amt7 = m_cRecipeData.m_csAmt7;
m_CookItDBSet.m_Unit7 = m_cRecipeData.m_csUnit7;
m_CookItDBSet.m_Ingred8 = m_cRecipeData.m_csIngred8;
m_CookItDBSet.m_Amt8 = m_cRecipeData.m_csAmt8;
m_CookItDBSet.m_Unit8 = m_cRecipeData.m_csUnit8;//28
m_CookItDBSet.m_Ingred9 = m_cRecipeData.m_csIngred9;
m_CookItDBSet.m_Amt9 = m_cRecipeData.m_csAmt9;
m_CookItDBSet.m_Unit9 = m_cRecipeData.m_csUnit9;
m_CookItDBSet.m_Ingred10 = m_cRecipeData.m_csIngred10;
m_CookItDBSet.m_Amt10 = m_cRecipeData.m_csAmt10;
m_CookItDBSet.m_Unit10 = m_cRecipeData.m_csUnit10;
m_CookItDBSet.m_Ingred11 = m_cRecipeData.m_csIngred11;
m_CookItDBSet.m_Amt11 = m_cRecipeData.m_csAmt11;
m_CookItDBSet.m_Unit11 = m_cRecipeData.m_csUnit11;
m_CookItDBSet.m_Ingred12 = m_cRecipeData.m_csIngred12;
m_CookItDBSet.m_Amt12 = m_cRecipeData.m_csAmt12;
m_CookItDBSet.m_Unit12 = m_cRecipeData.m_csUnit12;
m_CookItDBSet.m_Ingred13 = m_cRecipeData.m_csIngred13;
m_CookItDBSet.m_Amt13 = m_cRecipeData.m_csAmt13;
m_CookItDBSet.m_Unit13 = m_cRecipeData.m_csUnit13;
m_CookItDBSet.m_Ingred14 = m_cRecipeData.m_csIngred14;
m_CookItDBSet.m_Amt14 = m_cRecipeData.m_csAmt14;
m_CookItDBSet.m_Unit14 = m_cRecipeData.m_csUnit14;
m_CookItDBSet.m_Ingred15 = m_cRecipeData.m_csIngred15;
m_CookItDBSet.m_Amt15 = m_cRecipeData.m_csAmt15;
m_CookItDBSet.m_Unit15 = m_cRecipeData.m_csUnit15;
m_CookItDBSet.m_Instructions = m_cRecipeData.m_csInstructions;//not saving 1024 char
m_CookItDBSet.m_CookMethod = m_cRecipeData.m_csCookMethod;
m_CookItDBSet.m_Servings = m_cRecipeData.m_csServings;
m_CookItDBSet.m_BitMapPath = m_cRecipeData.m_csBitMapPath;
m_CookItDBSet.m_Extra1 = m_cRecipeData.m_csExtra1;
m_CookItDBSet.m_Extra2 = m_cRecipeData.m_csExtra2;//55
m_CookItDBSet.m_Extra3 = m_cRecipeData.m_csExtra3;
m_CookItDBSet.m_Extra4 = m_cRecipeData.m_csExtra4;
SetID(m_CookItDBSet.m_ID);
m_CookItDBSet.Update();
m_CookItDBSet.Close();
//UpdateAllViews(NULL);
}//if
}//TRY
CATCH(CDBException, pDBException)
{
AfxMessageBox(pDBException->m_strError);
}//CATCH
END_CATCH
}
The m_CookItDBSet.m_Instructions varable has all the data in it before the m_CookItDBSet.Update(); function is called, but checking the database in MS Access most of the data for Instructions is gone.
A C++ programming language novice, but striving to learn
|
|
|
|
|
I'm afraid I have nothing to suggest now as this appears to be a database issue, and my DB skills are minimal at best. As I suggested earier I think you should start a new thread in the Database forum and see if one of the experts can help.
|
|
|
|
|
I create a SDI application,which deals with ODBC. When I debug the application, so weired thing happens.
In MainFrm.cpp,the application run into CMainFrame::OnCreate function. When it comes to CFrameWnd::OnCreate function, the application is paused.Detailed information is below.
Prompt information on popup dialog shows a breakpoint is trigged. The output window says Invalid Address specified to RtlValidateHeap( 00E30000, 00E36918 ). The application finally stops at the following positon.
~CSimpleStringT() throw()
{
CStringData* pData = GetData();
pData->Release();
} (<atlsimpstr.h>)
Before CFrameWnd::OnCreate function,code is generated by mfc classwizard.I don't do anything, including memory operation. So I don't know why this happens.
Due these code executed comes from mfc classwizard, I create a new SID project without ODBC. Configures excepte database function are the same as the former one. This application works properly. After debugging these two application by step for CFrameWnd::OnCreate function, I find one difference. When it comes to the statement
if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0,0,0,0), this, nID, pContext)) (<winfrm.cpp>)
the former application goes into CFormView::Create, while the latter one goes into CWnd::Create. I don't know whether the problem is here.
Hope someone could give me some clues or solution,thanks in advance.
If my description is unclear or undetailed, please let me know. Thanks a lot.
|
|
|
|
|
You should use your debugger and see where the code crashes exactly (using the call stack, you can track it to your code). Inspect the different at that time and see if something is not as it should be. If you are still stuck, post the code snippet which is causing troubles.
|
|
|
|
|
Thanks for your respond.
The application crashed when run the code generated by MFC application wizard.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
You know that above code snippet is generated by MFC wizard.
When the application stuck, information displayed in call stack window is as follows
---------
msvcr80d.dll!_free_base(void * pBlock=0x003b0000) line 109 + 0x13 byte
msvcr80d.dll!_CrtIsValidHeapPointer(const void * pUserData=0x003b9470) line 1963
msvcr80d.dll!_free_dbg_nolock(void * pUserData=0x003b9470, int nBlockUse=1) line 1252 + 0x9 byte
msvcr80d.dll!_free_dbg(void * pUserData=0x003b9470, int nBlockUse=1) line 1194 + 0xd bytes
mfc80ud.dll!COccManager::PostCreateDialog(_AFX_OCC_DIALOG_INFO * pDlgInfo=0x0012f02c) line 237 + 0xf byte
mfc80ud.dll!CWnd::CreateDlgIndirect(const DLGTEMPLATE * lpDialogTemplate=0x00417e40, CWnd * pParentWnd=0x003bdbc8, HINSTANCE__ * hInst=0x00400000) line 323
mfc80ud.dll!CWnd::CreateDlg(const wchar_t * lpszTemplateName=0x00000065, CWnd * pParentWnd=0x003bdbc8) line 226 + 0x14 byte
mfc80ud.dll!CFormView::Create(const wchar_t * __formal=0x00000000, const wchar_t * __formal=0x00000000, unsigned long dwRequestedStyle=1350565888, const tagRECT & rect={...}, CWnd * pParentWnd=0x003bdbc8, unsigned int nID=59648, CCreateContext * pContext=0x0012fce4) line 101 + 0x16 byte
mfc80ud.dll!CFrameWnd::CreateView(CCreateContext * pContext=0x0012fce4, unsigned int nID=59648) line 590 + 0x33 byte
mfc80ud.dll!CFrameWnd::OnCreateClient(tagCREATESTRUCTW * __formal=0x0012f518, CCreateContext * pContext=0x0012fce4) line 611 + 0x11 byte
mfc80ud.dll!CFrameWnd::OnCreateHelper(tagCREATESTRUCTW * lpcs=0x0012f518, CCreateContext * pContext=0x0012fce4) line 630 + 0x18 byte
mfc80ud.dll!CFrameWnd::OnCreate(tagCREATESTRUCTW * lpcs=0x0012f518) line 622
LiqStoreDB.exe!CMainFrame::OnCreate(tagCREATESTRUCTW * lpCreateStruct=0x0012f518) line 62 + 0xc byte
---------
I feel the call stack information give me little clue. It is only related to MFC itself. I have no idea for further solution.
Need to mention that the MFC application with SDI deal with ODBC.
When creating a SDI MFC application only by wizard with the same configuration and compilation environment, no exception ocurrs. So I guess if I miss something when dealing with ODBC.
Anyone ever experienced this situation, please help me out. Thanks a lot.
|
|
|
|
|
HI!
I can't get MAC by GetAdaptersAddresses .
Here is the code:
void CGetAdepterInfoDlg::GetInfo(void)
{
PIP_ADAPTER_ADDRESSES pAddresses;
pAddresses = new IP_ADAPTER_ADDRESSES;
ULONG outBufLen = 0;
DWORD dwRetVal = 0;
if (GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen) == ERROR_BUFFER_OVERFLOW)
{
delete pAddresses;
pAddresses = (IP_ADAPTER_ADDRESSES*) malloc(outBufLen);
}
if ((dwRetVal = GetAdaptersAddresses(AF_INET, 0, NULL, pAddresses, &outBufLen)) == NO_ERROR)
{
while (pAddresses)
{
if (pAddresses->PhysicalAddressLength != 0)
{
CString sm;
sm.Format(_T("%x"),pAddresses->PhysicalAddress);
this->MessageBox(sm);
}
pAddresses = pAddresses->Next;
}
}
}
void CGetAdepterInfoDlg::OnBnClickedButton1()
{
this->GetInfo();
}
THANKS!
David
modified on Saturday, December 12, 2009 11:47 AM
|
|
|
|
|
Give me a hand please!
|
|
|
|
|
DavidBrother wrote: Give me a hand please!
Be patient! If anyone has the answer they will post it in their own time.
|
|
|
|
|
DavidBrother wrote: sm.Format(_T("%x"),pAddresses->PhysicalAddress);
PhysicalAddress is an array of bytes; you are converting the first part of its offset value to hex. You need to format each byte of the array in turn.
|
|
|
|
|
Thanks!
Richard MacCutchan
Let me try.
I feel this is a little hard function.
|
|
|
|
|
Thank you very much!
now it works!
|
|
|
|
|
Hello,
I need to send data over an active dialup conenction. So I had a look at the TAPI and also
at RasDial. I couldnt find functions like Write(...) to send data with an open tapi line
or rasdial connection.
I want to call a gsm-modem that is connected to a measurement device on the serial port.
Then I want to read and write data with this connection. I had a look at the samples about
tapi, but they are often about opening lines and making calls. I havnt found information
about sending and reading just data with a dialup connection.
Can anyone help me please ?
best regards,
cmos
|
|
|
|
|
|
Thanks for the answer, but I dont need serial communication.
The measurement device is not directly conencted to the computer.
It's about some miles aways. So I need to do it with a dialup
connection and send the commands, that i usually send with
serial connection, to the device.
regards,
cmos
|
|
|
|
|
cmos wrote: I dont need serial communication.
So how else do you think you can communicate with devices connected to a serial port? The fact that your data will go through a modem should not make any difference, you just have to put the dialling sequences at the begnning to establish connection with your remote device. This is simlar to an old fashioned TTY terminal setup. If you Google this you can probably find a ready made program to help you.
|
|
|
|
|
<blockquote class="FQ"><div class="FQA">Richard MacCutchan wrote:</div>So how else do you think you can communicate with devices connected to a serial port?</blockquote>
Actually I thought for this reason there is the TAPI.
But I considered about your statement. I guess you mean that I open the modem com-port and then send the AT commands
establishing the modem connection ? Then I can send data with
the Write command and receive with the Read command. Hope this is the right idea (?).
regards,
cmos
|
|
|
|
|
That's correct; the modem part is required to establish the end to end connection, and after that you talk to the device directly as if the modem is not present. A bit like making a telephone call.
|
|
|
|
|
Ok, thanks a lot.
A last question anyway. Is that possible with TAPI as well ? Making a call and sending data ?
regards,
cmos
|
|
|
|
|
cmos wrote: Is that possible with TAPI as well ? Making a call and sending data ?
Sorry but I don't know, I've never used TAPI, I can only suggest you look at the information on MSDN, or Google it.
|
|
|
|
|
Hello,
I downloaded a terminal program and tried out some AT commands.
There it works. For example when I send ATZ i get the modems
baudrate. Or when I send AT&F i get an OK as reply.
But when I start my program, open the com port and send
AT&F I get as reply AT&F. When I send ATZ I get as reply
ATZ. So, then I tried another tool from the internet
and opened the comport with it. There's the same problem.
When I send an AT command I get no answer but I get back the
AT command that i've send just one second ago.
Did I miss some import part ?
I just call Serial.Write(_T("ATZ"), sizeof(_T("ATZ")));
Any ideas ?
regards,
cmos
|
|
|
|
|
cmos wrote: I just call Serial.Write(_T("ATZ"), sizeof(_T("ATZ")));
I think these characters need to be in ASCII. Serial lines do not handle Unicode.
|
|
|
|
|
Hello,
now everything works. The reason for not seeing the rest of the response was that there
is a 0 (zero) in the answer string from the modem. So the string "ends" at this position.
thanks,
cmos
|
|
|
|
|
cmos wrote: thanks
Happy to help; good luck with your project.
|
|
|
|