<?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[OLEDB - wie kann man einen neuen Datensatz anlegen?]]></title><description><![CDATA[<p>Ich hoffe ich bin im richtigen Forum. Denke aber das mein Problem mehr was mit der MFC wie mit der eigentlichen Datenbank zu tun hat.<br />
Ich greife per OLEDB (OLEDB-Provider für ODBC) af eine MYSQL-Datenbank zu. Das Aslesen der Datensätze und das navigieren darin funktioniert. Nur wie kann ich darin einen neuen Datensatz anlegen? Bei ODBC gabs da die Memberfunktion m_pSet-&gt;AddNew(), der Zeiger meiner OLEDB-Klasse kennt die aber nicht? Ich habs schon mit Insert() versucht, nur da bricht das Programm ab. Hat da jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182284/oledb-wie-kann-man-einen-neuen-datensatz-anlegen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 13:55:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182284.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 May 2007 11:39:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Wed, 23 May 2007 11:39:07 GMT]]></title><description><![CDATA[<p>Ich hoffe ich bin im richtigen Forum. Denke aber das mein Problem mehr was mit der MFC wie mit der eigentlichen Datenbank zu tun hat.<br />
Ich greife per OLEDB (OLEDB-Provider für ODBC) af eine MYSQL-Datenbank zu. Das Aslesen der Datensätze und das navigieren darin funktioniert. Nur wie kann ich darin einen neuen Datensatz anlegen? Bei ODBC gabs da die Memberfunktion m_pSet-&gt;AddNew(), der Zeiger meiner OLEDB-Klasse kennt die aber nicht? Ich habs schon mit Insert() versucht, nur da bricht das Programm ab. Hat da jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290578</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Wed, 23 May 2007 11:39:07 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Wed, 23 May 2007 14:18:15 GMT]]></title><description><![CDATA[<p>Hab jetzt rausgefunden, dass Insert E_NOINTERFACE returniert. Kann es sein das ich keine Schreibrechte auf die DB habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1290761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1290761</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Wed, 23 May 2007 14:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 05:54:51 GMT]]></title><description><![CDATA[<p>Nein! Vermutlich hast Du einfach kein offenes Rowset. Was machst Du denn eigentlich?<br />
Zeige uns mal etwas Code!</p>
<p>Verwendest Du die ATL OLEDB Client Templates?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291168</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 24 May 2007 05:54:51 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 08:59:09 GMT]]></title><description><![CDATA[<p>Da muss ich glaub ich nochmal etwas weiter ausholen. Ich habe im ODBC-Admin eine normale ODBC-Verbindung als System-DSN angelegt. Der Verbinungstest funktioniert auch. Dann hab ich einfach nur zum Test eine SDI-Anwendung mit Datenbankunterstütung erstellt. Direkt ODBC zu verwenden funktioniert nicht, da er dort die Tabellen komischerweise nicht findest bzw. schon beim Projektanlegen das VS <a href="http://2003.net" rel="nofollow">2003.net</a> sich komplett schließt. Dazu hatte ich schon mal angefragt: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-162008-and-start-is-.html" rel="nofollow">hier</a> und <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-162918-and-highlight-is-.html" rel="nofollow">hier</a>.<br />
Also jetzt das ganze mit OLE DB. Die Klasse sieht wie folgt aus:</p>
<pre><code class="language-cpp">/ MySQL_OLEDBSet.h: Schnittstelle der Klasse CMySQL_OLEDBSet
//

#pragma once

// Code generiert auf Mittwoch, 23. Mai 2007, 08:39

[
//	#error Sicherheitsproblem: Die Verbindungszeichenfolge enthält möglicherweise ein Kennwort
// Die Verbindungszeichenfolge enthält möglicherweise einfache Textkennwörter und/oder
// andere vertrauliche Informationen. Entfernen Sie #error, nachdem Sie die
// Verbindungszeichenfolge überprüft haben. Sie können das Kennwort
// in einem anderen Format speichern oder eine andere Benutzerauthentifizierung verwenden.
db_source(L&quot;Provider=MSDASQL.1;Persist Security Info=False;User ID=root;Data Source=testconnection;Mode=ReadWrite;Extended Properties=\&quot;DATABASE=test;DSN=testconnection;OPTION=0;PORT=0;SERVER=localhost;UID=root\&quot;&quot;),
	db_table(L&quot;tabelle1&quot;)
]
class CMySQL_OLEDBSet
{
public:
	[ db_column(1, status=m_dwIDStatus, length=m_dwIDLength) ] LONG m_ID;
	[ db_column(2, status=m_dwDatenStatus, length=m_dwDatenLength) ] TCHAR m_Daten[46];

	// Folgende vom Assistenten generierte Datenmember enthalten Statuswerte
	// für die entsprechenden Felder. Sie können
	// diese Werte als Null-Werte, die von der Datenbank
	// zurückgegeben werden, oder für vom Compiler ausgegebene Fehlerinformationen verwenden.
	// Weitere Informationen finden Sie in der Visual C++-Dokumentation unter Datenmember.
	// Hinweis: Diese Felder müssen vor dem Einfügen von Daten initialisiert werden.

	DBSTATUS m_dwIDStatus;
	DBSTATUS m_dwDatenStatus;

	// Folgende vom Assistenten generierte Datenmember enthalten Längenwerte
	// für die entsprechenden Felder.
	// Hinweis: Für Spalten mit variablen Längen müssen diese
	//       Felder vor dem Einfügen von Daten initialisiert werden.

	DBLENGTH m_dwIDLength;
	DBLENGTH m_dwDatenLength;

	void GetRowsetProperties(CDBPropSet* pPropSet)
	{
		pPropSet-&gt;AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
	}
};
</code></pre>
<p>Die DB enthält eine Tabelle, die nur aus einer Indexspalte und einer Datenspalte besteht. Um einen neuen Datensatz anzulegen gehe ich wie folgt vor:</p>
<pre><code class="language-cpp">void CMySQL_OLEDBView::OnBnClickedNeu()
{
	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
	m_pSet-&gt;MoveLast();
	m_pSet-&gt;m_ID=m_pSet-&gt;m_ID+1;
	strcpy(m_pSet-&gt;m_Daten,&quot;neu&quot;);
	UpdateData();
	HRESULT hr=m_pSet-&gt;Insert();
	if ( hr != S_OK )
	{
		AfxMessageBox(&quot;hat nicht funktioniert&quot;);
	}
	m_pSet-&gt;UpdateAll();
}
</code></pre>
<p>Beim Debuggen hat hr entweder den Wert E_NOINTERFACE oder E_FAIL. In der MSDN steht dazu:</p>
<blockquote>
<p>Remarks</p>
<p>This method requires the optional interface IRowsetChange, which might not be supported on all providers; if this is the case, the method returns E_NOINTERFACE. You must also set DBPROP_IRowsetChange to VARIANT_TRUE before calling Open on the table or command containing the rowset.</p>
<p>Insert might fail if one or more columns is not writable. Modify your cursor map to correct this.</p>
</blockquote>
<p>Wenn ich aber</p>
<pre><code class="language-cpp">void GetRowsetProperties(CDBPropSet* pPropSet)
	{
		pPropSet-&gt;AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_IRowsetChange, VARIANT_TRUE);

	}
</code></pre>
<p>erweitere, dann kann er die Datenbank nicht öffen. Hab leider noch nicht so viel Erfahrung mit OLE DB, wollte aber die MYSQL C++ API vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291269</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Thu, 24 May 2007 08:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 11:08:09 GMT]]></title><description><![CDATA[<p>AndyDD schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Hinweis: Diese Felder müssen vor dem Einfügen von Daten initialisiert  werden.
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1291330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291330</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Thu, 24 May 2007 11:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 11:21:46 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>AndyDD schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Hinweis: Diese Felder müssen vor dem Einfügen von Daten initialisiert  werden.
</code></pre>
</blockquote>
</blockquote>
<p>Ok, das hab ich nicht beachtet. Aber wie macht man das? Was bedeutet dieser Status? Die Angaben in der MSDN helfen mir da auch nicht so richtig weiter. Aber der Rückgabewert E_NOINTERFACE deutet meiner Meinung nach nicht auf irgendein Statusproblem hin.<br />
Ich werde das Gefühl nicht los das irgendwas mit den RowsetProperties nicht stimmt....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291337</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291337</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Thu, 24 May 2007 11:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 11:21:07 GMT]]></title><description><![CDATA[<p>DBSTATUS gibt an ob das Feld beim Insert verwendet werden soll, oder NULL enthält uws. Lies die entsprechende MSDN Doku dazu.</p>
<p>Allerdings wird weder Länge noch Status zum Binden benötigt.</p>
<p>Tipp: Vergiss Attributed ATL. Du hast nur Scherereien damit!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291340</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 24 May 2007 11:21:07 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 11:23:52 GMT]]></title><description><![CDATA[<p>Martin Richter schrieb:</p>
<blockquote>
<p>DBSTATUS gibt an ob das Feld beim Insert verwendet werden soll, oder NULL enthält uws. Lies die entsprechende MSDN Doku dazu.</p>
<p>Allerdings wird weder Länge noch Status zum Binden benötigt.</p>
<p>Tipp: Vergiss Attributed ATL. Du hast nur Scherereien damit!</p>
</blockquote>
<p>Danke, das bestätigt meinen Verdacht. Ich weiß das ich das z.B. zum Änderen von Feldinhalten benötige, wenn sich z.B. die Stringlänge ändert.<br />
Wenn ich Attributed ATL vergessen soll, was schlägst Du für eine Alternative vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291343</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Thu, 24 May 2007 11:23:52 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 12:25:58 GMT]]></title><description><![CDATA[<p>Die normale ATL OLE DB Client Variante. So anders ist das auch nicht. Etwas mehr Schreibarbeit.</p>
<p>Aber da kannst Du wenigstens Debuggen und sehen was wo passiert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291378</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 24 May 2007 12:25:58 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 13:44:54 GMT]]></title><description><![CDATA[<p>Was ist da genau der Unterschied bzw. wie kann man das umsetzen? Wie gesagt ich habe leider keine Ahnung davon, bin aber nun gezwungen mich damit zu befassen. Aber ich hab jetzt mich doch noch mal tiefer in die MSDN eingelesen und folgendes ergänzt:</p>
<pre><code class="language-cpp">void GetRowsetProperties(CDBPropSet* pPropSet)
	{
		pPropSet-&gt;AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_IRowsetChange, true, DBPROPOPTIONS_OPTIONAL);
		pPropSet-&gt;AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);

	}
