'SqlDemo.bas continued
Function iCreateMdb(strDBName As String) As Long
Local strCreate As String
#If %Def(%MyDebug)
Print #fp, " Entering iCreateMdb()"
#EndIf
strCreate="CREATE_DB=" & strDBName
If SQLConfigDataSource(0,%ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)",Byval Strptr(strCreate)) Then
Function=%TRUE
Else
Function=iInstallerError()
End If
#If %Def(%MyDebug)
Print #fp, " Leaving iCreateMdb()"
#EndIf
End Function
Function blnMakeAccessTable(Sql As ISql) As Long
Local szQuery As Asciiz*128
Local hStmt As Dword
szQuery= _ 'These four types are all you really need.
"CREATE TABLE Table1 " & _ 'Doubles will work for currency.
"(" & _
"Id LONG, " & _ 'Note that all interactions with the
"Float_Point DOUBLE, " & _ 'underlying database are through Sql
"Date_Field DATETIME, " & _ 'statements
"Text_Field CHAR(30)" & _
");"
Call SQLAllocHandle(%SQL_HANDLE_STMT,sql.hConn,hStmt)
If SQLExecDirect(hStmt,szQuery,%SQL_NTS)=0 Then
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
blnMakeAccessTable=%TRUE
Else
blnMakeAccessTable=%FALSE
End If
End Function
Function GetRecordCount(Sql As ISql) As Long
Local szQuery As Asciiz*64
Local iRecCt,iJnk As Long
Local hStmt As Dword
szQuery="SELECT Count(*) As RecordCount From Table1;"
Call SQLAllocHandle(%SQL_HANDLE_STMT,sql.hConn,hStmt)
Call SQLBindCol(hStmt,1,%SQL_C_ULONG,iRecCt,0,iJnk)
If SQLExecDirect(hStmt,szQuery,%SQL_NTS)=%SQL_SUCCESS Then
Call SQLFetch(hStmt)
Call SQLCloseCursor(hStmt)
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
Function=iRecCt
Else
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
#If %Def(%MyDebug)
Print #fp, " Sql.iNativeErrCode = " Sql.iNativeErrCode
Print #fp, " Sql.strErrMsg = " Sql.strErrMsg
Print #fp, " Sql.strErrCode = " Sql.strErrCode
#EndIf
Function=-1
End If
End Function
Sub ParseDate(strDate As String,strFormat As String,strDelimiter As String,ts As tagTIMESTAMP_STRUCT)
Local strDt As String
Register i As Long
strDt=strDate
Select Case As Const$ UCase$(strFormat) 'If your program has dates in formats such as
Case "MDY" '11/15/1952, 11-15-1952, 15.11.1952, 1952,11,15,
For i=1 To Len(strDt) 'then these strings need to be parsed to tease
If Mid$(strDt,i,1)=strDelimiter Then 'out the day, month and year numbers for transfer
ts.month=Val(Left$(strDt,i-1)) 'to an ODBC tagTIMESTAMP_STRUCT. This structure
strDt=Right$(strDt,Len(strDt)-i) 'is defined in SqlTypes.inc like so...
Exit For '
End If ' TYPE tagTIMESTAMP_STRUCT
Next i ' year AS INTEGER '2 bytes
For i=1 To Len(strDt) ' month AS WORD '2 bytes
If Mid$(strDt,i,1)=strDelimiter Then ' day AS WORD '2 bytes
ts.day=Val(Left$(strDt,i-1)) ' hour AS WORD '2 bytes
ts.year=Val(Right$(strDt,4)) ' minute AS WORD '2 bytes
Exit For ' second AS WORD '2 bytes
End If ' fraction AS DWORD '4 bytes
Next i ' END TYPE '16 bytes total
Case "DMY" '
For i=1 To Len(strDt) 'ParseDate() takes four parameters as follows...
If Mid$(strDt,i,1)=strDelimiter Then '
ts.day=Val(Left$(strDt,i-1)) '
strDt=Right$(strDt,Len(strDt)-i) 'Sub ParseDate
Exit For '(
End If ' strDate As String, 'e.g., "11/15/1952"
Next i ' strFormat As String, 'e.g., "mdy"
For i=1 To Len(strDt) ' strDelimiter As String, 'e.g., "\", "-", "."
If Mid$(strDt,i,1)=strDelimiter Then ' ts As tagTIMESTAMP_STRUCT
ts.month=Val(Left$(strDt,i-1)) ')
ts.year=Val(Right$(strDt,4)) '
Exit For '
End If 'Example - Call ParseDate("11/15/1952","mdy","/",ts)
Next i
Case "YMD"
For i=1 To Len(strDt)
If Mid$(strDt,i,1)=strDelimiter Then
ts.year=Val(Left$(strDt,i-1))
strDt=Right$(strDt,Len(strDt)-i)
Exit For
End If
Next i
For i=1 To Len(strDt)
If Mid$(strDt,i,1)=strDelimiter Then
ts.month=Val(Left$(strDt,i-1))
ts.day=Val(Right$(strDt,2))
Exit For
End If
Next i
End Select
End Sub
Function blnInsert(Sql As ISql, Byval ptrLines As Dword Ptr, iLine As Long, Byval hWnd As Dword, Byval iCtRecs As Long) As Long
Local strFld1 As String*4, strFld2 As String*8, strFld3 As String*16, strFld4 As String*20
Local iId,iJnk,iStr,iReturn As Long
Local ts As tagTIMESTAMP_STRUCT
Local szString As Asciiz*32
Local strDates() As String
Local szLine As Asciiz*128
Local dblNums() As Double
Local strStrs() As String
Local dblNum As Double
Local hStmt As Dword
Register i As Long
#If %Def(%MyDebug)
Print #fp, "Entering blnInsert()"
#EndIf
Redim dblNums(3) As Double : dblNums(0)=3.14159 : dblNums(1)=1.23456 : dblNums(2)=15.1234 : dblNums(3)=0.54321
Redim strDts(3) As String : strDts(0)="11/15/1952" : strDts(1)="6/30/1969" : strDts(2)="1/1/2006" : strDts(3)="4/1/2006"
Redim strStrs(3) As String : strStrs(0)="My Birthday" : strStrs(1)="Walk On Moon?" : strStrs(2)="Some String" : strStrs(3)="April Fools Day!"
If SQLAllocHandle(%SQL_HANDLE_STMT,sql.hConn,hStmt)=%SQL_SUCCESS Then 'Allocate statement handle
szLine="INSERT INTO Table1 (Id,Float_Point,Date_Field,Text_Field) VALUES(?,?,?,?)"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
Incr iLine
iStr=%SQL_NTS
If SQLPrepare(hStmt,szLine,%SQL_NTS)=%SQL_SUCCESS Then
SQLBindParameter(hStmt,1,%SQL_PARAM_INPUT,%SQL_C_LONG,%SQL_INTEGER,0,0,iId,0,iJnk)
SQLBindParameter(hStmt,2,%SQL_PARAM_INPUT,%SQL_C_DOUBLE,%SQL_DOUBLE,0,0,dblNum,0,iJnk)
SQLBindParameter(hStmt,3,%SQL_PARAM_INPUT,%SQL_C_TYPE_DATE,%SQL_TYPE_TIMESTAMP,16,0,ts,0,iJnk)
SQLBindParameter(hStmt,4,%SQL_PARAM_INPUT,%SQL_C_CHAR,%SQL_CHAR,31,0,szString,32,iStr)
szLine=" SQLExecute(hStmt)"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine=" iId Double Date String 0=SQL_SUCCESS "
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="========================================================================"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
For i=0 To 3
iId=i+iCtRecs+1 : dblNum=dblNums(i)
Call ParseDate(strDts(i),"mdy","/",ts)
szString=strStrs(i)
iReturn=SQLExecute(hStmt)
If iReturn<>%SQL_SUCCESS Then
Sql.ODBCGetDiagRec(hStmt)
szLine="Sql.strErrCode = " & Sql.strErrCode
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="Sql.strErrMsg = " & Sql.strErrMsg
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="Sql.iNativeErrCode = " & Str$(Sql.iNativeErrCode)
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
Function=%FALSE
Exit Function
Else
LSet strFld1=Str$(iId) : RSet strFld2=Format$(dblNum,"#0.0###") : RSet strFld3=strDts(i) : LSet strFld4=szString
szLine=strFld1 & " " & strFld2 & strFld3 & " " & strFld4 & Str$(iReturn)
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
End If
Next i
SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
blnInsert=%TRUE
Else
blnInsert=%FALSE
End If
Else
blnInsert=%FALSE
End If
#If %Def(%MyDebug)
Print #fp, " Leaving blnInsert()"
#EndIf
End Function
Function blnDumpData(Sql As ISql, Byval ptrLines As Dword Ptr, iLine As Long, Byval hWnd As Dword, Byval iCtRecs As Long) As Long
Local strFld1 As String*4, strFld2 As String*8, strFld3 As String*16, strFld4 As String*20
Local szQuery As Asciiz*64, szLine As Asciiz*80, szString As Asciiz*32
Local ts As tagTIMESTAMP_STRUCT
Local strDate As String
Local dblNum As Double
Local iId,iJnk As Long
Local hStmt As Dword
#Register None
If SQLAllocHandle(%SQL_HANDLE_STMT,Sql.hConn,hStmt)=0 Then
Incr iLine
szQuery="SELECT Id, Float_Point, Date_Field, Text_Field FROM Table1;"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szQuery))
Incr iLine
Call SQLBindCol(hStmt,1,%SQL_C_ULONG,iId,0,iJnk)
Call SQLBindCol(hStmt,2,%SQL_C_DOUBLE,dblNum,0,iJnk)
Call SQLBindCol(hStmt,3,%SQL_C_TYPE_DATE,ts,0,iJnk)
Call SQLBindCol(hStmt,4,%SQL_C_CHAR,szString,30,iJnk)
szLine=" SQLExecute(hStmt)"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine=" iId Double Date String 0=SQL_SUCCESS "
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="========================================================================"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
If SQLExecDirect(hStmt,szQuery,%SQL_NTS)=%SQL_SUCCESS Then
Do While SQLFetch(hStmt)<>%SQL_NO_DATA
strDate=Trim$(Str$(ts.month))+"/"+Trim$(Str$(ts.day))+"/"+Trim$(Str$(ts.year))
LSet strFld1=Str$(iId) : RSet strFld2=Format$(dblNum,"#0.0###") : RSet strFld3=strDate : LSet strFld4=Left$(szString,16)
szLine=strFld1 & " " & strFld2 & strFld3 & " " & strFld4 & " 0"
Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
Loop
Call SQLCloseCursor(hStmt)
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
blnDumpData=%TRUE
Else
Sql.ODBCGetDiagRec(hStmt)
szLine="SQLExecDirect() In blnDumpData() Failed!" : Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="Sql.strErrCode = " & Sql.strErrCode : Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="Sql.strErrMsg = " & Sql.strErrMsg : Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
szLine="Sql.iNativeErrCode = " & Str$(Sql.iNativeErrCode) : Prnt(hWnd,Sql,ptrLines,iLine,Varptr(szLine))
blnDumpData=%FALSE
End If
Else
blnDumpData=%FALSE
End If
End Function
Function AccessThread(Byval pVoid As Dword) As Dword
Local iDatabaseReturn,iRecCt,iScreenLinesNeeded,iLine,iReturn As Long
Local hOutput,hMainWnd As Dword
Local cs As CRITICAL_SECTION
Local ptrLines As Dword Ptr
Local szLn As Asciiz*128
Local Sql As ISql
#If %Def(%MyDebug)
Print #fp, " Entering AccessThread()"
#EndIf
hOutput=FindWindowEx(0,0,"frmOutput","Data Dump Of Access Database With ODBC")
hMainWnd=FindWindowEx(0,0,"SqlDemo","ODBC Demo")
If hOutput Then
Let Sql=Class "CSql"
Sql.strDriver="Microsoft Access Driver (*.mdb)"
Sql.strDBQ=CurDir$+"\TestData.mdb"
iDatabaseReturn=iCreateMdb(Sql.strDBQ)
#If %Def(%MyDebug)
Print #fp, " iDatabaseReturn = " iDatabaseReturn
#EndIf
Sql.ODBCConnect()
If Sql.blnConnected Then
Select Case As Long iDatabaseReturn
Case 1
If blnMakeAccessTable(Sql) Then
iRecCt=GetRecordCount(Sql)
#If %Def(%MyDebug)
Print #fp, " iRecCt = " iRecCt
#EndIf
iScreenLinesNeeded=iScreenLinesNeeded+iRecCt+25
ptrLines=GlobalAlloc(%GPTR,iScreenLinesNeeded*Sizeof(ptrLines))
If ptrLines Then
Call SetWindowLong(hOutput,0,iScreenLinesNeeded)
Call SetWindowLong(hOutput,4,ptrLines)
szLn=CurDir$
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn=Sql.strConnectionString
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="ODBC Connection Succeeded!"
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="TestData.mdb Successfully Created As Well As Table1 In TestData."
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
If blnInsert(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
If blnDumpData(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
iReturn=%TRUE
Else
iReturn=%FALSE
End If
Else
iReturn=%FALSE
End If
Else
iReturn=%FALSE
End If
Else
iReturn=%FALSE
End If
Case 11
iRecCt=GetRecordCount(Sql)
#If %Def(%MyDebug)
Print #fp, " iRecCt = " iRecCt
#EndIf
iScreenLinesNeeded=iScreenLinesNeeded+iRecCt+25
ptrLines=GlobalAlloc(%GPTR,iScreenLinesNeeded*Sizeof(ptrLines))
If ptrLines Then
Call SetWindowLong(hOutput,0,iScreenLinesNeeded)
Call SetWindowLong(hOutput,4,ptrLines)
szLn=CurDir$
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn=Sql.strConnectionString
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="ODBC Connection Succeeded!"
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="TestData.mdb Already Existed And Contained" & Str$(iRecCt) & " Records."
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
If blnInsert(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
If blnDumpData(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
iReturn=%TRUE
Else
iReturn=%FALSE
End If
Else
iReturn=%FALSE
End If
Else
iReturn=%FALSE
End If
Case Else
iReturn=%FALSE
End Select
Sql.ODBCDisconnect()
End If
End If
#If %Def(%MyDebug)
Print #fp, " Leaving AccessThread()"
#EndIf
Function=iReturn
End Function
Sub btnAccess_OnClick(Wea As WndEventArgs)
Local hOutput,hIns,hThread,hWait,iReturn As Dword
Local szTxt As Asciiz*48
#If %Def(%MyDebug)
Print #fp, "Entering btnAccess_OnClick()"
#EndIf
MousePtr 11
Call EnableWindow(GetDlgItem(Wea.hWnd,%IDC_MS_ACCESS),%FALSE)
hIns=GetModuleHandle("")
szTxt="Data Dump Of Access Database With ODBC"
hOutput=CreateWindow("frmOutput",szTxt,%WS_OVERLAPPEDWINDOW,200,500,725,275,0,0,hIns,Byval 0)
Thread Create AccessThread(0) To hThread
hWait=WaitForSingleObject(hThread,%INFINITE)
Thread Status hThread To iReturn
#If %Def(%MyDebug)
Print #fp, " iReturn = " iReturn
#EndIf
Thread Close hThread To iReturn
#If %Def(%MyDebug)
Print #fp, " hThread = " hThread
#EndIf
Call ShowWindow(hOutput,%SW_SHOWNORMAL)
MousePtr 1
Call EnableWindow(GetDlgItem(Wea.hWnd,%IDC_MS_ACCESS),%TRUE)
#If %Def(%MyDebug)
Print #fp, "Leaving btnAccess_OnClick()" : Print #fp
#EndIf
End Sub
Function iCreateSqlServer(Sql As ISql, strDBName As String) As Long
Local szBuffer As Asciiz*512
Local strBuffer As String
Local dwBuffer As Dword
Local iReturn As Long
Local hStmt As Dword
dwBuffer=512
Call GetCurrentDirectory(dwBuffer,szBuffer) 'For this demo I'm creating an SQL Server
strBuffer= _ 'database in whatever directory you decide
"CREATE DATABASE " & strDBName & " " & _ 'to run this program from. SQL Server
"ON " & _ 'databases in the latest versions of SQL
"(" & _ 'Server show up as part of the regular
"NAME=" & Chr$(39) & strDBName & Chr$(39) & "," & _
"FILENAME=" & Chr$(39) & szBuffer & "\" & strDBName & ".mdf" & Chr$(39) & "," & _
"SIZE=10," & _
"MAXSIZE=50," & _ 'file system and are comprised of a *.mdf
"FILEGROWTH=5" & _ 'file (the main database file) and a *.ldf
") LOG ON " & _ 'file (the database log). These files need
"(" & _ 'not be under the SQL Server installation
"NAME=" & Chr$(39) & strDBName & "Log" & Chr$(39) & "," & _
"FILENAME=" & Chr$(39) & szBuffer & "\" & strDBName & ".ldf" & Chr$(39) & "," & _
"SIZE=5," & _
"MAXSIZE=25," & _ 'directory, but can be anywhere you wish
"FILEGROWTH=5MB" & _ 'to place them.
");"
If SQLAllocHandle(%SQL_HANDLE_STMT,Sql.hConn,hStmt)=%SQL_SUCCESS Then
iReturn=SQLExecDirect(hStmt,ByVal StrPtr(strBuffer),%SQL_NTS)
If iReturn=%SQL_SUCCESS Or iReturn=%SQL_SUCCESS_WITH_INFO Then
iCreateSqlServer=1
Else
Sql.ODBCGetDiagRec(hStmt)
#If %Def(%MyDebug)
Print #fp, "SQLExecDirect() In blnCreateSqlServer() Failed!"
Print #fp, "Sql.strErrCode = " Sql.strErrCode
Print #fp, "Sql.strErrMsg = " Sql.strErrMsg
Print #fp, "Sql.iNativeErrCode = " Sql.iNativeErrCode
#EndIf
iCreateSqlServer=Sql.iNativeErrCode
End If
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
Else
iCreateSqlServer=%FALSE
End If
End Function
Function blnCreateTable(Sql As ISql, strTableName As String) As Long
Local szQuery As Asciiz*256
Local hStmt As Dword
szQuery= _
"CREATE TABLE " & strTableName & " " & _
"(" & _
"Id int NOT NULL, " & _ 'Note that all interactions with the
"Float_Point float NULL, " & _ 'underlying database are through Sql
"Date_Field smalldatetime NULL, " & _ 'statements
"Text_Field nvarchar(32) NULL" & _
");"
Call SQLAllocHandle(%SQL_HANDLE_STMT,sql.hConn,hStmt)
If SQLExecDirect(hStmt,szQuery,%SQL_NTS)=%SQL_ERROR Then
#If %Def(%MyDebug)
Print #fp, "Table Creation Failure!"
Sql.ODBCGetDiagRec(hStmt)
Print #fp, "Sql.strErrCode = " Sql.strErrCode
Print #fp, "Sql.strErrMsg = " Sql.strErrMsg
Print #fp, "Sql.iNativeErrCode = " Sql.iNativeErrCode
#EndIf
blnCreateTable=%FALSE
Else
Call SQLFreeHandle(%SQL_HANDLE_STMT,hStmt)
blnCreateTable=%TRUE
End If
End Function
Function SqlServerThread(Byval pVoid As Dword) As Dword
Local iDatabaseReturn,iRecCt,iScreenLinesNeeded,iLine,iReturn As Long
Local szLn As Asciiz*128, lpBuffer As Asciiz*512
Local hOutput,hMainWnd,nSize As Dword
Local ptrLines As Dword Ptr
Local Sql As ISql
#If %Def(%MyDebug)
Print #fp, " Entering SqlServerThread()"
#EndIf
hOutput=FindWindowEx(0,0,"frmOutput","Data Dump Of Sql Server With ODBC")
hMainWnd=FindWindowEx(0,0,"SqlDemo","ODBC Demo")
If hOutput Then
Let Sql=Class "CSql"
Sql.strDriver="SQL Server"
'For SQL Server Express
nSize=512
Call GetComputerName(lpBuffer,nSize)
Sql.strServer=lpBuffer+"\SQLEXPRESS"
'End Sql Server Express
'''MSDE 'If you don't have Sql Server Express installed but rather Microsoft's MSDE,
'Sql.strServer="localhost" 'then simply set Sql.strServer to "localhost" and comment out the three
'''End MSDE 'lines above. MSDE is the database engine for Sql Server 2000, I believe.
Sql.ODBCConnect()
If Sql.blnConnected Then
#If %Def(%MyDebug)
Print #fp, " Sql.blnConnected=%TRUE
#EndIf
iReturn=iCreateSqlServer(Sql,"TestData")
Select Case As Long iReturn
Case 1
#If %Def(%MyDebug)
Print #fp, " Successfully Created SQL Server Database TestData"
#EndIf
Sql.ODBCDisconnect()
iScreenLinesNeeded=25
Call SetWindowLong(hOutput,0,iScreenLinesNeeded)
ptrLines=GlobalAlloc(%GPTR,iScreenLinesNeeded*Sizeof(ptrLines))
If ptrLines Then
Call SetWindowLong(hOutput,4,ptrLines)
szLn="Sql.strDriver = " & Sql.strDriver
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Sql.strServer = " & Sql.strServer
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Sql.strConnectionString = " & Sql.strConnectionString
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Current Directory = " & CurDir$
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
Sql.strDBQ=CurDir$ & "\TestData.mdf"
Sql.strDatabase = "TestData"
Sql.ODBCConnect()
If Sql.blnConnected Then
iReturn=blnCreateTable(Sql,"Table1")
If iReturn=%SQL_SUCCESS Or iReturn=%SQL_SUCCESS_WITH_INFO Then
#If %Def(%MyDebug)
Print #fp, " Successfully Created SQL Server Database Table Table1 In TestData."
#EndIf
If blnInsert(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
#If %Def(%MyDebug)
Print #fp, " blnInsert() Succeeded!"
#EndIf
Else
#If %Def(%MyDebug)
Print #fp, " blnInsert() Failed!"
#EndIf
End If
If blnDumpData(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
#If %Def(%MyDebug)
Print #fp, " blnDumpData() Succeeded!"
#EndIf
Else
#If %Def(%MyDebug)
Print #fp, " blnDumpData() Failed!"
#EndIf
End If
Else
#If %Def(%MyDebug)
Print #fp, " Failed To Create Table1 In TestData."
#EndIf
Call GlobalFree(ptrLines)
Call SetWindowLong(hOutput,4,0)
Function=%FALSE
End If
Sql.ODBCDisconnect()
Else
#If %Def(%MyDebug)
Print #fp, " Could Not Reconnect To Sql Server. Must Abort."
#EndIf
Call GlobalFree(ptrLines)
Call SetWindowLong(hOutput,4,0)
Function=%FALSE
End If
Else
#If %Def(%MyDebug)
Print #fp, " Could Not Allocate Memory For ptrLines. Must Abort."
#EndIf
iReturn=%FALSE
End If
Case 1801 'If the Sql Server database 'TestData' already exists, you'll get a Native Error Code of 1801 returned
#If %Def(%MyDebug)
Print #fp, " The Database 'TestData' Apparently Already Exists."
#EndIf
Sql.ODBCDisconnect()
Sql.strDatabase = "TestData"
Sql.strDBQ=CurDir$ + "\TestData.mdf"
Sql.ODBCConnect()
If Sql.blnConnected Then
iRecCt=GetRecordCount(Sql)
#If %Def(%MyDebug)
Print #fp, " iRecCt = " iRecCt
#EndIf
If iRecCt<>-1 Then
iScreenLinesNeeded=25+iRecCt
Call SetWindowLong(hOutput,0,iScreenLinesNeeded)
ptrLines=GlobalAlloc(%GPTR,iScreenLinesNeeded*Sizeof(ptrLines))
'Print #fp, "ptrLines = " ptrLines
If ptrLines Then
Call SetWindowLong(hOutput,4,ptrLines)
szLn="Failed To Create SQL Server Database!"
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Failed To Create SQL Server Database!"
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="TestData Already Exists In Sql Server!"
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Sql.strDriver = " & Sql.strDriver
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Sql.strServer = " & Sql.strServer
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
szLn="Sql.strConnectionString = " & Sql.strConnectionString
Prnt(hMainWnd,Sql,ptrLines,iLine,Varptr(szLn))
If blnInsert(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
#If %Def(%MyDebug)
Print #fp, " blnInsert() Succeeded!"
#EndIf
Else
#If %Def(%MyDebug)
Print #fp, " blnInsert() Failed!"
#EndIf
End If
If blnDumpData(Sql,ptrLines,iLine,hMainWnd,iRecCt) Then
#If %Def(%MyDebug)
Print #fp, " blnDumpData() Succeeded!"
#EndIf
Else
#If %Def(%MyDebug)
Print #fp, " blnDumpData() Failed!"
#EndIf
End If
Else
#If %Def(%MyDebug)
Print #fp, " ptrLines = 0 So Memory Didn't Allocate!"
#EndIf
End If
Else
#If %Def(%MyDebug)
Print #fp, " Couldn't Get Record Count! Must Abort!"
#EndIf
iReturn=%FALSE
End If
Sql.ODBCDisconnect()
Else
#If %Def(%MyDebug)
Print #fp, " Could Not Reconnect To Sql Server. Must Abort."
#EndIf
iReturn=%FALSE
End If
Case 5133
#If %Def(%MyDebug)
Print #fp, " Failure In Creation Of Sql Server Database TestData."
Print #fp, " It May Be You Are Trying To Run This Program From Some
Print #fp, " Directory Where SQL Server Won't Create Databases.
#EndIf
Sql.ODBCDisconnect()
iReturn=%FALSE
Case Else
#If %Def(%MyDebug)
Print #fp, " Some Unknown Error Occurred For Which This Application"
Print #fp, " Has No Response."
#EndIf
Sql.ODBCDisconnect()
iReturn=%FALSE
End Select
Else
#If %Def(%MyDebug)
Print #fp, " Sql.blnConnected=%FALSE. Could Not Connect To Sql Server.
#EndIf
iReturn=%FALSE
End If
Else
#If %Def(%MyDebug)
Print #fp, " Could Not Obtain A Handle To The Output Screen - frmOutput."
#EndIf
iReturn=%FALSE
End If
#If %Def(%MyDebug)
Print #fp, " Leaving SqlServerThread()"
#EndIf
Function=iReturn
End Function
Sub btnSqlServerExpress_OnClick(Wea As WndEventArgs)
Local hOutput,hIns,hThread,hWait,iReturn As Dword
Local szTxt As Asciiz*48
#If %Def(%MyDebug)
Print #fp, "Entering btnSqlServerExpress_OnClick()"
#EndIf
MousePtr 11
Call EnableWindow(GetDlgItem(Wea.hWnd,%IDC_SQL_SERVER_EXPRESS),%FALSE)
hIns=GetModuleHandle("")
szTxt="Data Dump Of Sql Server With ODBC"
hOutput=CreateWindow("frmOutput",szTxt,%WS_OVERLAPPEDWINDOW,200,500,725,275,0,0,hIns,Byval 0)
Thread Create SqlServerThread(0) To hThread
hWait=WaitForSingleObject(hThread,%INFINITE)
Thread Status hThread To iReturn
#If %Def(%MyDebug)
Print #fp, " iReturn = " iReturn
#EndIf
Thread Close hThread To iReturn
#If %Def(%MyDebug)
Print #fp, " hThread = " hThread
#EndIf
Call ShowWindow(hOutput,%SW_SHOW)
MousePtr 1
Call EnableWindow(GetDlgItem(Wea.hWnd,%IDC_SQL_SERVER_EXPRESS),%TRUE)
#If %Def(%MyDebug)
Print #fp, "Leaving btnSqlServerExpress_OnClick()" : Print #fp
#EndIf
End Sub
Function fnWndProc_OnCommand(Wea As WndEventArgs) As Long
Select Case As Long Lowrd(Wea.wParam)
Case %IDC_SQL_DRIVERS
Call btnSqlDrivers_OnClick(Wea)
Case %IDC_EXCEL
Call btnExcel_OnClick(Wea)
Case %IDC_MS_ACCESS
Call btnAccess_OnClick(Wea)
Case %IDC_SQL_SERVER_EXPRESS
Call btnSqlServerExpress_OnClick(Wea)
End Select
fnWndProc_OnCommand=0
End Function
Function fnWndProc_OnClose(wea As WndEventArgs) As Long
Local hOutput As Dword
Do 'Search And Destroy Mission For Any Sql Drivers Windows Hanging Around
hOutput=FindWindowEx(0,0,"frmOutput","ODBC Database Drivers On Your System")
If hOutput Then
Call SendMessage(hOutput,%WM_CLOSE,0,0)
Else
Exit Do
End If
Loop
Do 'Search And Destroy Mission For Any Excel Output Windows Hanging Around
hOutput=FindWindowEx(0,0,"frmOutput","Data Dump Of Excel Spreadsheet With ODBC")
If hOutput Then
Call SendMessage(hOutput,%WM_CLOSE,0,0)
Else
Exit Do
End If
Loop
Do 'Search And Destroy Mission For Any Access Output Windows Hanging Around
hOutput=FindWindowEx(0,0,"frmOutput","Data Dump Of Access Database With ODBC")
If hOutput Then
Call SendMessage(hOutput,%WM_CLOSE,0,0)
Else
Exit Do
End If
Loop
Do 'Search And Destroy Mission For Any Sql Server Output Windows Hanging Around
hOutput=FindWindowEx(0,0,"frmOutput","Data Dump Of Sql Server With ODBC")
If hOutput Then
Call SendMessage(hOutput,%WM_CLOSE,0,0)
Else
Exit Do
End If
Loop
Call PostQuitMessage(0)
fnWndProc_OnClose=0
End Function
Function fnWndProc(ByVal hWnd As Long,ByVal wMsg As Long,ByVal wParam As Long,ByVal lParam As Long) As Long
Local Wea As WndEventArgs
Register iReturn As Long
Register i As Long
For i=0 To 2
If wMsg=MsgHdlr(i).wMessage Then
Wea.hWnd=hWnd : Wea.wParam=wParam : Wea.lParam=lParam
Call Dword MsgHdlr(i).dwFnPtr Using FnPtr(Wea) To iReturn
fnWndProc=iReturn
Exit Function
End If
Next i
fnWndProc=DefWindowProc(hWnd,wMsg,wParam,lParam)
End Function
Sub AttachMessageHandlers() 'Associate Windows Message With Message Handlers
Redim frmOutputHdlr(4) As MessageHandler
ReDim MsgHdlr(2) As MessageHandler
MsgHdlr(0).wMessage=%WM_CREATE : MsgHdlr(0).dwFnPtr=CodePtr(fnWndProc_OnCreate)
MsgHdlr(1).wMessage=%WM_COMMAND : MsgHdlr(1).dwFnPtr=CodePtr(fnWndProc_OnCommand)
MsgHdlr(2).wMessage=%WM_CLOSE : MsgHdlr(2).dwFnPtr=CodePtr(fnWndProc_OnClose)
frmOutputHdlr(0).wMessage=%WM_CREATE : frmOutputHdlr(0).dwFnPtr=CodePtr(frmOutput_OnCreate)
frmOutputHdlr(1).wMessage=%WM_PAINT : frmOutputHdlr(1).dwFnPtr=CodePtr(frmOutput_OnPaint)
frmOutputHdlr(2).wMessage=%WM_SIZE : frmOutputHdlr(2).dwFnPtr=CodePtr(frmOutput_OnSize)
frmOutputHdlr(3).wMessage=%WM_VSCROLL : frmOutputHdlr(3).dwFnPtr=CodePtr(frmOutput_OnVScroll)
frmOutputHdlr(4).wMessage=%WM_CLOSE : frmOutputHdlr(4).dwFnPtr=CodePtr(frmOutput_OnClose)
End Sub
Function WinMain(ByVal hIns As Long, ByVal hPrevIns As Long, ByVal lpCmdLn As Asciiz Ptr, ByVal iShowWnd As Long) As Long
Local szAppName As Asciiz*16
Local wc As WndClassEx
Local Msg As tagMsg
Local hWnd As Dword
Call AttachMessageHandlers() : szAppName="SqlDemo"
wc.lpszClassName=VarPtr(szAppName) : wc.lpfnWndProc=CodePtr(fnWndProc)
wc.cbSize=SizeOf(wc) : wc.style=%CS_HREDRAW Or %CS_VREDRAW
wc.cbClsExtra=0 : wc.cbWndExtra=0
wc.hInstance=hIns : wc.hIcon=LoadIcon(%NULL, ByVal %IDI_APPLICATION)
wc.hCursor=LoadCursor(%NULL, ByVal %IDC_ARROW) : wc.hbrBackground=%COLOR_BTNFACE+1
wc.lpszMenuName=%NULL
Call RegisterClassEx(wc)
hWnd=CreateWindow(szAppName,"ODBC Demo",%WS_OVERLAPPEDWINDOW,200,100,400,225,0,0,hIns,ByVal 0)
Call ShowWindow(hWnd,iShowWnd)
While GetMessage(Msg,%NULL,0,0)
TranslateMessage Msg
DispatchMessage Msg
Wend
Function=msg.wParam
End Function