ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Für allgemeine Fragen zur Programmierung mit PureBasic.
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

ODBC / SQLConfigDataSource schlägt fehl mit PB 5.61

Beitrag 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?
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

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

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2658
Registriert: 15.06.2008 18:22
Wohnort: Dresden

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

Beitrag 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.
Win11 x64 | PB 6.00 (x64)
Benutzeravatar
Pelagio
Beiträge: 423
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

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

Beitrag 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.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.03 LTS]. :allright:
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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
; -----------------------------------------------------------------------------
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Pelagio
Beiträge: 423
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

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

Beitrag 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:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.03 LTS]. :allright:
Benutzeravatar
Pelagio
Beiträge: 423
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

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

Beitrag 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:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.03 LTS]. :allright:
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Pelagio
Beiträge: 423
Registriert: 11.11.2004 17:52
Computerausstattung: Intel Core i3-4170 CPU 3,70 GHz
8,00 GB Arbeitsspeicher
WIN 10 Pro 64 Bit Betriebssystem
Wohnort: Bremen

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

Beitrag 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:
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win10Pro(64); PB6.03 LTS]. :allright:
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten