Seite 1 von 2

ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 15.09.2017 17:51
von Andesdaf
Hallo,

ich möchte auf eine Access-Datenbank per ODBC zugreifen und verwende folgenden Code, der unter PB 5.60 und früher
tadellos funktioniert hat:

Code: Alles auswählen

EnableExplicit

#ODBC_ADD_DSN = 1

Procedure StringChangeChar(*pzString, piLen.i, pcSuch.c, pcErsetz.c)
  Protected.i i = 0         
  Protected *cChar.Character = *pzString
  
  For i = 0 To piLen
    If *cChar\c = pcSuch
      *cChar\c = pcErsetz
    EndIf
    *cChar + SizeOf(Character)
  Next i

EndProcedure

Procedure.i DB_Open()  
  Protected.i iHandle
  Protected.s zErr,
              zFile,
              zName,
              zDriver,
              zExt,
              zAttributes,
              zUser,
              zPass
  Protected.l lErr
  Protected   *ErrMsg
  
  zFile = GetTemporaryDirectory() + "TEST.MDB"
  zName = GetFilePart(zFile)
  zExt  = GetExtensionPart(zFile)
  zName = Left(zName, Len(zName) - Len(zExt) - 1)
  zDriver = "Microsoft Access Driver (*.mdb)"

  If FileSize(zFile) = -1
    zAttributes = "CREATE_DB=" + zFile + " General"
    zAttributes + ";UID=" + zUser
    zAttributes + ";PWD=" + zPass + ";"
    StringChangeChar(@zAttributes, Len(zAttributes), ';', 0)
    iHandle = SQLConfigDataSource_(0, #ODBC_ADD_DSN, zDriver, zAttributes)   
  EndIf
  
  zAttributes = "Server=APServer;Description=" + zName
  zAttributes + ";DSN=" + zName
  zAttributes + ";DBQ=" + zFile
  zAttributes + ";UID=" + zUser
  zAttributes + ";PWD=" + zPass + ";"
  StringChangeChar(@zAttributes, Len(zAttributes), ';', 0)
  iHandle = SQLConfigDataSource_(0, #ODBC_ADD_DSN, zDriver, zAttributes)
  
  If iHandle
    iHandle = OpenDatabase(#PB_Any, zName, zUser, zPass, #PB_Database_ODBC)
    If iHandle = 0
      Debug DatabaseError()
      ProcedureReturn 0
    EndIf
  Else
    *ErrMsg = AllocateMemory(256)
    SQLInstallerError_(1, @lErr, *ErrMsg, 255, #Null)
    Debug PeekS(*ErrMsg, -1, #PB_Ascii)
    FreeMemory(*ErrMsg)
    ProcedureReturn 0
  EndIf
  
  ProcedureReturn iHandle
  
EndProcedure

UseODBCDatabase()

DB_Open()
Mit PB 5.61 schlägt SQLConfigDataSource mit Komponente wurde in der Registrierung nicht gefunden fehl.
Ich verwende die x86er Version von PB auf Windows 10.

Weiß jemand Rat?

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 15.09.2017 18:07
von ts-soft
Sollte unter 5.60 auch nicht funktioniert haben, da kein Unicode:

Code: Alles auswählen

Import "odbccp32.lib"
  SQLConfigDataSource(Handle, Type, strDriver.s, strAttribtues.s) As "_SQLConfigDataSourceW@16" , Unicode Version erforderlich
EndImport
sollte helfen, nicht getested!

Ansonsten den hier:

Code: Alles auswählen

Import "odbccp32.lib"
  SQLConfigDataSource(Handle, Type, strDriver.p-Ascii, strAttribtues.p-Ascii)
EndImport
Gruß
Thomas

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 15.09.2017 18:43
von Andesdaf
Ah, Unicode mal wieder... danke, funktioniert.

Da obiger Code aber mit 5.60 tatsächlich funktioniert, hatte ich in der Richtung
gar nicht weiter geforscht.

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 07.11.2017 10:12
von Pelagio
Ich habe gerade diesen Beitrag gelesen, da ich auch vor dem gleichen Problem stehe.
Allerdings weiß ich nicht wie ich das gelesene bei mir umsetzen könnte.
Ich habe sowieso meine Probleme mit den :bluescreen: der unterschiedlichen Formaten.

Code: Alles auswählen

 #mTreiber = "SQL Server"
#mDSN =  "PBSQL_DSN"

 Procedure.a DSN_Create(vServer.s, vDatabase.s, vDSNArt.a = #False)
		Shared mDSN, mCON, mArt
		Protected pArt.i, pResult.i

		If OpenLibrary(#mDatabase, "ODBCCP32.DLL")
			If vDSNArt: pArt = #mADD_SYS_DSN: Else: pArt = #mADD_DSN: EndIf
			mDSN  = #mDSN + "-" + vDatabase
			mCON  = "Server=" + vServer + "; DSN=" + mDSN + "; Database=" + vDatabase + "; "
			mCON  + "Description=Description For Purebasic SQL-ODBC; TRUSTED_CONNECTION=Yes; LANGUAGE=German;"
			pResult = GetFunction(#mDatabase, "SQLConfigDataSource")
			If pResult
				If SQLConfigDataSource_(#mDatabase, pArt, #mTreiber, @mCON)
					pResult = #True
					mArt = vDSNArt
				Else
					pResult = #False
				EndIf
			EndIf
			CloseLibrary(#mDatabase)
		EndIf
		ProcedureReturn pResult
	EndProcedure

Die Frage wäre wie kann ich, in diesem Fall, #mTreiber und #mCon in Unicode umwandeln.
p-Ascii sagt mir leider nix.

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 07.11.2017 11:41
von mk-soft
Ist ein Bug und gemeldet...

Link: http://www.purebasic.fr/english/viewtop ... =4&t=69462

Kannst erst mal den Workaround von mir nehmen.

Code: Alles auswählen

; -----------------------------------------------------------------------------
; Bugfix ASCII, Unicode PB v5.4x and PB v5.6x
; By mk-soft version v1.02

Import "odbccp32.lib"
  CompilerIf #PB_Compiler_Unicode
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
      SQLInstallerError(iError, *pfErrorCode, *ErrorMSGBuf, cbErrorMsgMax, *ErrorMSGLen) As "_SQLInstallerErrorW@20"
      SQLConfigDataSource(Handle, Type, strDriver.s, *strAttribtues) As "_SQLConfigDataSourceW@16"
    CompilerElse
      SQLInstallerError(iError, *pfErrorCode, *ErrorMSGBuf, cbErrorMsgMax, *ErrorMSGLen) As "SQLInstallerErrorW"
      SQLConfigDataSource(Handle, Type, strDriver.s, *strAttribtues) As "SQLConfigDataSourceW"
    CompilerEndIf
  CompilerElse
    SQLInstallerError(iError, *pfErrorCode, *ErrorMSGBuf, cbErrorMsgMax, *ErrorMSGLen)
    SQLConfigDataSource(Handle, Type, strDriver.s, *strAttribtues)
  CompilerEndIf
EndImport

Import "odbc32.lib"
  CompilerIf #PB_Compiler_Unicode
    CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
      SQLConnect(ConnectionHandle, ServerName.s, NameLength1, UserName.s, NameLength2, Authentication.s, NameLength3) As "_SQLConnectW@28"
      SQLTables(StatementHandle, *CatalogName, NameLength1, *SchemaName, NameLength2, *TableName, NameLength3, *TableType, NameLength4) As "_SQLTablesW@36"
    CompilerElse
      SQLConnect(ConnectionHandle, ServerName.s, NameLength1, UserName.s, NameLength2, Authentication.s, NameLength3) As "SQLConnectW"
      SQLTables(StatementHandle, *CatalogName, NameLength1, *SchemaName, NameLength2, *TableName, NameLength3, *TableType, NameLength4) As "SQLTablesW"
    CompilerEndIf
  CompilerElse
    SQLConnect(ConnectionHandle, ServerName.s, NameLength1, UserName.s, NameLength2, Authentication.s, NameLength3)
    SQLTables(StatementHandle, *CatalogName, NameLength1, *SchemaName, NameLength2, *TableName, NameLength3, *TableType, NameLength4)
  CompilerEndIf 
EndImport
; -----------------------------------------------------------------------------

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 28.11.2017 20:35
von Pelagio
Hallo PB'ler,

jetzt wird es noch etwas seltsamer, Programme die schon einige Zeit auf dem Computer laufen, sie fragen Daten in einer Accessdatei (*.accdb) ab, laufen im Augenblick auch nicht mehr. Dies scheint mit mit dem Update auf Office 2016 eingetreten zu sein. Ich habe mir die Datenquellen mal angeschaut und den Treiber den ich immer benutzte ("Microsoft Access Driver (*.mdb, *.accdb)") war dort nicht mehr vorhanden. Desgleichen habe ich gesehen das in der Treibertabelle als Datei "ODBCJT32.dll" angegeben ist. Ich habe leider zu wenig Erfahrung und Wissen auf diesem Gebiet um mir einen Reim darauf machen zu können. Ich weiß nur, im Augenblick läuft nix mehr mit Access DB. >_< :bluescreen:

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 29.11.2017 16:25
von Pelagio
Danke mk-soft

für deinen Workaround aber ich stehe irgendwie auf dem Schlauch.
Ich komm einfach nicht dahinter wie ich mit deinem Workaround umzugehen habe.
Ein kleines Beispiel könnte mich sicherlich auf auf den rechten Weg führen. :praise:

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 01.12.2017 16:47
von mk-soft
Einfach wie die externe Funktion aufrufen, aber nur ohne 'Unterstrich'

SQLConfigDataSource_(...) nach SQLConfigDataSource(...)
:wink:

Link ExDatabase.pbi
http://www.purebasic.fr/english/viewtop ... 12&t=67180

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 01.12.2017 19:07
von Pelagio
Danke mk-soft,

ich komme wieder auf meine Daten in den Accessfiles,
allerdings musste ich erst noch den Treiber 'Microsoft Access Driver (*.mdb, *accdb)' installieren um das zu bewerkstelligen.
Allerdings hatte ich eben noch ein Problem wenn ich eine Access Datei erstellen will:

Code: Alles auswählen

mTreiber = "Microsoft Access Driver (*.mdb, *.accdb)"
	Procedure.b File_Create(vFiles.s, vUser.s = #Null$, vCode.s = #Null$) 
		Shared mTreiber
		Protected n.i, *pMemory, pResult.b
		Protected pAttributes.s = "CREATE_DB=" + vFiles + " General;UID=" + vUser + ";PWD=" + vCode + ";"

		If SQLConfigDataSource(#mDatabase, #mADD_DSN, mTreiber, @pAttributes)
			pResult = #True
		EndIf
		ProcedureReturn pResult
	EndProcedure
Ich kann sie zwar erstellen aber es wird immer automatisch '.mdb' mit angegeben zBsp. möchte ich eine Datei mit Namen 'Test.accdb' anlegen, angelegt wird eine Datei mit Namen 'Test.accdb.mdb'. :praise:

Re: ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Verfasst: 01.12.2017 21:16
von mk-soft
Bei Google gesucht
char szDriverName[] = "Microsoft Access Driver (*.mdb, *.accdb)";
char szAttr[] = "CREATE_DBV12=c:\access2007.accdb";
SQLConfigDataSource(NULL, ODBC_ADD_DSN, szDriverName, szAttr);
Nicht getestet... :wink: