<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Programm hängt während Datenbankabfrage]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich schreibe gerade ein Programm, dass mit OLE DB auf eine Oracle DB zugreift und dort eine Stored Procedure aufruft.</p>
<p>Mein Problem ist nun, dass während dieses Aufrufs mein Programm hängt, bis die Funktion 'zurückkehrt'.</p>
<p>Hier mal meinen Aufruf:</p>
<pre><code class="language-cpp">CCommand&lt;CAccessor&lt;CDBAccessor&gt;,CNoRowset&gt; command;
//alle Parameter zurücksetzen
command.ClearRecord();

//StoredProcedure aufrufen - hier hängt die Anwendung bis die Procedure fertig ist
HRESULT hr = command.Open(*m_session, _T(&quot;{ CALL FIND_ARTIKEL (?, ?, ?) }&quot;));
if(FAILED(hr)) 
   AfxMessageBox(&quot;StoredProcedure nicht ausführbar!&quot;);
else 
   AfxMessageBox(&quot;Erfolgreich ausgeführt!&quot;);
command.Close();
</code></pre>
<p>Ich hab auch schon versucht die Datenbankabfrage aus einem Workerthread heraus zu starten und bin leider gescheitert, da er zur DB keine Verbindung bekommt.</p>
<p>Weiß jemand Rat?<br />
Vielen Dank für Tipps!</p>
<p>Grüße<br />
Mav</p>
<p>BTW: Ist dass das Richtige Forum für sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/44389/programm-hängt-während-datenbankabfrage</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 09:22:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/44389.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 30 Jul 2003 16:28:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Wed, 30 Jul 2003 16:28:28 GMT]]></title><description><![CDATA[<p>Hi zusammen,</p>
<p>ich schreibe gerade ein Programm, dass mit OLE DB auf eine Oracle DB zugreift und dort eine Stored Procedure aufruft.</p>
<p>Mein Problem ist nun, dass während dieses Aufrufs mein Programm hängt, bis die Funktion 'zurückkehrt'.</p>
<p>Hier mal meinen Aufruf:</p>
<pre><code class="language-cpp">CCommand&lt;CAccessor&lt;CDBAccessor&gt;,CNoRowset&gt; command;
//alle Parameter zurücksetzen
command.ClearRecord();

//StoredProcedure aufrufen - hier hängt die Anwendung bis die Procedure fertig ist
HRESULT hr = command.Open(*m_session, _T(&quot;{ CALL FIND_ARTIKEL (?, ?, ?) }&quot;));
if(FAILED(hr)) 
   AfxMessageBox(&quot;StoredProcedure nicht ausführbar!&quot;);
else 
   AfxMessageBox(&quot;Erfolgreich ausgeführt!&quot;);
command.Close();
</code></pre>
<p>Ich hab auch schon versucht die Datenbankabfrage aus einem Workerthread heraus zu starten und bin leider gescheitert, da er zur DB keine Verbindung bekommt.</p>
<p>Weiß jemand Rat?<br />
Vielen Dank für Tipps!</p>
<p>Grüße<br />
Mav</p>
<p>BTW: Ist dass das Richtige Forum für sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321163</guid><dc:creator><![CDATA[Mav]]></dc:creator><pubDate>Wed, 30 Jul 2003 16:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Thu, 31 Jul 2003 04:33:02 GMT]]></title><description><![CDATA[<p>Wenn du Code ausführst der lange dauert dann wird die Messageschleife nicht ausgeführt.<br />
Es kann immer nur eine Zeile im Code ausgeführt werden und das ist in deinem Fall nunmal der DB-Code.<br />
Du wirst also nicht um Threads herum kommen.</p>
<p>Verwende die Klasse CWinThread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321499</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Thu, 31 Jul 2003 04:33:02 GMT</pubDate></item><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Thu, 31 Jul 2003 08:06:44 GMT]]></title><description><![CDATA[<p>Ich hab den Hinweis aufgenommen und mir ne Thread-Klasse angelegt (wie in der FAQ beschrieben) und rufe nun folgendermaßen auf:</p>
<pre><code class="language-cpp">//Starte den Thread...
m_StatusThread = (CStatusThread*) 
     AfxBeginThread(RUNTIME_CLASS(CStatusThread), NULL, 0, CREATE_SUSPENDED);
m_StatusThread-&gt;SetOwner(this);
m_StatusThread-&gt;ResumeThread();

//...und dann die Datenbankabfrage...
CCommand&lt;CAccessor&lt;CDBAccessor&gt;,CNoRowset&gt; command; 
//alle Parameter zurücksetzen 
command.ClearRecord(); 

//StoredProcedure aufrufen - hier hängt die Anwendung bis die Procedure fertig ist 
HRESULT hr = command.Open(*m_session, _T(&quot;{ CALL FIND_ARTIKEL (?, ?, ?) }&quot;)); 
if(FAILED(hr))  
   AfxMessageBox(&quot;StoredProcedure nicht ausführbar!&quot;); 
else  
   AfxMessageBox(&quot;Erfolgreich ausgeführt!&quot;); 
command.Close();
</code></pre>
<p>In die Funktion CStatusThread::Run() hab ich nur ne MessageBox in ner Schleife drin.</p>
<p>Jetzt ist es allerdings so, dass er die MessageBoxaufrufe erst bringt, wenn die DB-Abfrage abgelaufen ist - also bleibt das Programm quasi immernoch stehen.</p>
<p>Ich habs auch schon andersherum probiert, dass ich die DB-Abfrage in die Run() reinschreibe:</p>
<pre><code class="language-cpp">//Vorbereitung
class CTestView
{
  CDataSource* m_db;
  CDBPropSet*	dbinit;
  CSession* m_session;
  [...]
}

//Datenbank beim Start der Anwendung initialisieren
void CTestView::OnInitialUpdate()
{
  //DB initialisieren:
  HRESULT		hr;

  //Open DataSource
  m_db = new CDataSource();

  //Eigenschaften festlegen
  dbinit = new CDBPropSet(DBPROPSET_DBINIT);
  dbinit-&gt;AddProperty(DBPROP_INIT_LCID, (long)1031);
  dbinit-&gt;AddProperty(DBPROP_INIT_PROMPT, (short)4);
  dbinit-&gt;AddProperty(DBPROP_INIT_PROVIDERSTRING, OLESTR(&quot;&quot;));
  hr = m_db-&gt;Open(_T(&quot;OraOLEDB.Oracle.1&quot;), dbinit);

  //Start Session
  m_session = new CSession();
  hr = m_session-&gt;Open(*m_db);
}

//...und wenn der Thread gestartet wird...
void CStatusThread::Run()
{
  CCommand&lt;CAccessor&lt;CDBAccessor&gt;,CNoRowset&gt; command; 
  //alle Parameter zurücksetzen 
  command.ClearRecord(); 

  HRESULT hr = command.Open(*((CTestView*) m_pOwner)-&gt;m_session, _T(&quot;{ CALL FIND_ARTIKEL (?, ?, ?) }&quot;)); 
  if(FAILED(hr))  
     AfxMessageBox(&quot;StoredProcedure nicht ausführbar!&quot;); 
  else  
     AfxMessageBox(&quot;Erfolgreich ausgeführt!&quot;); 
  command.Close();
}
</code></pre>
<p>Hier bringt er mir eine Unbehandelte Ausnahme (Access Violation) beim Aufruf von command.open(...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321581</guid><dc:creator><![CDATA[Mav]]></dc:creator><pubDate>Thu, 31 Jul 2003 08:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Thu, 31 Jul 2003 11:12:09 GMT]]></title><description><![CDATA[<p>ist ja auch klar das die MessageBox erst nach der Datenbankabfrage kommt da ein Code Zeile für Zeile abgearbeitet wird.</p>
<p>Dein Programm bleibt aber nicht hängen da die Messageschleife in einem anderen Thread (HauptDlgThread) abgearbeitet wird und die Oberfläche noch reagiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321731</guid><dc:creator><![CDATA[Unix-Tom]]></dc:creator><pubDate>Thu, 31 Jul 2003 11:12:09 GMT</pubDate></item><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Thu, 31 Jul 2003 13:33:52 GMT]]></title><description><![CDATA[<p>Hmm, ich schätze ich hab das mit den Threads noch nicht ganz verstanden.</p>
<p>Angenommen ich definiere meine CStatusThread::Run() so:</p>
<pre><code class="language-cpp">int CStatusThread::Run()
{
  int i = 0;

  while(i &lt; 100)
  {
    AfxMessageBox(&quot;Thread&quot;);
    i++;
  }
  return 0;
}
</code></pre>
<p>Wenn ich jetzt aus meiner Hauptanwendung den Thread starte und anschließend meinen DB-Aufruf (ebenfalls aus der Hauptanwendung) starte müsste ich doch während der DB-Abruf abläuft, 100 MessageBoxs zu sehen bekommen - da ja der Thread selbst weiter läuft - oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321864</guid><dc:creator><![CDATA[Mav]]></dc:creator><pubDate>Thu, 31 Jul 2003 13:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Programm hängt während Datenbankabfrage on Thu, 31 Jul 2003 15:41:52 GMT]]></title><description><![CDATA[<p>So, warum eine AccessViolation in der zweiten Variante hervorgerufen wird (wenn der DB-Abruf im Thread realisiert ist) hab ich jetzt.<br />
--&gt; OLE DB muss in jedem Thread initialisiert werden. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Für alle die's interessiert:</p>
<p>Damit man also Threads nutzen kann, muss in der InitInstance() der Thread-Klasse die Funktion CoInitialize(NULL) aufgerufen werden, entsprechend in der ExitInstance() dann CoUninitialize(). <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Könnte dann so aussehen:</p>
<pre><code class="language-cpp">BOOL CStatusThread::InitInstance()
{
	HRESULT hRes = CoInitialize(NULL);
	if(FAILED(hRes)) return FALSE;

	return TRUE;
}

int CStatusThread::ExitInstance()
{
	CoUninitialize();

	return CWinThread::ExitInstance();
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/156">@Unix-Tom</a>: Danke für Deine Unterstützung und vor allem dem Hinweis auf die CWinThread-Klasse!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Mit Worker-Threads hab ich's net hinbekommen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/321978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/321978</guid><dc:creator><![CDATA[Mav]]></dc:creator><pubDate>Thu, 31 Jul 2003 15:41:52 GMT</pubDate></item></channel></rss>