1+ for the trick with NextDatabaseRow(), this makes it easy
i modified your source to be more safe :
Code: Select all
CompilerSelect #PB_Compiler_Version
CompilerCase 410
UseODBCDatabase() ; new in PB4.10
;Peeking SQL_HANDLE PureBasic Version 4.10 Beta 4
Macro SQL_HANDLE_ENV(Database)
PeekL(PeekL(IsDatabase(Database))-4)
EndMacro
Macro SQL_HANDLE_STMT(Database)
PeekL(PeekL(IsDatabase(Database)+4)+4)
EndMacro
Macro SQL_HANDLE_DBC(Database)
PeekL(PeekL(IsDatabase(Database)+4))
EndMacro
CompilerCase 4.02
InitDatabase()
;Peeking SQL_HANDLE PureBasic Version 4.02
Macro SQL_HANDLE_ENV(Database)
0
EndMacro
Macro SQL_HANDLE_STMT(Database)
PeekL(IsDatabase(Database)+4)
EndMacro
Macro SQL_HANDLE_DBC(Database)
PeekL(IsDatabase(Database))
EndMacro
CompilerEndSelect
Procedure.s GetSQLMessages(Database)
lResult.w
SQLState.s = Space(5)
NativeErrorPtr.l
MessageText.s = ""
BufferLength.l = 10000
TextLengthPtr.l
DiagInfoPtr.l = -1
Index.l=1
Result.s=""
Repeat
res.w=SQLGetDiagRec_(3, SQL_HANDLE_STMT(Database), Index, @SQLState, @NativeErrorPtr, @MessageText, 0, @TextLengthPtr)
If res=1
MessageText.s = Space(TextLengthPtr)
res.w=SQLGetDiagRec_(3, SQL_HANDLE_STMT(Database), Index, @SQLState, @NativeErrorPtr, @MessageText, BufferLength, @TextLengthPtr)
If res=0
Result+SQLState+"|"+MessageText
Debug SQLState+"|"+MessageText
Index+1
Else
Break
EndIf
Else
Break
EndIf
ForEver
ProcedureReturn Result
EndProcedure
Procedure.l GetDatabaseTables(Database)
SQLCancel_(SQL_HANDLE_STMT(Database))
res.w=SQLTables_(SQL_HANDLE_STMT(Database),0,0,0,0,0,0,0,0)
If res = 0 Or res = 1 ; #SQL_SUCCESS / #SQL_SUCCESS_WITH_INFO
ProcedureReturn 1
EndIf
EndProcedure
Procedure.l GetDatabaseDBNames(Database)
SQLCancel_(SQL_HANDLE_STMT(Database))
res.w=SQLTables_(SQL_HANDLE_STMT(Database),"%",-3,"",-3,"",-3,"",-3)
If res = 0 Or res = 1 ; #SQL_SUCCESS / #SQL_SUCCESS_WITH_INFO
ProcedureReturn 1
EndIf
EndProcedure
If OpenDatabase(0,"bla","lala","lala")
If GetDatabaseTables(0)
While NextDatabaseRow(0)
Debug "Database: " + GetDatabaseString(0,0)
Debug "Table:" + GetDatabaseString(0,2)
Debug "Type: " + GetDatabaseString(0,3)
Wend
Else
GetSQLMessages(0)
EndIf
If GetDatabaseDBNames(0)
While NextDatabaseRow(0)
Debug "Database: " + GetDatabaseString(0,0)
Wend
Else
GetSQLMessages(0)
EndIf
EndIf
[Edit] Added SQLCancel_()
[Edit] Added PB4.02 Support