Domino 9 und frühere Versionen > ND6: Entwicklung
Probleme beim Schreiben von Daten über ODBC in SQL Server
m3:
--- Zitat von: PeterD2 am 30.04.08 - 14:28:03 ---Mein "echter" Agent enthält sehr wohl eine Prüfung, aber das bringt mich nicht weiter:
--- Code: ---If Not con.ConnectTo(dsn,user,passwd) Then
Messagebox "Could not connect to " & dsn,, "Error"
Exit Sub
End If
--- Ende Code ---
--- Ende Zitat ---
Meine Kristallkugel feiert schon den Tag der Arbeit. Daher musst du arbeiten:
Wenn der Code drinnen ist, bekommst Du dann eine Fehlermeldung oder nicht? (Informationen aus der Nase zieh).
PeterD2:
Also wenn da eine Messagebox aufginge, würde ich Euch nicht mit so schwammigen Vermutungen nerven, sondern einfach fragen warum keine Verbindung zustande kommt. Also es kommt definitiv eine Verbindung zustande, wie ich oben ja schon schrieb konnte ich die Tabellennamen ja bereits auslesen. Eine Glaskugel ist also nicht nötig. Ich habe mittlerweile auch noch ein paar von den Beispielen aus der Designer Hilfe ausprobiert, so Sachen wie Auslesen der Tabellenspalten, Anzeige von ein paar Feldwerten in einer Messagebox, usw. Alles klappt bestens.
Also zurück zur ursprünglichen Überschrift dieses Threads: "Probleme beim SCHREIBEN von Daten über ODBC in SQL Server"
Mein Problem ist dass ich nur weiß dass bei
--- Code: ---status = result.UpdateRow
--- Ende Code ---
am Ende status = false ist. Warum, verrät mir weder Notes, noch der ODBC Treiber, noch das Fehlerlog des Datenbankservers. Mögliche Ursachen währen:
- Falsche Werte für die Felder beim INSERT, bzgl. Verletzung eines Contraints in der DB
Kann ich ausschliessen, denn bis auf eine Autowert ID-Spalte gibt es keine NOT NULL Felder, und die Testdaten aus meinem Testagent sind auch OK (Feldlängen, Datentypen usw.).
- Berechtigungsprobleme meines technischen Users
Kann ich auch ausschliessen, denn wenn ich mich mit dem technischen Account direkt am Microsoft Management Studio anmelde kann ich dort problemlos damit INSERT Statements absetzen.
PeterD2:
So, Problem gelöst. Hier die Lösung:
In allen Beispielen zu ODBC Klassen in der Designer Hilfe sieht man, dass zunächst eine Query ausgeführt wird, wie ich meinte um unter Anderem dem ODBC Resultset zu sagen aus welchen Tabellen er lesen, und in welche er bei einem AddRow/UpdDate Row schreiben soll. So wie in meinem Beispiel:
--- Code: ---qry.SQL = "SELECT * FROM ADDRESSRECORDS"
--- Ende Code ---
Während der bisher bei mir eingesetzte ODBC-Treiber für MySQL offensichtlich einen serverseitigen Cursor für das Recordset benutzt, verwendet der Treiber für den MS SQL Server einen clientseitigen Cursor, und lädt gemäß der Abfrage (select * from ...) erst einmal alle Daten nach Notes. In meinem Fall ist das eine Tabelle mit ca. 60 Spalten und ca. 200.000 Datensätzen. Das dauert natürlich eine Weile. Währenddessen wird aber der Code des Agenten weiter ausgeführt, und wenn schliesslich mit
--- Code: ---status = result.UpdateRow
--- Ende Code ---
die neue Zeile in die Datenbank geschrieben werden soll, ist diese noch mit dem ersten Select beschäftigt, und die Verbindung blockiert. Das erklärt auch, warum ich zwar die Spaltennamen und ein paar erste Datensätze lesen konnte, nicht aber die Anzahl der Zeilen ausgeben konnte, denn das Einlesen der Daten war noch in vollem Gange.
Da ich ja eigentlich nichts aus der Datenbank lesen will, reicht es die Query so zu ändern:
--- Code: ---qry.SQL = "SELECT * FROM ADDRESSRECORDS where 0 =1 "
--- Ende Code ---
Diese Abfrage ist schnell ausgeführt, und das Schreiben in die Datenbank funktioniert nun.
Danke an alle, die mir helfen wollten.
m3:
LOL. Schräg! Danke für die Rückmeldung.
Navigation
[0] Themen-Index
[*] Vorherige Sete
Zur normalen Ansicht wechseln