SQL 2008 Zugriff via ODBCDBE

alles zum Microsoft SQL Server

Moderator: Moderatoren

Antworten
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo
weiss jemand wie ein dacSession connectionString für den Zugriff auf einen MS-SQL-Server via ODBC auszusehen hat.
folgender Eintrag führt zu keinem Erfolg:
"DBE=ODBCDBE;DRIVER=SQL SERVER;SERVER=odbc_name;UID=user_name;PWD=user_passwd"
Gruß Johannes :)
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von Tom »

So sollte es aussehen:

Code: Alles auswählen

cConnect := "DBE=ODBCDBE;DSN=" + cDriver + ";UID="+cUser+";PWD="+cPassWord+";DBQ=" + cDatabase
"cDriver" ist der Name, den Du der DSN (Benutzer- oder System-DSN) für den Zugriff auf den Server gegeben hast. Oder der dort schon vorliegt. "cDataBase" ist die Datenbank (nicht die Tabelle!), auf die Du zugreifen willst. Danach sollte der Zugriff auf eine Tabelle aus dieser Datenbank ganz einfach per "USE" möglich sein.
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Ab MS SQL Server 2005 solltest du auf den "SQL Native Client" umsteigen, dass du auch extra auf jedem PC installieren muss.
Die Datei müsste auf der Installations-CD/DVD vorhanden sein. Diese kann auch bei Microsoft runter geladen werden und heißt z.B. so: sqlncli.msi oder sqlncli_x64.msi.
Dann sieht es etwa so aus:

Code: Alles auswählen

cConnectService := "DBE=ODBCDBE"
cConnectService += ";DRIVER=SQL Native Client"
cConnectService += ";SERVER="+cSQLServer                                    
cConnectService += ";UID=" + cSQLServerUser
cConnectService += ";PWD=" + cSQLServerPass
cConnectService += ";DATABASE="+cDBName
Bei SQL Server 2005 funktioniert es einwandfrei. Mit 2008 habe ich es noch nicht probiert, werde es aber bald müssen.
Gruß,