</code></pre>
<p>Und jetzt kann ich Datensätze einfügen. Nur noch eine Frage: muss ich den Index (der in der DB als Primärschlüssel fungiert) vorgeben oder wird der von der DB beim Anlegen des neuen Datensatzes erstellt? Die Spalteneigenschaft der ID-Spalte steht ja auf AUTO INCREMENT.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291428</guid><dc:creator><![CDATA[AndyDD]]></dc:creator><pubDate>Thu, 24 May 2007 13:44:54 GMT</pubDate></item><item><title><![CDATA[Reply to OLEDB - wie kann man einen neuen Datensatz anlegen? on Thu, 24 May 2007 14:03:45 GMT]]></title><description><![CDATA[<p>Was soll ich da erklären? Du musst halt die normalen CCommand&lt;&gt; CRowset&lt;&gt; und so weiter templates verwenden.</p>
<p>Autoinc-Schlüssel werden von jeder DB anders behandelt.<br />
Normalerweise muss der AutoInc Schlüssel gar nicht übergeben werden/gebunden. Bei einem Insert, das ist ja der Sinn. So ist das jedenfalls bei MS-SQL.</p>
<p>Ob die erzeugte ID zurückgeliefert werden kann liegt auch am Provider. MS-SQL benötigt dafür DBPROP_SERVERDATAONINSERT!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291434</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Thu, 24 May 2007 14:03:45 GMT</pubDate></item></channel></rss>