Hallo alle zusammen!
Ich bin momentan dabei eine Anwendung von
BDE/
SQL Links auf
ADO umzustellen. Die alte Anwendung erlaubte eine Anmeldung am
SQL Server sowohl über SSPI als auch über
SQL Login. Zum einen konnte man ein
SQL Login durch einen Kommandozeilenparameter erzwingen und zum anderen wurde das
SQL Login automatisch angeboten, wenn die SSPI Authentifizierung im ersten Anlauf fehlgeschlagen war.
Beide Modi einzeln habe ich auch schon relativ problemlos mit
ADO umsetzen können.
Für die automatische/SSPI-Anmeldung würde der ConnectionString also so aussehen:
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=MeineDatenbank;Data Source=MeinServer
...und für den manuellen/
SQL-Login so:
Provider=SQLOLEDB.1;User ID=MeinUserName;Password=MeinPasswort;Persist Security Info=False;Initial Catalog=MeineDatenbank;Data Source=MeinServer
...wobei ich User ID und Password nicht wirklich über den ConnectionString setze, sondern über die Properties Collection der ADOConnection.
Soweit so gut. Das Problem beginnt, wenn ich zuerst die SSPI-Authentifizierung versuche, diese dann fehlschlägt und ich dann das
SQL-Login folgen lassen will. Da der ConnectionString prinzipiell dynamisch sein soll (d.h. nicht hartkodiert ist), kann ich ihn nicht einfach komplett neu schreiben, weil dabei sonst möglicherweise wichtige zusätzliche Properties verloren gehen würden. Ich muß also den alten ConnectionString bzw. die alten Connection.Properties ändern. Wenn ich aber einfach Properties['Integrated Security'] := '' setzte, versucht Delphi trotzdem den SSPI-Login anstatt dem
SQL-Login. Auch ein Setzen des Properties auf Unassigned, NIL oder Null hat keine Wirkung (beim Sezten auf 'No' oder ähnliches gibt es zumindest einen Fehler). Offensichtlich reicht die schiere Existenz des 'Integrated Security'-Properties schon aus, um die SSPI-Authentifizierung zu erzwingen. Der
SQL-Login funktioniert nur, wenn dieses Property komplett fehlt.
Die Frage ist nur, wie bekomme ich das Property wieder weg, wenn es erst einmal dringewesen ist? Die Properties-Collection bietet, so weit ich es erkennen kann, keine Möglichkeit, einzelne Items wieder zu entfernen. Muß ich wirklich erst alle alten Properties irgendwo zwischenspeichern, den ConnectionString leermachen und dann alle Properties bis auf "Integrated Security" wieder zurückschreiben?
Hat vielleicht noch jemand eine andere Idee?
Grüße,
Oliver