Datenbank Exception Speicherfehler



  • Hallo

    Bei beigefügtem Code kommt bei number.Open hin und wieder eine Exception. Als Fehlermeldung erscheint "Fehler in Anwendung: Die Anweisung in "0x004068b0" verweist auf Speicher in "0x00000020". Der Vorgang
    "read" konnte nicht auf dem Speicher durchgeführt werden." Der Fehler ist nicht reproduzierbar. Da ich annahm, daß es eine Speicherexcepiton wäre wollte ich sie abfangen. Leider funktioniert es nicht, entweder ist bei der CMemoryException etwas nicht korrekt, oder es ist keine Speicherexception. Hat jemand Erfahrung mit so einem Problem und eventuell Ideen?

    try
    		{
    			vDB_Query1.erase(vDB_Query1.begin(), vDB_Query1.end());
    			string str1;
    
    			CString sODBCName = "DSN=DB_TEST;UID=TEST;PWD=TEST";
    			CDatabase dbnumber;
    			CNumber_Tbl number(&dbnumber);
    
    			dbnumber.OpenEx(sODBCName, CDatabase::noOdbcDialog);
    			if(dbnumber.IsOpen())
    			{	    
                                 number.Open(CRecordset::snapshot, strselect.c_str()); //Hier passiert die Exception				
    				while(!number.IsEOF())
    				{
    					str1 = ";1_OPERATION=";
    					str1 += number.m_OPERATION;
    					str1 += ";1_PRODUCT=";
    					str1 += number.m_ROUTE;
    					vDB_Query1.push_back(str1.c_str());
    					number.MoveNext();
    				}
    				number.Close();
    			}
    			dbnumber.Close();
    		}
    		catch(CDBException* pEx)
    		{
    			string str2 = pEx->m_strError;
    			cout << str2.c_str() << endl;
    			pEx->Delete();
    		}
    		catch(CMemoryException* e)
    		{
    			e->Delete();
    			AfxAbort();
    		}
    


  • Was steht denn in strselect drin?

    Gruß, seppelina



  • Hallo

    Einer von beiden String kann der Inhalt sein. Es scheint nur bei dem ersten select zu passieren. Aber an dem select kann es ja wohl kaum liegen, wenn da was falsch ist bekomme ich eine CDBException.

    Select OPERATION,ROUTE from DWH_ADMIN.DWH_WIP_DATA_7 where TRANSCODE = 'M' and EQUIPMENT = '123' and LO = 'ZD34' and TIME_STAMP > to_date('2003-08-22 05:08:09','YYYY-MM-DD HH24:MI:SS') and TIME_STAMP < to_date('2003-08-22 08:08:09','YYYY-MM-DD HH24:MI:SS')

    select a.OPERATION, a.ROUTE, a.PRODUCT, b.RECIPE from DWH_ADMIN.DWH_WIP_DATA_7 a,DWH_ADMIN.UDT_EPA_OPERATION b,DWH_ADMIN.DWH_OPERATION c where c.FACILITY = 'S' and c.cos = '674' and a.TRANSCODE = 'M' and a.FE_SITE = 'I' and b.SUB_D = 'IM' and b.dep = 'IS' and a.facility = b.facility and a.PRODUCT = b.PRODUCT and a.OPERATION = b.OPERATION and a.ROUTE = b.ROUTE and a.EQUIPMENT = b.EQUIPMENT and a.facility = c.facility and a.operation = c.operation and a.Equipment = '123' and b.RECIPE = '456' and a.LO = 'ZD34'



  • Ich habe mit string und der Methode c_str() noch nicht gearbeitet. Ich verwende CString-Objekte in diesem Fall.

    CString sql = "Select OPERATION,ROUTE from DWH_ADMIN.DWH_WIP_DATA_7 where TRANSCODE = 'M' and EQUIPMENT = '123' and LO = 'ZD34' and TIME_STAMP > to_date('2003-08-22 05:08:09','YYYY-MM-DD HH24:MI:SS') and TIME_STAMP < to_date('2003-08-22 08:08:09','YYYY-MM-DD HH24:MI:SS');
    number.Open(CRecordset::snapshot, sql,CRecordset::none);
    sql = number.GetSql();    //schau dir mal an, was du von GetSql() zurückbekommst
    

    Die WHERE-clausel kannst du auch in number.m_strFilter unterbringen, bevor du den Recordset öffnest.

    CString sql = "Select OPERATION,ROUTE from DWH_ADMIN.DWH_WIP_DATA_7";
    number.m_strFilter = "TRANSCODE = 'M' and EQUIPMENT = '123' and LO = 'ZD34' and TIME_STAMP < to_date('2003-08-22 05:08:09','YYYY-MM-DD HH24:MI:SS') and TIME_STAMP < to_date('2003-08-22 08:08:09','YYYY-MM-DD HH24:MI:SS')";
    number.Open(CRecordset::snapshot, sql,CRecordset::none);
    sql = number.GetSql();
    


  • Wofür steht CRecordset::none?

    Mit GetSQL() bekomme ich bei der Exception nichts zurück, denn das passiert genau bei number.Open(***), weiter geht es dann nicht mehr. Wenn ich die Exception hinbekomme, dann sollte das Problem ja auch gelöst sein.


Anmelden zum Antworten