Andreas
VIP der XUG Osnabrück
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo
danke für die schnelle Antworten.
Der Zugriff scheint mit dem SQL-Native Client zu funtionieren;
die DacSession läßt sich problemlos initialisieren;
wenn ich jedoch versuche mit dbusearea (.T.,,lcSQL,lcAli)
eine Tabelle/View zu öffnen liefert mir das System die Meldung
"Internal Data structures corrupted" zurück.
Gruß Johannes :( :shock:
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Hallo Johannes,

zuerst muss ich sagen, dass du auch bei "USE" SQL-Anweisungen anstatt Tabellennamen angeben kannst.
Dann muss ich sagen, dass ich USE-Befehle aufgegeben habe, als ich etwas längere SQL-Befehle angeben musste, da ich nicht mehr als 255 Zeichen mit USE angeben konnte. Der Rest wurde einfach ignoriert und die Befehle waren damit nicht vollständig, was natürlich zu Fehlern geführt hat.
Ich benutze die Befehle "SQL" und "SQL CMD" aus der ODBCDBE. Damit funktioniert es einwandfrei.
Es gibt aber trotzdem noch ein paar kleinigkeiten, auf die geachtet werden soll:
- Die SQL-Daten in einer Workarea haben kein EOF(), was in den Schleifen zum Endloslauf auf dem letzten Satz führen kann. Da habe ich mir vor dem Skip mit einer zus. Abfrage geholfen:

Code: Alles auswählen

do while .t.

if recno()==reccount()
  exit
endif
dbskip()
enddo
- Bei den Memo-Feldern (Text-Feldern) gibt es auch Probleme, die laut Alaska durch Microsoft-ODBC kommt: schon beim Ansprechen eines Memofeldes kann es zu Laufzeitfehler kommen. Das Problem liegt wohl an der Reihenfolge der Felder und der Datenabfrage:
1. du muss entweder die Felder in der gleichen Reihenfolge abarbeiten, wie diese in der Workarea stehen;
2. eine kleine Schleife vor dem richtigen Verarbeiten machen, die dies für dich erledigt, da es danach nicht mehr relevant ist;
3. SQL-Convert-Befehl

Code: Alles auswählen

Convert( varchar(1000), textfeld)
zum Konvertieren in Char bzw. Varchar benutzen, wo du aber die Länge explizit angeben muss, die du brauchst, da es mit den Standartwerten die Texte abschneidet oder einfach

Code: Alles auswählen

Convert( varchar(max), textfeld)
für den maximalen Text angeben.

Sonst ist es eine sehr schöne Sache!!!
Gruß,

Andreas
VIP der XUG Osnabrück
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo Andreas
wo gibt es denn eine Doku zu der ODBCDBE
ich kenne die Befehle "SQL" und/oder "SQL CMD" nicht
Gruß Johannes
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Hallo Johannes,

wenn du ODBCDBE in dem Lieferumfang deiner Subscription hast, hast du auch die Hilfe-Datei dabei.

Die beiden genannten Befehle "SQL" und "SQL CMD" findest du auch dort. Für diese musst du auch die Datei "SQLCMD.ch" importieren. Evtl. brauchst du noch die Datei "ODBCDBE.ch".
Gruß,

Andreas
VIP der XUG Osnabrück
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von Sören »

Hallo Andreas,
Andreas hat geschrieben:... da ich nicht mehr als 255 Zeichen mit USE angeben konnte.
Aha, das wusste ich noch nicht.
Andreas hat geschrieben:Ich benutze die Befehle "SQL" und "SQL CMD" aus der ODBCDBE.
Mit diesen Befehlen ist es aber nicht möglich, den Alias-Namen der Workarea selbst zu bestimmen. Man muss den Namen nehmen, den Xbase++ vorgibt!? Oder sehe ich das falsch?
Beste Grüße,
Sören
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Sören hat geschrieben:
Andreas hat geschrieben:Ich benutze die Befehle "SQL" und "SQL CMD" aus der ODBCDBE.
Mit diesen Befehlen ist es aber nicht möglich, den Alias-Namen der Workarea selbst zu bestimmen. Man muss den Namen nehmen, den Xbase++ vorgibt!? Oder sehe ich das falsch?
Du kannst den SQL-Befehl ganz normal erstellen und ganz normal den Alias vergeben:

Code: Alles auswählen

cSQL := "SELECT * FROM adressen AS temp WHERE name LIKE '%testname%';"
damit würden die Daten aus der Adressen-Tabelle abgeholt und mit dem Alias "Temp" zurückgegeben.
Gruß,

Andreas
VIP der XUG Osnabrück
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von Sören »

Hallo Andreas,

die Zuweisung mit "AS" gibt es nicht bei allen DBMS. Oracle kennt das z.B. nicht.

Folgendes SQL-Statement in Oracle ...

SELECT * FROM dalbe.bst_transfer ORDER BY erledigt, belegnr_pzug;

... liefert mir als Alias "DALBE_BST_TRANSFER" zurück, was nicht sehr schön ist.

Auch wenn ich das mache:

SELECT a.artnr, a.artbez, g.groesse FROM artikel a, groessen g WHERE a.artnr=g.artnr;

... erhalte ich als Alias nicht "A", sondern "ARTIKEL" zurück, was mir auch nicht gefällt.

Insbesondere bei etwas komplexeren Statements ist das sehr unschön:

Code: Alles auswählen

SELECT a.titel, a.aunr, a.lieferant, a.audat, a.lieftermin,
       p.artnr, p.artbez, p.meinheit, p.menge, p.netto,
       l.liefdat, l.liefmenge, l.netto,
       (l.netto+(l.netto*a.mwst/100))-(l.netto+(l.netto*a.mwst/100))*a.skonto/100 AS Bruttowert

       FROM auftrag a, aufpos p, liefer l

       WHERE a.aunr=p.aunr AND p.pointer=l.pointer AND a.aunr LIKE 'P%' AND artbez LIKE 'Ball.%'

       ORDER BY a.aunr;
Übrigens (ich habe gerade mal nachgezählt) besteht das o.a. Statement aus insges. 408 Zeichen inkl. Leerzeichen und 334 Zeichen exklusive Leerzeichen, und es funktioniert bei mir mit dem USE-Befehl hervorragend.

Möglicherweise bezieht sich Deine Beobachtung mit der Limitierung des USE-Befehls auf 255 Zeichen auf eine ältere Xbase++ - Version?! (Wobei ich selbst nur die 1.9 ohne SL1 habe.)
Zuletzt geändert von Sören am Do, 06. Mai 2010 8:51, insgesamt 1-mal geändert.
Beste Grüße,
Sören
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Sören hat geschrieben: Möglicherweise bezieht sich Deine Beobachtung mit der Limitierung des USE-Befehls auf 255 Zeichen auf eine ältere Xbase++ - Version?! (Wobei ich selbst nur die 1.9 ohne SL1 habe.)
Du hast recht! Ich habe damals mit der Version 1.8 mit SQL angefangen und als die Probleme mit dem USE-Befehl und der String-Länge aufgetreten waren, bin ich auf die beiden SQL-Befehle umgestiegen. Danach habe ich es nicht mehr probiert.
Das Problem mit dem Memo-Feld besteht aber auch noch bei 1.9 SL1.
Gruß,

Andreas
VIP der XUG Osnabrück
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo
leider funktioniert der Zugriff auf die Tabellen auch mit dem SQL Befehl nicht.
Die Verbindung zu dem Server wird aufgebaut und meldet auch keine Fehler.
Wenn ich aber z.B. ein Statement wie
SQL ("SELECT [Name] FROM [test_db].[dbo].[User];") (originale MS-SQL-Syntax)
abschicke
wird die gerade aktive Workarea geschlossen aber keine neue Workarea geöffnet.
Also derselbe Effekt wie beim dbusearea
:getLastMessage() und :getLastError() melden auch nichts :banghead:
Ich habe immer noch XBase 1.82 im Einsatz und verwende dementsprechend auch die 1.82 er ODBCDBE
Hat irgendeiner noch eine Idee woran das liegen könnte
Vielen Dank in Voraus :?
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Hast du auch genug Zugriffsrechte? Versuch es mit de "sa"-User, ob es funktioniert.
Du könntest auch irgendwo einen SQL Server 2005 Express installieren und testen, ob du auf die Daten zugreifen kannst. Wenn Ja, dann liegt es bestimmt irgendwo an den Zugriffsrechten oder Server-Einstellungen!
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Vor allem sollte der Server eine gemischte Anmeldung erlauben: SQL-Server- und Windows-Konten!
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

MeJ hat geschrieben:SELECT [Name] FROM [test_db].[dbo].[User]
Wenn du die Verbindung direkt zu einer Datenbank aufgebaut hast solltest du es mit folgendem Befehl versuchen:

Code: Alles auswählen

SELECT Name FROM User;
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von brandelh »

Hi,

könnte es sein, dass die 1.82 einen Fehler hat oder einfach weniger kann ?

Ansonsten kann ich nur SQLExpress() empfehlen ;-)
Gruß
Hubert
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo
was ist SQLExpress()? (ist doch nicht MS-SQL-Express mit gemeint)
Gibts das als Demo zu ausprobieren
Gruß JOhannes
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hi
Der SQL-Server erlaubt die gemischt Anmeldung
der User der sich verbindet hat auch genug Rechte
SELECT Name FROM User und alle möglichen Kombinationen habe ich ausprobiert, aber immer dasselbe Ergebnis.
Gruß JOhannes :?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von brandelh »

