dynamisch DSN erzeugen (MS-SQL)



  • Ich hab Probleme mit dem dynamischen erzeugen einer System DSN für eine MS-SQL Datenbank. Ich habe versucht folgendes zu machen.

    SQLConfigDataSource(NULL,
    	ODBC_ADD_SYS_DSN,
    	"SQL Server",
    	"DSN = ACR\0"
    	"Description = ACR\0"
    	"Server=RAEDV10\0"
    	"Database=(Standard)\0"
    	"Uid=anyusr\0"
    	"Pwd=anyusr\0"
    	);
    

    Beim händischen erstellen seh ich folgendes:

    Datenquellenname: ACR
    Datenquellenbeschreibung: ACR
    Server: RAEDV10
    Datenbank: (Standard)
    Sprache: (Standard)
    Zeichen konvertieren: Yes
    Abfragen mit langer Laufzeit protokollieren: No
    Protokolltreiberstatistik: No
    Integrierte Sicherheit verwenden: No
    Regionale Einstellungen verwenden: No
    Option für vorbereitete Anweisungen: Temporäre Prozeduren beim Trennen löschen
    Failover-Server verwenden: No
    ANSI-Anführungszeichen verwenden: Yes
    ANSI-Nullen, -Leerzeichen und -Warnungen verwenden: Yes

    Was mach ich falsch?
    Als Fehler bekomme ich:

    ---------------------------
    ACRSQL
    ---------------------------
    Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben.

    ---------------------------
    OK
    ---------------------------

    😞 😞



  • Hallo!
    Ich habe Dir mal die wichtigsten Schritte für die Erstellung eines
    dynamischen DNS unten aufgelistet:

    CString GetODBCDriver(CString strDriver)
    {
      TCHAR szBuf[2001];
      WORD cbBufOut;
      TCHAR *pszBuf = szBuf;
      TCHAR *pszBufCmp = strDriver.GetBuffer();
      CString strDriverFullName;
    
      _tcslwr(pszBufCmp);
    
      // Get the names of the installed drivers ("odbcinst.h" has to be included )
      if(SQLGetInstalledDrivers(szBuf, sizeof(szBuf),& cbBufOut))
        // Search for the driver...
        do
        {
          _tcslwr( pszBuf );
          if( _tcsstr( pszBuf, pszBufCmp ) != 0 )
          {
            // Found !
            strDriverFullName = CString( pszBuf );
            break;
          }
          pszBuf = _tcschr( pszBuf, '\0' ) + 1;
        }
        while( pszBuf[1] != '\0' );
    
      return strDriverFullName;
    }
    
    /////////////////////////////////////////////
    //Anlegen eines dynamischen DSN
    //als Parameter gewünschten Treibernamen eintragen, der natürlich installiert //sein muss:
    CString strDBDriver = GetODBCDriver("access");
    CString strDSN;
    CString strDBPath=//Verzeichnis der Datenbank mit Name der Datenbank.
    CString strProgramDir=//Programmverzeichnis;
    CDatabase* pDB;
    
    strDSN.Format(_T("DRIVER={%s};DSN=''; DBQ=%s; DefaultDir=%s"), strDBDriver, strDBPath, strProgramDir);
    
      try
      {
        pDB=new CDatabase();
        BOOL b=m_pDB->OpenEx(strDSN);
        if(!b)
        {
          delete pDB;
          pDB=NULL;
          //Fehler melden;
        }
      }
      catch(...)
      {
        delete pDB;
        pDB=NULL;
        //Fehler melden;
      }
    

    Beste Grüße, Lothar.



  • HI Lothar vielen Dank für deine Hilfe, aber das dynamische erzeugen an sich ist nicht mein Problem, mit access habe ich es auch schon hin bekommen, aber ich brauch die Werte für eine MS-SQL Datenbank.





  • OK laut den Connection Strings der obigen Links würde meiner Ansicht nach folgendes gehen:

    SQLConfigDataSource(NULL, // Handle des Fensters, welsches die Registrierung durchführt
    	ODBC_ADD_SYS_DSN, 
    	"SQL Server",
    	"Server=RAEDV10\0"
    	"Database=dbo.TRWErgenisse\0"
    	"Uid=anyusr\0"
    	"Pwd=anyusr\0");
    

    Tut es aber nicht!

    ---------------------------
    ACRSQL
    ---------------------------
    Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben.

    ---------------------------
    OK
    ---------------------------

    Wo ist der Fehler hat das noch nie jemand machen wollen? 😮
    Hey ich bin hier doch immer auf ne Lösung gekommen.
    Please help! 😞



    In der MSDN steht zwar, dass ODBC_ADD_SYS_DSN einen System-DSN-Eintrag erzeugt, aber in meinem Projekt wird genau das mit ODBC_ADD_DSN gemacht...

    Gehört vor SQL Server nicht ein DSN= ?

    Ich glaube nicht, dass er weiss, was dbo. bei Database= sein soll (hattest du mal in einem anderen Thread in einem SQL-Statement als Datenbankname, wenn ich mich richtig erinnere).

    Hinter SQL Server fehlt ein \0.

    In der MSDN ist der ganze String doppelnullterminiert \0\0

    Crosspostings sind verwirrend.



  • Jetzt gehts!! 😃
    Also wer so ein Problem hat:
    ⚠ ⚠ keine Leerzeichen vor oder nach dem =
    ⚠ ⚠ Casesensitive also auch Groß und Kleinschreibung beachten
    Jo dann gibt es noch so sachen beim testen immer schön den DSN Eintrag raus löschen. Ich hatte es vorhin schon mit Uid laufen, jetzt zickt er wieder rum, werde mich dann nochmal mit der Lösung melden wenn es richtig klappt.

    @isbeau: ADD_SYS_DSN mach das aber auch das klappt schon!
    vor SQL Server gehört kein DSN, denn SQL Server ist mein Treiber und nicht mein DSN Name deshalb fehlt dahinter auch kein \0
    Das doppeltnullterminieren klapp nicht, doe jetzige Lösung mit \0 funktioniert (werde ich nachher präsentieren)
    zu 6. was für Crosspostings?

    @all Danke an alle die mit mir gelitten haben und mir geholfen haben das Problem zu beheben.



  • Polofreak schrieb:

    zu 6. was für Crosspostings?

    Diese:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-110629.html
    Man muss immer zwei oder noch mehr Threads im Auge behalten um zu gucken, ob jemand im anderen Thread schon die Antwort gegeben hat, die einem gerade vorschwebt. Naja, öhm, ist auch nicht lebenswichtig...
    ...egal... vergiss es einfach...



  • Oh das meintest du. Tut mir leid, dann brauch ich es hier ja eigentlich nicht mehr schreiben wie es geht, tu ich aber dennoch, falls der Link vielleicht mal nicht mehr geht

    void CACRSQLSet::CreateDSN()
    {
    	SQLConfigDataSource(NULL,
    	ODBC_ADD_SYS_DSN, 
    	"SQL Server",
    	"DSN=ACR\0"
    	"Description=ACR\0"
    	"Server=RAEDV10\0"
    	"Database=(Standard)\0"
    	);
    }
    

    Description ging komischer weise nur wenn Database unten steht ohne ging es nicht. UID und PWD hab ich noch nicht raus bekommen wo der hacken liegt, aber vielleicht bekomm ich es ja noch raus, dann melde ich mich wieder!
    🙂 😃 😉 🙂 😃 😉


Anmelden zum Antworten