home *** CD-ROM | disk | FTP | other *** search
-
- 'SQLUTILS.BAS -- Utility fuctions for BASIC DB-LIBRARY.
-
- 'Copyright (c) 1990 by Microsoft Corp. All Rights Reserved.
-
-
- '$INCLUDE: 'sql.bi'
-
- 'Type definition used by SqlGetTableInfo% and SqlSendQuery%.
- TYPE ColumnData
- Name AS STRING * 30
- Type AS INTEGER
- Length AS LONG
- ServerType AS STRING * 13
- END TYPE
-
- 'Declaration of utility functions.
- DECLARE FUNCTION SqlOpenConnection& (Server$, LoginID$, Passwd$, Workstation$, Application$)
- DECLARE FUNCTION SqlGetTableInfo% (SqlConn&, Database$, Table$, Column() AS ColumnData, ColCount%)
- DECLARE FUNCTION SqlSendQuery% (SqlConn&, Query$, Column() AS ColumnData, Results() AS STRING, RowCount%, ColCount%)
- DECLARE FUNCTION SqlServType$ (SqlType%)
-
- 'This function obtains, in a ColumnData array, the metadata for any single
- 'table from any database. If the database name is blank, the current
- 'database is queried.
- '
- 'The array passed as a parameter must be dynamic. Allocate the array in
- 'the calling procedure with the REDIM statement.
- '
- FUNCTION SqlGetTableInfo% (SqlConn&, Database$, Table$, Column() AS ColumnData, ColCount%)
-
- DIM ColumnNam(1 TO 255) AS STRING * 30
- DIM ColumnTyp(1 TO 255) AS INTEGER
- DIM ColumnLen(1 TO 255) AS LONG
-
- 'Assemble SQL command string to send.
- cmd$ = "SELECT col.name, col.type, col.length FROM "
- IF Database$ <> "" THEN
- sysobjs$ = Database$ + "..syscolumns col," + Database$ + "..sysobjects obj"
- ELSE
- sysobjs$ = "syscolumns col, sysobjects obj"
- END IF
- cmd$ = cmd$ + sysobjs$ + " WHERE obj.id = col.id and obj.name = '" + Table$ + "'"
-
- 'Send command string to SQL Server.
- IF SqlCmd%(SqlConn&, cmd$) = FAIL THEN
- SqlGetTableInfo% = FAIL
- EXIT FUNCTION
- END IF
-
- IF SqlExec%(SqlConn&) = FAIL THEN
- SqlGetTableInfo% = FAIL
- EXIT FUNCTION
- END IF
-
- 'Read rows, storing metadata in arrays.
- Result% = SqlResults%(SqlConn&)
- Result% = SqlNextRow%(SqlConn&)
- ColCount% = 0
- DO UNTIL Result% = NO.MORE.ROWS
- IF Result% = FAIL THEN
- SqlGetTableInfo% = FAIL
- EXIT FUNCTION
- END IF
-
- IF Result% = BUF.FULL THEN
- CALL SqlClrBuf(SqlConn&, 1)
- ELSE
- ColCount% = ColCount% + 1
- ColumnNam(ColCount%) = SqlData$(SqlConn&, 1)
- ColumnTyp(ColCount%) = VAL(SqlData$(SqlConn&, 2))
- ColumnLen(ColCount%) = VAL(SqlData$(SqlConn&, 3))
- END IF
-
- Result% = SqlNextRow%(SqlConn&)
- LOOP
-
- IF ColCount% = 0 THEN
- SqlGetTableInfo% = FAIL
- EXIT FUNCTION
- END IF
-
- 'Transfer results into ColumnData array.
- REDIM Column(1 TO ColCount%) AS ColumnData
- FOR c% = 1 TO ColCount%
- Column(c%).Name = ColumnNam(c%)
- Column(c%).Type = ColumnTyp(c%)
- Column(c%).Length = ColumnLen(c%)
- Column(c%).ServerType = SqlServType$(ColumnTyp(c%))
- NEXT c%
-
- SqlGetTableInfo% = SUCCEED%
-
- END FUNCTION
-
- 'This function fills in a login record and opens a SQL Server connection.
- '
- FUNCTION SqlOpenConnection& (Server$, LoginID$, Passwd$, Workstation$, Application$)
-
- 'Obtain a login record and fill in.
- Login& = SqlLogin&
- IF Login& = 0& THEN
- SqlOpenConnection& = 0&
- EXIT FUNCTION
- END IF
-
- IF LoginID$ <> "" THEN
- IF SqlSetLUser%(Login&, LoginID$) = FAIL THEN
- CALL SqlFreeLogin(Login&)
- SqlOpenConnection& = 0&
- EXIT FUNCTION
- END IF
- END IF
-
- IF Passwd$ <> "" THEN
- IF SqlSetLPwd%(Login&, Passwd$) = FAIL THEN
- CALL SqlFreeLogin(Login&)
- SqlOpenConnection& = 0&
- EXIT FUNCTION
- END IF
- END IF
-
- IF Workstation$ <> "" THEN
- IF SqlSetLHost%(Login&, Workstation$) = FAIL THEN
- CALL SqlFreeLogin(Login&)
- SqlOpenConnection& = 0&
- EXIT FUNCTION
- END IF
- END IF
-
- IF Application$ <> "" THEN
- IF SqlSetLApp%(Login&, Application$) = FAIL THEN
- CALL SqlFreeLogin(Login&)
- SqlOpenConnection& = 0&
- EXIT FUNCTION
- END IF
- END IF
-
- 'Open connection and free login record.
- SqlOpenConnection& = SqlOpen&(Login&, Server$)
- CALL SqlFreeLogin(Login&)
-
- END FUNCTION
-
- 'This function sends a single query and obtains the results in a
- 'two-dimensional array. The metadata (column names, lengths, and
- 'datatypes) for the result columns is returned in a ColumnData array.
- '
- 'If more rows are returned than can be stored in the array, the
- 'function returns MORE.ROWS (-1). To obtain the remaining rows,
- 'call the function repeatedly with an empty Query$. If all rows
- 'are returned, the function returns SUCCEED (1).
- '
- 'The two arrays passed as parameters must be dynamic. Allocate the arrays
- 'in the calling procedure with the REDIM statement.
- '
- FUNCTION SqlSendQuery% (SqlConn&, Query$, Column() AS ColumnData, Results() AS STRING, RowCount%, ColCount%)
-
- 'Send the query to the server unless Query$ is empty.
- IF Query$ <> "" THEN
- Result% = SqlCancel%(SqlConn&)
-
- IF SqlCmd%(SqlConn&, Query$) = FAIL THEN
- SqlSendQuery% = FAIL
- EXIT FUNCTION
- END IF
-
- IF SqlExec%(SqlConn&) = FAIL THEN
- SqlSendQuery% = FAIL
- EXIT FUNCTION
- END IF
-
- Result% = SqlResults%(SqlConn&)
- END IF
-
- 'Store the metadata for the results in a ColumnData array.
- RowCount% = 0
- ColCount% = SqlNumCols%(SqlConn&)
- IF ColCount% = 0 THEN
- Result% = SqlCancel%(SqlConn&)
- SqlSendQuery% = SUCCEED
- EXIT FUNCTION
- END IF
- REDIM Column(1 TO ColCount%) AS ColumnData
- RowLen& = 0
- FOR c% = 1 TO ColCount%
- Column(c%).Name = SqlColName$(SqlConn&, c%)
- Column(c%).Type = SqlColType%(SqlConn&, c%)
- Column(c%).Length = SqlColLen&(SqlConn&, c%)
- Column(c%).ServerType = SqlServType$(Column(c%).Type)
-
- 'Add possible length of strings to RowLen&.
- SELECT CASE Column(c%).Type
- CASE SQLINT1: RowLen& = RowLen& + 3
- CASE SQLINT2: RowLen& = RowLen& + 6
- CASE SQLINT4: RowLen& = RowLen& + 10
- CASE SQLMONEY, SQLFLT8, SQLDATETIME
- RowLen& = RowLen& + 20
- CASE ELSE: RowLen& = RowLen& + Column(c%).Length
- END SELECT
- NEXT c%
-
- 'Determine maximum number of rows that fit in memory.
- FreeMem& = FRE(Results(LBOUND(Results, 1), LBOUND(Results, 2)))
- IF FreeMem& > (FRE(-1) \ 2) THEN FreeMem& = FRE(-1) \ 2
- MaxRows% = (FreeMem& - 1024) \ (6 * ColCount% + RowLen&)
-
- StackSize% = 8192 'You must set this to stack size if not 8K.
- Max2% = (STACK - StackSize% - 32) \ (ColCount% * 4)
- IF MaxRows% > Max2% THEN MaxRows% = Max2%
-
- IF MaxRows% = 0 THEN
- SqlSendQuery% = MORE.ROWS
- EXIT FUNCTION
- END IF
-
- REDIM Buffer(1 TO MaxRows%, 1 TO ColCount%) AS STRING
-
- 'Read the resulting rows into the buffer.
- Result% = SqlNextRow%(SqlConn&)
- DO UNTIL Result% = NO.MORE.ROWS
-
- IF Result% = FAIL THEN
- SqlSendQuery% = FAIL
- EXIT FUNCTION
- END IF
-
- IF Result% = BUF.FULL THEN
- CALL SqlClrBuf(SqlConn&, 1)
- ELSE
- RowCount% = RowCount% + 1
- FOR c% = 1 TO ColCount%
- Buffer(RowCount%, c%) = SqlData$(SqlConn&, c%)
- NEXT c%
- END IF
-
- IF RowCount% = MaxRows% THEN EXIT DO
- Result% = SqlNextRow%(SqlConn&)
- LOOP
-
- IF Result% = NO.MORE.ROWS THEN
- Result% = SqlCancel%(SqlConn&)
- SqlSendQuery% = SUCCEED
- ELSE
- SqlSendQuery% = MORE.ROWS
- END IF
-
- IF RowCount% = 0 THEN EXIT FUNCTION
-
- 'Transfer results from buffer.
- REDIM Results(1 TO RowCount%, 1 TO ColCount%) AS STRING
- FOR r% = 1 TO RowCount%
- FOR c% = 1 TO ColCount%
- Results(r%, c%) = Buffer(r%, c%)
- NEXT c%
- NEXT r%
- END FUNCTION
-
- 'This function takes a datatype value and returns the SQL Server
- 'datatype name.
- '
- FUNCTION SqlServType$ (SqlType%)
- SELECT CASE SqlType%
- CASE SQLCHAR
- SqlServType$ = "char"
- CASE SQLVARCHAR
- SqlServType$ = "varchar"
- CASE SQLTEXT
- SqlServType$ = "text"
- CASE SQLMONEY
- SqlServType$ = "money"
- CASE SQLMONEYN
- SqlServType$ = "money-null"
- CASE SQLDATETIME
- SqlServType$ = "datetime"
- CASE SQLDATETIMN
- SqlServType$ = "datetime-null"
- CASE SQLFLT8
- SqlServType$ = "float"
- CASE SQLFLTN
- SqlServType$ = "float-null"
- CASE SQLINTN
- SqlServType$ = "integer-null"
- CASE SQLINT1
- SqlServType$ = "tinyint"
- CASE SQLINT2
- SqlServType$ = "smallint"
- CASE SQLINT4
- SqlServType$ = "int"
- CASE SQLIMAGE
- SqlServType$ = "image"
- CASE SQLBINARY
- SqlServType$ = "binary"
- CASE SQLVARBINARY
- SqlServType$ = "varbinary"
- CASE SQLBIT
- SqlServType$ = "bit"
- CASE SQLAOPSUM
- SqlServType$ = "sum"
- CASE SQLAOPAVG
- SqlServType$ = "avg"
- CASE SQLAOPMIN
- SqlServType$ = "min"
- CASE SQLAOPMAX
- SqlServType$ = "max"
- CASE SQLAOPCOUNT
- SqlServType$ = "count"
- END SELECT
- END FUNCTION
-
-