MeJ hat geschrieben:Hallo
was ist SQLExpress()? (ist doch nicht MS-SQL-Express mit gemeint)
Gibts das als Demo zu ausprobieren
Gruß JOhannes
http://www.sqlexpress.com/menu.htm

SQLExpress - ist eine Bibliothek für Xbase++, die den Zugriff auf ODBC Datenbanken ermöglicht.
Im Gegensatz zu der ODBCDBE wird hier ein funktionaler Weg eingeschlagen, der eine SQL Datenbank anders behandelt als eine DBF.
Ich finde das besser, denn es ist etwas anderes ob ich einen SQL Server habe oder DBF Dateien.
Natürlich kann man darüber streiten, wichtig ist aber, dass SQLExpress sehr stabil ist und das macht was ich erwarte.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von andreas »

Ich konnte heute mein Programm im Zusammenhang mit SQL Server 2008 testen. Nach dem Einspielen der Datenbank, Einrichtung der entsprechenden User und Ändern der Server-Einstellung in der INI-Datei meines Programms funktionierte dieses einwandfrei, sogar mit dem Client-Treiber für SQL Server 2005.

Ich denke, dass du irgendwas bei den Einstellungen übersehen hast!
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von Rudolf »

Hallo,
kurz noch was zu SQLEXPRESS, wenn der Connectstring falsch ist, erscheint der Windows Dialog um die DSN manuell zu wählen, den sich daraus ergebende Connectstring kann man dann im SQLEXPRESS abrufen zum Kontrollieren.
Grüsse
Rudolf
MeJ
Rookie
Rookie
Beiträge: 10
Registriert: Mi, 02. Sep 2009 14:44
Wohnort: Münster

Re: SQL 2008 Zugriff via ODBCDBE

Beitrag von MeJ »

Hallo
danke für die Unterstützung.
Jetzt hat es endlich geklappt,
sowohl mit dem normalen ODBC "SQL Server" und auch mit dbusearea :D
Der Trick war dass ein SQL-Statement ohne "WHERE"-Klausel nicht durchgeführt wurde. :banghead: (warum auch immer)
Sobald ich ein WHERE ... dahinter setze funktioniert der Zugriff problemlos =D>
Gruß Johannes
Antworten