{"id":146,"date":"2007-11-01T20:05:21","date_gmt":"2007-11-01T19:05:21","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/11\/01\/mal-ganz-schnell-sich-selbst-reingelegt-mit-excel-und-crecordsetoptimizebulkadd\/"},"modified":"2007-10-30T20:31:57","modified_gmt":"2007-10-30T19:31:57","slug":"mal-ganz-schnell-sich-selbst-reingelegt-mit-excel-und-crecordsetoptimizebulkadd","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/11\/01\/mal-ganz-schnell-sich-selbst-reingelegt-mit-excel-und-crecordsetoptimizebulkadd\/","title":{"rendered":"Mal ganz schnell sich selbst reingelegt mit Excel und CRecordset::optimizeBulkAdd"},"content":{"rendered":"<p>Um eine gr\u00f6\u00dfere Datenmenge in Excel \u00fcber eine <em>ODBC <\/em>Verbindung zu erzeugen habe ich einen entsprechenden Recordset ge\u00f6ffnet und Daten massenweise hineingepumpt. Die Tabelle (das Worksheet), das erzeugt wurde enthielt Spalten mit Text-, Numerischen-, und Zeitdaten. Einige der Daten sollten wurden mit <em>NULL <\/em>Werten erzeugt werden.<\/p>\n<p>Entsprechend den Tipps in der <a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/1hkkwdf0(VS.80).aspx\">Doku <\/a>habe ich die zus\u00e4tzliche Option <em>CRecordset::optimizeBulkAdd<\/em> zu <em>CRecordset::appendOnly <\/em>verwendet um das zu beschleunigen.<\/p>\n<p class=\"ccode\">m_recordSet.Open(CRecordset::snapshot,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NULL,<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CRecordset::appendOnly|CRecordset::optimizeBulkAdd);<\/p>\n<p>Laut der Doku sollte das erste Statement entsprechend f\u00fcr alle weiteren Operationen, den Dirty-Status setzten. Fein (dachte ich), alle Daten des Recordsets werden gesetzt, entweder auf den entsprechenden Wert oder <em>NULL<\/em>.<\/p>\n<p>Alle Tests waren &#8222;erstmal&#8220; positiv. Die Daten wurden in guter Geschwindigkeit erzeugt.<br \/>\nLeider stellten Kunden dann fest (allerdings Wochen sp\u00e4ter), dass unter bestimmten Umst\u00e4nden ganze Spalten leer waren. Sobald in der ersten Zeile einmal in einer Spalte <em>NULL <\/em>ausgegeben wurde, dann wurde auch in allen folgenden Spalten kein Wert eingetragen. Das Ganze, obwohl die Daten korrekt gebunden und als dirty markiert wurden. An das Open Statement dachte ich nicht&#8230;<\/p>\n<p>Nach langem Testen nahm ich schon an, einen Bug in dem ODBC Treiber gefunden zu haben. Stutzig wurde ich aber, dass alles prima klappte, wenn ich pure SQL INSERT-Statements mit <em>ExecuteSQL\u00a0 <\/em>direkt ausl\u00f6ste, ohne den Recordset zu bem\u00fchen. Was nun?<\/p>\n<p>Relativ ratlos wollte ich schon einen Supportfall bei Microsoft \u00f6ffnen, bis ich den Code noch einmal Schritt f\u00fcr Schritt durchsah und wieder \u00fcber das das Open Statement stolperte.<\/p>\n<p>Bingo: Sobald ich dieses Flag entfernte arbeitete alles korrekt. Nach meinem Verst\u00e4ndnis m\u00fcsste auch ein <em>NULL <\/em>Wert ein Wert sei, der g\u00fcltig ist, solange ich alle Spalten beim ersten <em>INSERT\/AddNew<\/em> angebe. Ich nahm an, dass auch ein Einf\u00fcgen eines <em>NULL <\/em>Wertes ein &#8222;Dirty&#8220; f\u00fcr die entsprechende Spalte ausl\u00f6st. Das ist aber nicht so.<\/p>\n<p>Wird &#8211; zumindest beim <em>ODBC <\/em>Treiber f\u00fcr Excel &#8211; in dem ersten <em>INSERT <\/em>eines Datensatzes ein <em>NULL <\/em>Wert ausgegeben , dann werden auch keine Daten f\u00fcr alle nachfolgenden Zeilen eingef\u00fcgt. Und das <em>NULL <\/em>eingef\u00fcgt wird, geschieht ganz schnell, wenn z.B. ein leeres Textfeld (L\u00e4nge 0) ausgegeben werden soll. Ob dies auch f\u00fcr Access oder andere Treiber gilt habe ich noch nicht ausprobiert.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um eine gr\u00f6\u00dfere Datenmenge in Excel \u00fcber eine ODBC Verbindung zu erzeugen habe ich einen entsprechenden Recordset ge\u00f6ffnet und Daten massenweise hineingepumpt. Die Tabelle (das Worksheet), das erzeugt wurde enthielt Spalten mit Text-, Numerischen-, und Zeitdaten. Einige der Daten sollten wurden mit NULL Werten erzeugt werden. Entsprechend den Tipps in der Doku habe ich die &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/11\/01\/mal-ganz-schnell-sich-selbst-reingelegt-mit-excel-und-crecordsetoptimizebulkadd\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eMal ganz schnell sich selbst reingelegt mit Excel und CRecordset::optimizeBulkAdd\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30,4,3],"tags":[370,352],"class_list":["post-146","post","type-post","status-publish","format-standard","hentry","category-c","category-mfc","category-programmieren","tag-c","tag-mfc"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=146"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/146\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}