| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: SQL Verbindung per AutoLISP (1277 / mal gelesen)
|
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 18. Jan. 2022 15:46 <-- editieren / zitieren --> Unities abgeben:
Hallo Experten, weißt jemand, ob eine Verbindung zu SQL Datenbank unter Autocad möglich ist? Wenn ja, gibt es Befehle unter LISP dafür? Hat jemand von euch bereits damit zu tun? Danke und Gruß; Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 18. Jan. 2022 17:00 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, suche mal nach ADOlisp. Es geht, aber Spaß macht es damit nicht. Ich würde da immer auf .Net zurückgreifen und dort die notwendigen Lisp-Befehle definieren, sofern die Funktionen überhaupt noch mit Lisp angesprochen werden müssen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 19. Jan. 2022 06:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, danke für seine Antwort! Hast Du bereits eine solche Datenbank-Verbindung aufgebaut und damit gearbeitet? Ich möchte letztendlich Daten aus einem SQL Server lesen können und in LISP Variablen übergeben, bzw. umgekehrt, Daten aus LISP Variablen in die SQL Datenbank schreiben können. Deshalb bin ich dabei die Möglichkeiten auszuloten, ob dies überhaupt aus einer Lisp-Rutine heraus geht, und wenn ja, wie? Gruß, Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Vino Mitglied
Beiträge: 229 Registriert: 24.05.2005 Windows 10 BricsCAD Pro V23
|
erstellt am: 19. Jan. 2022 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, Zuerst mal wäre interessant zu was für einem DB-System du dich verbinden willst. Davon hängt dann ab, ob du eventuell erst noch was (bei mySQL z.b. den ODBC-Treiber) installieren musst. Ich hatte mir mal vor einiger Zeit diesen Code (aus nicht mehr bekannten Quellen) zusammengestückelt:
Code:
(defun mysqlQuery (server db bn pw Query / $acad dbConn dbConnString dbResult field item) (setq $acad (vlax-get-acad-object)) (setq dbConn (vla-GetInterfaceObject $acad "ADODB.Connection")) (setq dbConnString (strcat "DRIVER={MySQL ODBC 8.0 Unicode Driver}; SERVER=" server "; DATABASE=" db "; UID=" bn "; PWD=" pw "; OPTION=3")) (vlax-invoke dbConn "Open" dbConnString) (setq dbResult (vlax-invoke dbConn "Execute" Query)) (setq field (vlax-get-property dbResult "Fields")) (setq count (vlax-get-property field "Count")) (while (not (equal :vlax-true (vlax-get-property dbResult "EOF"))) (setq n2 0) (repeat count (princ "\nFELD: ")(princ (cons (vlax-get-property (vlax-get-property field "Item" n2) "Name") (vlax-variant-value (vlax-get-property (vlax-get-property field "Item" n2) "Value")))) (setq n2 (1+ n2)) ) (vlax-invoke-method dbResult "movenext") ) (vlax-invoke-method dbConn "Close") (vlax-release-object dbConn) (vlax-release-object $acad) (princ) )
Damit konnte ich SELECT-Abfragen auf einer MySQL-DB absetzen und hab auch passende Ergebnisse bekommen. Bis zu UPDATE oder DELETE bin ich nie gekommen, denke aber dass dann halt nach "Execute" Schluss sein müsste. Wichtig ist die Zeile 4. Der Connectionstring ist von der Datenbank und Treiber(-Version) abhängig. Aber ich habe jetzt auch mal nach ADOLisp gegoogelt... Das gibts zum Download und ist mit Sicherheit besser programmiert und vermutlich auch flexibler als meins ;-)
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 19. Jan. 2022 22:10 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, ich arbeite schon über 10 Jahre mit ADOLisp schreibe und lese in eine Access Datenbank, bei über 700000 Datensätzen die ich einlese daudert es zwar etwas länger, aber bis um die 500 Datenätze geht es recht zügig. Also für ein paar Daten ist es durch aus breauchbar, ist halt ein bisschen tipperei aber es geht. Ansonsten gild natürlich was in den vorherigen Beiträgen gesagt wurde, was die Datenbank betrifft. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Peter2 Ehrenmitglied V.I.P. h.c.
Beiträge: 3849 Registriert: 15.10.2003
|
erstellt am: 20. Jan. 2022 11:35 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
|
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 21. Jan. 2022 12:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Vino, vielen Dank für deine ausführliche Antwort und Code! Ich möchte letztendlich die Verbindung mit einem MySQL (MariaDB) per Lisp unter Acad erzielen. Da ich mit Lisp noch nie eine Datenbank angesprochen habe, würde ich erst versuchen die Verbindung per ODBC zu einer Access-Datei (.mdb) zu programmieren, um zu sehen, welche Logik dies verfolgt. Ich denke, diese Technik unter Lisp funktionieren sollte bzw. es liegen viele Beispielcodes dafür vor, viele haben dies bereits programmiert. Wenn dies funktioniert, werde ich in einem zweiten Schritt die Verbindung über ODBC zu eine MySQL Datenbank versuchen. Hast Du jeweils so eine Verbindung zu ODBC/Access unter Lisp verwendet? Viele Grüße, Manfred [Diese Nachricht wurde von ManfredMann am 21. Jan. 2022 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 21. Jan. 2022 16:21 <-- editieren / zitieren --> Unities abgeben:
Hallo Niggemann, danke für die Hinweise. wie ich eben Vino geschrieben habe, würde ich erst versuchen, die Verbindung per ODBC zu einer Access-Datei (.mdb) zu programmieren, um zu sehen, welche Lisp Befehle dabei verwendet werden. Ich denke, diese Technik unter Lisp funktionieren sollte, bzw. es liegen viele Beispielcodes dafür vor, viele haben dies bereits programmiert. Wenn dies funktioniert, werde ich in einem zweiten Schritt die Verbindung über ODBC zu eine MySQL Datenbank versuchen. Hast Du jeweils so eine Verbindung zu ODBC/Access unter Lisp verwendet? Danke und Gruß, Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 21. Jan. 2022 19:39 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, versuche es mal damit (vl-load-com) (if (not ADOLISP_ConnectToDB) (load "ADOLISP_Library.lsp")) (if (= (atoi (getvar "ACADVER")) 18);für acad 2010 (setq ConnectString (strcat "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" DATENBANK)) ) (if (= (atoi (getvar "ACADVER")) 16); für acad 2004 (setq ConnectString (strcat "Provider=MSDASQL;Driver={Microsoft Access Driver (*.mdb)};DBQ=" DATENBANK)) ) (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "admin" ""))) (progn (prompt "\nMenü Verbindung fehlgeschlagen!")(ADOLISP_ErrorPrinter)) (prompt "\n Verbindung erfolgreich hergestellt!") ) ; Abmelden von der Datenbank (prompt "\nAbmelden von der Datenbank\n") (ADOLISP_DisconnectFromDB ConnectionObject) (setq ConnectionObject nil) Dann kannst du mit (setq SQLStatement (strcat "INSERT INTO Tabellenname (Spalte1, Spalte2) VALUES " "('" Wert1 "', '" Wert2 "')")) ;Daten einfügen (setq RESULT (ADOLISP_DoSQL ConnectionObject SQLStatement)); gibt T oder nil zurück (setq SQLStatement (strcat "UPDATE Tabellenname SET '" Mein Wert "' WHERE Spalte1'" )); Daten ändern (setq RESULT (ADOLISP_DoSQL ConnectionObject SQLStatement)); gibt T oder nil zurück (setq SQLStatement (strcat "DELETE FROM Tabellenname WHERE ID='" ????? "'")); Datensätze löschen (setq RESULT (ADOLISP_DoSQL ConnectionObject SQLStatement)); gibt T oder nil zurück (setq SQLStatement (strcat "SELECT * FROM Tabellenname WHERE '" Spalte1 "'")); Daten abfragen (setq RESULT (ADOLISP_DoSQL ConnectionObject SQLStatement)); gibt nil oder den / die Werte zurück die abgefragt wurden. Tabellenname, Spalte1, Spalte2, Wert1, Wert2 must du für dich benennen, wenn du Variablen nimmst vergesse das Apostotroph nicht. Alle Felder in der Datenbank sind Text Felder Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 25. Jan. 2022 12:45 <-- editieren / zitieren --> Unities abgeben:
Hallo Niggemann, danke für die Beispiel-Codes. Wo kann ich die "ADOLISP_Library.lsp" Datei finden bzw. herunterladen? Ist diese Datei Bestandteil von Autodesk Installation, oder kommt von einem Drittanbieter? Gibt es keine standard Lisp-Befehle, die einer Datenverbindung zu ODBC dienen? Sorry für die Fragen, aber ich konnte keine klare Antworten darauf in den Web-Inhalten finden. Danke und Gruß, Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 25. Jan. 2022 13:07 <-- editieren / zitieren --> Unities abgeben:
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 25. Jan. 2022 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
|
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 25. Jan. 2022 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
|
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 25. Jan. 2022 14:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Niggemann, genau dies habe ich bereits gefunden und heurunter geladen. Ich versuche jetzt etwas Sinnvolles aus den Beispielen zu entnehmen und per Lisp die Verbindung zu eine ODBC registrierte .mdb Datenbank-Datei aufzubauen. Gibt es wirklich keinen "standard" Befehls-Satz unter Lisp für die ODBC Verbindung? Danke und Gruß, Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 25. Jan. 2022 16:58 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, bedenke bitte das Lisp von Hause aus nicht dafür gemacht ist, mit Lisp kannst du viele Sachen machen. Lisp in Acad ist ziemlich konstant und du kannst es in fast allen Versionen nutzen ohne was ändern zu müssen. Meine Lisp Routinen aus Acad R11 / R12 nutze ich noch heute und das ist jetzt über 30 Jahre her. Du kannst dich auch in .Net einarbeiten das funktioniert auch, wie Holger es vorgeschlagen hat, aber ob .Net so konstant läuft ohne immer was um zu programieren kann ich dir nicht sagen. Eins ist aber sicher tippen must du immer. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools (d-tools.eu)
|
erstellt am: 25. Jan. 2022 17:24 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Zitat: Original erstellt von Niggemann: … ob .Net so konstant läuft ohne immer was um zu programieren kann ich dir nicht sagen. …
… läuft auch ziemlich konstant. Das Alltägliche der .Net-API ist seit AutoCAD 2008 nahezu unverändert. Es kommen meist nur Dinge hinzu. Da die AutoCAD- Bibliotheken nicht fest im eigenen Code eingebunden sind, laufen die Programme, sofern keine geänderten oder gelöschten API-Funktionen verwandt wurden, auch ohne erneutes Kompilieren. Ich mache das zwar, aber auch mehr aus dem Grund, dass ich beim Kunden kein Risiko eingehen möchte. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 26. Jan. 2022 02:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Niggemann, danke für deine klärende Worte, genau diese Antwort konnte ich in den Foren/Gruppen nicht finden. Jetzt weiß ich wenigstens, dass ich in der AutoLISP Developer's Guide & co. nicht um sonst nach Commandos suchen soll. Ich werde versuchen die in der ADOLISP_Library.lsp definierten Funktionen zu nutzen. Übrigens, hast Du vielleicht eine brauchbare, neuere Version der ADOLISP_test.mdb? Die ich heruntergeladen habe, trägt ein Datum vom 1. Nov. 2005 und hat vermutlich der Version '97, ich bekomme die nicht einmal mit Access 2010 geöffnet. Gruß, Manfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Niggemann Mitglied
Beiträge: 165 Registriert: 31.10.2003 Win 98 Se, ACAD 2004, XP Prof, ACAD 2004 und ACAD 2010
|
erstellt am: 26. Jan. 2022 09:24 <-- editieren / zitieren --> Unities abgeben: Nur für ManfredMann
Hallo Manfred, ich kann die Datenbank auch nicht richtig öffnen um sie zu speichern bzw. zu konvertieren. Ich konnte nur einen Screenshot erstellen. Die Datenbank hat nur eine Tabelle mit dem Name "DESKS", du must dir in Access diese Datenbank neu anlegen. Leider kann ich die nicht sagen ob es Text- oder Zahlenfelder sind. Gruß Niggemann Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 26. Jan. 2022 10:34 <-- editieren / zitieren --> Unities abgeben:
|
ManfredMann Mitglied CAD Konstrukteur
Beiträge: 220 Registriert: 27.04.2001 Autocad 2021 / Win10- 64 bit
|
erstellt am: 28. Jan. 2022 19:00 <-- editieren / zitieren --> Unities abgeben:
|