home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / sql / vbsql / cursors.frm < prev    next >
Text File  |  1996-04-03  |  26KB  |  1,034 lines

  1. VERSION 2.00
  2. Begin Form PrimaryWindow 
  3.    BackColor       =   &H00C0C0C0&
  4.    BorderStyle     =   1  'Fixed Single
  5.    Caption         =   "Cursor Scroll Bar Example"
  6.    ForeColor       =   &H00000000&
  7.    Height          =   7215
  8.    Icon            =   CURSORS.FRX:0000
  9.    Left            =   990
  10.    LinkMode        =   1  'Source
  11.    LinkTopic       =   "Form1"
  12.    MaxButton       =   0   'False
  13.    ScaleHeight     =   6285
  14.    ScaleWidth      =   7725
  15.    Top             =   -30
  16.    Width           =   7845
  17.    Begin ListBox Cursor_Buffer 
  18.       FontBold        =   -1  'True
  19.       FontItalic      =   0   'False
  20.       FontName        =   "Courier"
  21.       FontSize        =   9.75
  22.       FontStrikethru  =   0   'False
  23.       FontUnderline   =   0   'False
  24.       Height          =   2955
  25.       Left            =   120
  26.       TabIndex        =   18
  27.       Top             =   3240
  28.       Width           =   7215
  29.    End
  30.    Begin VScrollBar VScroll1 
  31.       Height          =   3255
  32.       LargeChange     =   15
  33.       Left            =   7320
  34.       Max             =   500
  35.       SmallChange     =   15
  36.       TabIndex        =   20
  37.       Top             =   3000
  38.       Width           =   255
  39.    End
  40.    Begin VBSQL VBSQL1 
  41.       Caption         =   "SQL Error/Message"
  42.       Height          =   255
  43.       Left            =   5160
  44.       Top             =   2760
  45.       Visible         =   0   'False
  46.       Width           =   2175
  47.    End
  48.    Begin Frame Frame2 
  49.       BackColor       =   &H00C0C0C0&
  50.       Caption         =   "Cursor Information"
  51.       Height          =   1575
  52.       Left            =   120
  53.       TabIndex        =   5
  54.       Top             =   1080
  55.       Width           =   7455
  56.       Begin CommandButton Update_Button 
  57.          Caption         =   "&Update"
  58.          Height          =   375
  59.          Left            =   6360
  60.          TabIndex        =   16
  61.          Top             =   1080
  62.          Width           =   975
  63.       End
  64.       Begin ComboBox CC_List 
  65.          Height          =   300
  66.          Left            =   2160
  67.          Style           =   2  'Dropdown List
  68.          TabIndex        =   13
  69.          Top             =   1080
  70.          Width           =   3255
  71.       End
  72.       Begin CommandButton Close_Button 
  73.          Caption         =   "C&lose"
  74.          Height          =   375
  75.          Left            =   6360
  76.          TabIndex        =   15
  77.          Top             =   720
  78.          Width           =   975
  79.       End
  80.       Begin TextBox IntN_value 
  81.          Height          =   285
  82.          Left            =   4800
  83.          TabIndex        =   11
  84.          Text            =   "Text1"
  85.          Top             =   720
  86.          Width           =   495
  87.       End
  88.       Begin ComboBox Sensitivity_List 
  89.          Height          =   300
  90.          Left            =   2160
  91.          Style           =   2  'Dropdown List
  92.          TabIndex        =   9
  93.          Top             =   720
  94.          Width           =   2175
  95.       End
  96.       Begin CommandButton Open_Button 
  97.          Caption         =   "&Open "
  98.          Height          =   375
  99.          Left            =   6360
  100.          TabIndex        =   14
  101.          Top             =   360
  102.          Width           =   975
  103.       End
  104.       Begin TextBox Fetch_size 
  105.          Height          =   285
  106.          Left            =   2160
  107.          TabIndex        =   7
  108.          Text            =   "1"
  109.          Top             =   360
  110.          Width           =   375
  111.       End
  112.       Begin Label Label3 
  113.          BackColor       =   &H00C0C0C0&
  114.          Caption         =   "Concurrenc&y Control:"
  115.          Height          =   210
  116.          Left            =   120
  117.          TabIndex        =   12
  118.          Top             =   1080
  119.          Width           =   1845
  120.       End
  121.       Begin Label Label8 
  122.          BackColor       =   &H00C0C0C0&
  123.          Caption         =   "&N:"
  124.          Height          =   255
  125.          Left            =   4440
  126.          TabIndex        =   10
  127.          Top             =   720
  128.          Width           =   255
  129.       End
  130.       Begin Label Label2 
  131.          BackColor       =   &H00C0C0C0&
  132.          Caption         =   "Cursor &Sensitivity:"
  133.          Height          =   225
  134.          Left            =   120
  135.          TabIndex        =   8
  136.          Top             =   720
  137.          Width           =   1605
  138.       End
  139.       Begin Label Label6 
  140.          BackColor       =   &H00C0C0C0&
  141.          Caption         =   "(Max = 15)"
  142.          Height          =   255
  143.          Left            =   2640
  144.          TabIndex        =   19
  145.          Top             =   360
  146.          Width           =   975
  147.       End
  148.       Begin Label Label5 
  149.          BackColor       =   &H00C0C0C0&
  150.          Caption         =   "Rows per &Fetch:"
  151.          Height          =   240
  152.          Left            =   120
  153.          TabIndex        =   6
  154.          Top             =   360
  155.          Width           =   1815
  156.       End
  157.    End
  158.    Begin Frame Frame1 
  159.       BackColor       =   &H00C0C0C0&
  160.       Caption         =   "Object"
  161.       Height          =   855
  162.       Left            =   120
  163.       TabIndex        =   0
  164.       Top             =   120
  165.       Width           =   7455
  166.       Begin ComboBox Table_List 
  167.          Height          =   300
  168.          Left            =   4800
  169.          TabIndex        =   4
  170.          Text            =   "Table_List"
  171.          Top             =   360
  172.          Width           =   2295
  173.       End
  174.       Begin ComboBox Database_List 
  175.          Height          =   300
  176.          Left            =   1320
  177.          TabIndex        =   2
  178.          Text            =   "Database_List"
  179.          Top             =   360
  180.          Width           =   2295
  181.       End
  182.       Begin Label Label4 
  183.          BackColor       =   &H00C0C0C0&
  184.          Caption         =   "&Table:"
  185.          Height          =   225
  186.          Left            =   3840
  187.          TabIndex        =   3
  188.          Top             =   360
  189.          Width           =   735
  190.       End
  191.       Begin Label Label1 
  192.          BackColor       =   &H00C0C0C0&
  193.          Caption         =   "&Database:"
  194.          Height          =   210
  195.          Left            =   120
  196.          TabIndex        =   1
  197.          Top             =   360
  198.          Width           =   1005
  199.       End
  200.    End
  201.    Begin Label COLUMN_LABEL 
  202.       BorderStyle     =   1  'Fixed Single
  203.       Caption         =   "Label8"
  204.       FontBold        =   -1  'True
  205.       FontItalic      =   0   'False
  206.       FontName        =   "Courier"
  207.       FontSize        =   9.75
  208.       FontStrikethru  =   0   'False
  209.       FontUnderline   =   0   'False
  210.       Height          =   255
  211.       Left            =   120
  212.       TabIndex        =   21
  213.       Top             =   3000
  214.       Width           =   7215
  215.    End
  216.    Begin Label Label7 
  217.       BackColor       =   &H00C0C0C0&
  218.       Caption         =   "&Results:"
  219.       Height          =   255
  220.       Left            =   120
  221.       TabIndex        =   17
  222.       Top             =   2760
  223.       Width           =   855
  224.    End
  225.    Begin Menu Menu_File 
  226.       Caption         =   "&Connect"
  227.       Begin Menu Logon_Selection 
  228.          Caption         =   "&Logon"
  229.       End
  230.       Begin Menu Log_Off_Selection 
  231.          Caption         =   "Log &Off"
  232.       End
  233.       Begin Menu Exit_Selection 
  234.          Caption         =   "&Exit"
  235.       End
  236.    End
  237.    Begin Menu Menu_Help 
  238.       Caption         =   "&Help"
  239.       Begin Menu About_Selection 
  240.          Caption         =   "&About..."
  241.       End
  242.    End
  243. End
  244.  
  245.  
  246. Sub About_Selection_Click ()
  247.     About_Form.Show 1
  248. End Sub
  249.  
  250. Sub BeginTran ()
  251.     Results% = ExecuteSQLCommand("begin tran")
  252.     Do While SqlResults(SqlConn%) <> NOMORERESULTS
  253.     Do While SqlNextRow(SqlConn%) <> NOMOREROWS
  254.     Loop
  255.     Loop
  256.     OpenTran% = True
  257. End Sub
  258.  
  259. Sub CC_List_Click ()
  260.     If Sensitivity_List.ListIndex = -1 Or Table_List.ListIndex = -1 Then
  261.     Open_Button.Enabled = False
  262.     Else
  263.     Open_Button.Enabled = True
  264.     End If
  265.  
  266. End Sub
  267.  
  268. Sub ClearCursorBuffer ()
  269.  
  270. Do While Cursor_Buffer.ListCount
  271.     Cursor_Buffer.RemoveItem 0
  272. Loop
  273.  
  274. End Sub
  275.  
  276. Sub ClearDatabaseList ()
  277.     
  278. Rem Clear all databases out of list box
  279.  
  280.     Do While Database_List.ListCount
  281.     Database_List.RemoveItem 0
  282.     Loop
  283.     Database_List.Text = ""
  284. End Sub
  285.  
  286.  Sub ClearOutputBuffer ()
  287.  
  288.  For i% = 0 To 19
  289.     OutputData(i%) = ""
  290.  Next i%
  291.  
  292. End Sub
  293.  
  294. Sub ClearTableList ()
  295.  
  296.     Rem Clear all tables out of list box
  297.     Do While Table_List.ListCount
  298.     Table_List.RemoveItem 0
  299.     Loop
  300.     Table_List.Text = ""
  301.  
  302. End Sub
  303.  
  304. Sub Close_Button_Click ()
  305.     If OpenTran% Then
  306.     CommitTran
  307.     End If
  308.  
  309.     SqlCursorClose CursorHandle%
  310.  
  311.     Open_Button.Enabled = True
  312.     Close_Button.Enabled = False
  313.     Update_Button.Enabled = False
  314.     Fetch_Size.Enabled = True
  315.     Sensitivity_List.Enabled = True
  316.     CC_List.Enabled = True
  317.     IntN_value.Enabled = True
  318.     
  319.     COLUMN_LABEL.Caption = ""
  320.     ClearCursorBuffer
  321.  
  322. End Sub
  323.  
  324. Sub CommitTran ()
  325.     Results% = ExecuteSQLCommand("commit tran")
  326.     Do While SqlResults(SqlConn%) <> NOMORERESULTS
  327.     Do While SqlNextRow(SqlConn%) <> NOMOREROWS
  328.     Loop
  329.     Loop
  330. OpenTran% = False
  331. End Sub
  332.  
  333. Sub Database_List_Click ()
  334.  
  335. Rem
  336. Rem This routine will use the selected database, get all the user
  337. Rem tables in the database, and change the primary window title
  338. Rem to reflect the database change.
  339. Rem
  340.  
  341.     DatabaseSelection$ = Database_List.Text
  342.     Results% = SqlUse(SqlConn%, DatabaseSelection$)
  343.     If Results% = SUCCEED Then
  344.     PrimaryWindow.MousePointer = 11
  345.     RetrieveTableNames
  346.     PrimaryWindow.MousePointer = 0
  347.     DatabaseName = SqlName$(SqlConn%)
  348.     ChangePrimaryWindowCaption
  349.     If Table_List.ListIndex = -1 Or Sensitivity_List.ListIndex = -1 Or CC_List.ListIndex = -1 Then
  350.         Open_Button.Enabled = False
  351.     Else
  352.         Open_Button.Enabled = True
  353.     End If
  354.     End If
  355.  
  356.  
  357.  
  358. End Sub
  359.  
  360. Sub Exit_Selection_Click ()
  361.  
  362.     ExitApplication
  363.     End
  364.  
  365. End Sub
  366.  
  367. Sub Fetch_First ()
  368.  
  369.     ClearCursorBuffer
  370.     If Not OpenTran% Then
  371.     BeginTran
  372.     Else
  373.     CommitTran
  374.     BeginTran
  375.     End If
  376.  
  377.     Results% = SqlCursorFetch%(CursorHandle%, FETCHFIRST, 0)
  378.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  379.     ProcessCursorRows
  380.     Update_Button.Enabled = True
  381.     FillCursorBuffer -1        'display the data
  382.     Else
  383.     MsgBox "Problem fetching cursor.", 0, "Cursor Example"
  384.     End If
  385. End Sub
  386.  
  387. Sub Fetch_Last ()
  388.     If Not OpenTran% Then
  389.     BeginTran
  390.     Else
  391.     CommitTran
  392.     BeginTran
  393.     End If
  394.     
  395.     Results% = SqlCursorFetch%(CursorHandle%, FETCHLAST, 0)
  396.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  397.     ProcessCursorRows
  398.     Update_Button.Enabled = True
  399.     FillCursorBuffer -1        'display the data
  400.     Else
  401.     MsgBox "Problem fetching cursor.", 0, "Cursor Example"
  402.     End If
  403. End Sub
  404.  
  405. Sub Fetch_Next ()
  406.  
  407. Rem
  408. Rem This routine will get this next batch of rows
  409. Rem
  410.  
  411.     If Not OpenTran% Then
  412.     BeginTran
  413.     Else
  414.     CommitTran
  415.     BeginTran
  416.     End If
  417.  
  418.     Results% = SqlCursorFetch%(CursorHandle%, FETCHNEXT, 0)
  419.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  420.     ProcessCursorRows
  421.     Update_Button.Enabled = True
  422.     FillCursorBuffer -1        'display the data
  423.     Else
  424.     MsgBox "Problem fetching cursor. You are more than likely at the end of the result set", 0, "Cursor Example"
  425.     End If
  426. End Sub
  427.  
  428. Sub Fetch_Previous ()
  429.  
  430. Rem
  431. Rem This routine will get the previous batch of rows
  432. Rem
  433.  
  434.     If Not OpenTran% Then
  435.     BeginTran
  436.     Else
  437.     CommitTran
  438.     BeginTran
  439.     End If
  440.  
  441.     Results% = SqlCursorFetch%(CursorHandle%, FETCHPREV, 0)
  442.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  443.     ProcessCursorRows
  444.     Update_Button.Enabled = True
  445.     FillCursorBuffer -1        'display the data
  446.     Else
  447.     MsgBox "Problem fetching cursor.", 0, "Cursor Example"
  448.     End If
  449. End Sub
  450.  
  451. Sub Fetch_Random (Rownum As Integer)
  452.  
  453. Rem
  454. Rem This routine will get a row number to start fetching from
  455. Rem
  456.  
  457.     If Not OpenTran% Then
  458.     BeginTran
  459.     Else
  460.     CommitTran
  461.     BeginTran
  462.     End If
  463.  
  464.     Results% = SqlCursorFetch%(CursorHandle%, FETCHRANDOM, Rownum%)
  465.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  466.     ProcessCursorRows
  467.     Update_Button.Enabled = True
  468.     FillCursorBuffer -1        'display the data
  469.     Else
  470.     MsgBox "Problem fetching cursor.", 0, "Cursor Example"
  471.     End If
  472. End Sub
  473.  
  474. Sub Fetch_Relative (ScrollValue As Integer)
  475.  
  476. Rem
  477. Rem This routine will get a batch relative to the selected row
  478. Rem First Calculate where to start the fetch
  479. Rem
  480.  
  481.     MaxRows% = Vscroll1.Max
  482.     n = (ScrollValue * MaxRows%) / 100
  483.     Rownum% = n - CursorSliderValue%
  484.  
  485. Rem
  486. Rem Fetch the rows
  487. Rem
  488.  
  489.     If Not OpenTran% Then
  490.     BeginTran
  491.     Else
  492.     CommitTran
  493.     BeginTran
  494.     End If
  495.  
  496.     Results% = SqlCursorFetch%(CursorHandle%, FETCHRELATIVE, Rownum%)
  497.     If Results% = SUCCEED And Int(RowStatus&(0)) <> FTCENDOFRESULTS% Then
  498.     ProcessCursorRows
  499.     Update_Button.Enabled = True
  500.     FillCursorBuffer -1        'display the data
  501.     Else
  502.     MsgBox "Problem fetching cursor.", 0, "Cursor Example"
  503.     End If
  504. End Sub
  505.  
  506. Sub Fetch_size_LostFocus ()
  507.  
  508. Rem
  509. Rem Make sure the fetch size fits in the results list box to avoid scrolling
  510. Rem
  511.  
  512.     Num% = Val(Fetch_Size.Text) * Val(IntN_value.Text)
  513.  
  514.     If Val(Fetch_Size.Text) < 1 Or Val(Fetch_Size.Text) > 15 Then
  515.     MsgBox "Value must be between 1 and 15", 0, "Cursor Example"
  516.     Fetch_Size.SetFocus
  517.     End If
  518.  
  519.  
  520. End Sub
  521.  
  522. Sub FillCursorBuffer (x As Integer)
  523.  
  524. Rem
  525. Rem If x% >= 0, then we are doing a horizontal scroll
  526. Rem Clear the list box
  527. Rem Fill the list box with the shifted data
  528. Rem
  529.  
  530.     If x% >= 0 Then
  531.  
  532.     ClearCursorBuffer
  533.     startshift% = x%
  534.     
  535.     rowlen& = Len(OutputData(0))
  536.     i% = 0
  537.     While OutputData(i%) <> ""
  538.     If i% <= 2 Then
  539.     If x% = 0 Then startshift% = 1
  540.     Cursor_Buffer.AddItem Mid$(OutputData(i%), startshift%, rowlen&)
  541.     Else
  542.     If x% = 0 Then startshift% = 2
  543.     Cursor_Buffer.AddItem Mid$(OutputData(i%), startshift% - 1, rowlen&)
  544.     End If
  545.     i% = i% + 1
  546.     Wend
  547.  
  548. Rem
  549. Rem First fill the buffer with the headings
  550. Rem Then fill in the data
  551. Rem
  552.  
  553.     Else
  554.     i% = 0
  555.     While OutputData(i%) <> ""
  556.         Cursor_Buffer.AddItem OutputData(i%)
  557.         i% = i% + 1
  558.     Wend
  559.  
  560.     End If
  561. End Sub
  562.  
  563. Sub Form_Load ()
  564.  
  565. Rem
  566. Rem Initialize the application
  567. Rem
  568.  
  569.     PrimaryWindowTitle = "Cursor Example"
  570.     ChangePrimaryWindowCaption
  571.  
  572.     InitializeApplication
  573.     MsgBox DBLIB_VERSION$, 0, "Cursor Example"
  574.  
  575. Rem
  576. Rem Set the initial state of each of the controls in the form
  577. Rem
  578.  
  579.     Sensitivity_List.AddItem "Static"
  580.     Sensitivity_List.AddItem "Keyset driven"
  581.     Sensitivity_List.AddItem "Dynamic"
  582.     Sensitivity_List.AddItem "Int N"
  583.  
  584.     CC_List.AddItem "Read only"
  585.     CC_List.AddItem "Locking control"
  586.     CC_List.AddItem "Optimistic concurrency"
  587.     CC_List.AddItem "Optimistic concurrency by values"
  588.  
  589.     Logon_Selection.Enabled = True
  590.     Log_Off_Selection.Enabled = False
  591.     Exit_Selection.Enabled = True
  592.  
  593.     Open_Button.Enabled = False
  594.     Close_Button.Enabled = False
  595.     Update_Button.Enabled = False
  596.  
  597.     OpenTran% = False
  598.     COLUMN_LABEL.Caption = ""
  599.     ClearCursorBuffer
  600.     ClearDatabaseList
  601.     ClearTableList
  602.     IntN_value.Text = "0"
  603. End Sub
  604.  
  605. Sub Log_Off_Selection_Click ()
  606.  
  607. Rem
  608. Rem Set the state of the controls
  609. Rem Logoff
  610. Rem
  611.  
  612.     ClearDatabaseList
  613.     ClearTableList
  614.     Open_Button.Enabled = False
  615.     Close_Button.Enabled = False
  616.     Update_Button.Enabled = False
  617.     
  618.     Logoff
  619.  
  620.     Logon_Selection.Enabled = True
  621.     Log_Off_Selection.Enabled = False
  622.     Exit_Selection.Enabled = True
  623.  
  624. End Sub
  625.  
  626. Sub Logon_Selection_Click ()
  627.  
  628. Rem
  629. Rem Logon to the server
  630. Rem Get the databases in the server and display them in the list box
  631. Rem Change the primary window caption to reflect current status
  632. Rem
  633.  
  634.     Login.Show 1
  635.     PrimaryWindow.MousePointer = 11
  636.     If CheckServerConnection() = 1 Then
  637.     Results% = GetDatabases(Database_List)
  638.     ChangePrimaryWindowCaption
  639.     Logon_Selection.Enabled = False
  640.     Log_Off_Selection.Enabled = True
  641.     End If
  642.     PrimaryWindow.MousePointer = 0
  643.  
  644. End Sub
  645.  
  646. Sub Open_Button_Click ()
  647.  
  648. Rem
  649. Rem Get the fetch size and keyset size
  650. Rem Redimension the rowstatus array
  651. Rem
  652.  
  653.     NumRowsInCursor% = Val(Fetch_Size.Text)
  654.     IntN% = Val(IntN_value.Text)
  655.     ReDim RowStatus&(NumRowsInCursor%)
  656.  
  657. Rem
  658. Rem Set the scroll option and concurrency control values
  659. Rem
  660.  
  661.     Select Case Sensitivity_List.Text
  662.     Case "Static"
  663.     ScrollOpt% = CURFORWARD%
  664.     Case "Keyset driven"
  665.         ScrollOpt% = CURKEYSET%
  666.     Case "Dynamic"
  667.     ScrollOpt% = CURDYNAMIC%
  668.     Case "Int N"
  669.     If IntN% <= 0 Then
  670.         MsgBox "You must Supply N", 0, "Cursor Example"
  671.         Exit Sub
  672.     Else
  673.         ScrollOpt% = IntN%
  674.     End If
  675.     End Select
  676.  
  677.     Select Case CC_List.Text
  678.     Case "Read only"
  679.     Concuropt% = CURREADONLY%
  680.     Case "Locking control"
  681.     Concuropt% = CURLOCKCC%
  682.     Case "Optimistic concurrency"
  683.     Concuropt% = CUROPTCC%
  684.     Case "Optimistic concurrency by values"
  685.     Concuropt% = CUROPTCCVAL%
  686.     End Select
  687.  
  688. Rem
  689. Rem Setup the select statement and open the cursor
  690. Rem
  691.  
  692.     Statement$ = "select * from " + Table_List.Text
  693.  
  694.     CursorHandle% = SqlCursorOpen(SqlConn%, Statement$, ScrollOpt%, Concuropt%, NumRowsInCursor%, RowStatus&(0))
  695.  
  696.     If CursorHandle% <> FAIL Then
  697.     Open_Button.Enabled = False
  698.     Close_Button.Enabled = True
  699.     
  700. Rem
  701. Rem Get Column names and lengths
  702. Rem Output the column header
  703. Rem
  704.    
  705.     Results% = SqlCursorInfo%(CursorHandle%, NumCols%, NumRowsInKeyset&)
  706.     For ColCount% = 1 To NumCols%
  707.         Results% = SqlCursorColInfo%(CursorHandle%, ColCount%, colname$, Coltype%, ColLen&, UserType%)
  708.         CursorColName$(ColCount%) = colname$
  709.         CursorColLen&(ColCount%) = ColLen&
  710.     Next ColCount%
  711.     ClearOutputBuffer
  712.     ProcessCursorHeader
  713.     IntN_value.Enabled = False
  714.     Sensitivity_List.Enabled = False
  715.     CC_List.Enabled = False
  716.  
  717. Rem
  718. Rem Set the vertical scroll bar to <page up> and <page down> the size of the fetch
  719. Rem Determine the max value of VScroll1
  720. Rem     If we are dealing with a mixed scroll, then set to number (ScrollOpt% * IntN%) * an arbitrary number
  721. Rem         NOTE: You choose an arbitrary number because you want to be able to go outside of keyset.
  722. Rem     If Dealing with keyset or static scroll and we have enough room to store the whole keyset,
  723. Rem         then set max to full keyset size.
  724. Rem     Otherwise, we're dealing with Dynamic scroll or we can't fit the who keyset.
  725. Rem         Make a guess as to how big the keyset is by multiplying the "asked for"
  726. Rem         fetch size by some arbitrary number (we chose 10).
  727. Rem Fetch the first batch of rows
  728. Rem
  729.  
  730.     Vscroll1.SmallChange = NumRowsInCursor%
  731.     Vscroll1.LargeChange = Vscroll1.SmallChange
  732.     Vscroll1.Value = 0
  733.     Vscroll1.Refresh        'Refresh the vertical scrollbar
  734.     CursorSliderValue = 0
  735.  
  736.     If IntN% <> 0 Then
  737.         Vscroll1.Max = (ScrollOpt% * IntN%) * 10
  738.     Else
  739.         If NumRowsInKeyset& > 0 Then
  740.         Vscroll1.Max = NumRowsInKeyset&
  741.         Else
  742.         Vscroll1.Max = NumRowsInCursor% * 10       'Note: the number 10 is an arbitrary number
  743.         End If
  744.     End If
  745.     Fetch_First
  746.     Else
  747.     MsgBox "Cursor failed to open.", 0, "Cursor Example"
  748.     End If
  749.  
  750. End Sub
  751.  
  752. Function PrepareString (String_In As String) As String
  753.  
  754.     String_Out$ = ""
  755.  
  756.     For i% = 1 To Len(String_In)
  757.     If Mid$(String_In, i%, 1) = Chr$(39) Then
  758.     String_Out$ = String_Out$ + Chr$(39) + Chr$(39)
  759.     Else
  760.     String_Out$ = String_Out$ + Mid$(String_In, i%, 1)
  761.     End If
  762.     Next
  763.  
  764.     PrepareString = String_Out$
  765.  
  766. End Function
  767.  
  768. Sub ProcessCursorHeader ()
  769.     
  770. Rem
  771. Rem This routine gets and formats the cursor header
  772. Rem
  773.  
  774.     TABKEY$ = "    "
  775.     NEWLINE$ = Chr$(13) + Chr$(10)
  776.     colline$ = ""
  777.  
  778.     For ColCount% = 1 To NumCols%
  779.     tmplen% = CursorColLen&(ColCount%)
  780.     If tmplen% > 256 Then tmplen% = 256
  781.     colname$ = CursorColName$(ColCount%)
  782.     actuallen& = Len(colname$)
  783.     If actuallen& < tmplen% Then
  784.     If ColCount% <> NumCols% Then
  785.         colline$ = colline$ + colname$ + Space$((tmplen% - actuallen&) + 1) + TABKEY$
  786.     Else
  787.         colline$ = colline$ + colname$ + Space$((tmplen% - actuallen&) + 1)
  788.     End If
  789.     Else
  790.     If ColCount% <> NumCols% Then
  791.         colline$ = colline$ + colname$ + TABKEY$
  792.     Else
  793.         colline$ = colline$ + colname$
  794.     End If
  795.  
  796.     End If
  797.     Next ColCount%
  798.  
  799. Rem
  800. Rem Set the COLUMN_LABEL label
  801. Rem
  802.  
  803.     COLUMN_LABEL.Caption = colline$
  804. End Sub
  805.  
  806. Sub ProcessCursorRows ()
  807.  
  808. Rem
  809. Rem This routine gets each of the cursor rows and displays them
  810. Rem
  811.  
  812.     TABKEY$ = Chr$(9)
  813.     colline$ = ""
  814.     ClearCursorBuffer
  815.     ClearOutputBuffer
  816.  
  817. Rem    HScroll1.Refresh     'Refresh the horizontal scroll bar
  818.  
  819. Rem
  820. Rem Set the end of results and keyset values
  821. Rem
  822.  
  823.     ENDRESULTS% = FTCENDOFRESULTS% + 1
  824.     ENDKEYSET% = FTCENDOFRESULTS% + FTCENDOFKEYSET% + 1
  825.  
  826. Rem
  827. Rem Get the cursor data based on the row and column
  828. Rem
  829.  
  830.     For RowCount% = 1 To NumRowsInCursor%
  831.     For ColCount% = 1 To NumCols%
  832.         ColValue$ = SqlCursorData(CursorHandle%, RowCount%, ColCount%)
  833.         actuallen& = Len(ColValue$)
  834.         tmplen% = CursorColLen(ColCount%)
  835.         If tmplen% > 256 Then tmplen% = 256
  836.         If actuallen& < tmplen% Then
  837.         If ColCount% <> NumCols% Then
  838.             DataStr$ = DataStr$ + ColValue$ + Space$((tmplen% - actuallen&) + 1) + TABKEY$
  839.         Else
  840.             DataStr$ = DataStr$ + ColValue$ + Space$((tmplen% - actuallen&) + 1)
  841.         End If
  842.         Else
  843.         If ColCount% <> NumCols% Then
  844.             DataStr$ = DataStr$ + ColValue$ + TABKEY$
  845.         Else
  846.             DataStr$ = DataStr$ + ColValue$
  847.         End If
  848.         End If
  849.         ColValue$ = ""
  850.     Next ColCount%
  851.     OutputData(RowCount% - 1) = DataStr$
  852.     DataStr$ = ""
  853.     testval% = Int(RowStatus&(RowCount% - 1))
  854.     If testval% = ENDRESULTS% Or testval% = ENDKEYSET% Or testval% = FTCENDOFRESULTS% Then
  855.         Exit For
  856.     End If
  857.     Next RowCount%
  858.  
  859. End Sub
  860.  
  861. Sub RetrieveTableNames ()
  862.  
  863. Rem
  864. Rem Retrieve table names from SQL Server into list box
  865. Rem
  866.  
  867.     ClearTableList
  868.     Results% = ExecuteSQLCommand("Select name from sysobjects where type = 'U'")
  869.     Do While (SqlResults%(SqlConn%) <> NOMORERESULTS)
  870.     Do While (SqlNextRow(SqlConn%) <> NOMOREROWS)
  871.         Table_List.AddItem SqlData(SqlConn%, 1)
  872.     Loop
  873.     Loop
  874.     Table_List.Text = Table_List.List(0)
  875. End Sub
  876.  
  877. Sub Sensitivity_List_Click ()
  878.  
  879. Rem
  880. Rem Make sure the required data is supplied before enabling the open button
  881. Rem
  882.  
  883.     If Table_List.ListIndex = -1 Or CC_List.ListIndex = -1 Then
  884.     Open_Button.Enabled = False
  885.     Else
  886.     Open_Button.Enabled = True
  887.     End If
  888.  
  889. End Sub
  890.  
  891. Sub Table_List_Click ()
  892.  
  893. Rem
  894. Rem Make sure the required data is supplied before enabling the open button
  895. Rem
  896.     
  897.     If Sensitivity_List.ListIndex = -1 Or CC_List.ListIndex = -1 Then
  898.     Open_Button.Enabled = False
  899.     Else
  900.     Open_Button.Enabled = True
  901.     End If
  902.  
  903. End Sub
  904.  
  905. Sub Update_Button_Click ()
  906.  
  907. Rem
  908. Rem Get the selected row number
  909. Rem
  910.  
  911.     Rownum% = Cursor_Buffer.ListIndex + 1
  912.     
  913.     If Rownum% = 0 Then
  914.     Beep
  915.     MsgBox "Select a row to update.", 0, "Cursor Example"
  916.     Exit Sub
  917.     End If
  918.     
  919. Rem
  920. Rem Get column # to update and new value
  921. Rem
  922.  
  923.     ColNum$ = InputBox$("Number of column to update:", "Update")
  924.     If ColNum$ = "" Then Exit Sub
  925.  
  926.     Value$ = InputBox$("Update column " + ColNum$ + " with value: ", "Update")
  927.     If Value$ = "" Then Exit Sub
  928.  
  929.     Table$ = Table_List.Text
  930.  
  931. Rem
  932. Rem Determine name of column to update
  933. Rem Create the update string
  934. Rem
  935.  
  936.     Results% = SqlCursorColInfo(CursorHandle%, Val(ColNum$), colname$, Coltype%, ColLen&, UserType%)
  937.  
  938.     UpdateValue$ = "set " + colname$ + "="
  939.     If Coltype% = SQLCHAR Or Coltype% = SQLVARCHAR Then
  940.        UpdateValue$ = UpdateValue$ + "'" + Value$ + "'"
  941.     Else
  942.     UpdateValue$ = UpdateValue$ + Value$
  943.     End If
  944.  
  945. Rem
  946. Rem Perform update
  947. Rem
  948.  
  949.     Results% = SqlCursor(CursorHandle%, CRSUPDATE, Rownum%, Table$, UpdateValue$)
  950.  
  951. End Sub
  952.  
  953. Sub VBSQL1_Error (SqlConn As Integer, Severity As Integer, ErrorNum As Integer, ErrorStr As String, RetCode As Integer)
  954. ' Call the required VBSQL error-handling function
  955. ' OSErr and OSErrStr not used in VBSQL for Windows, but DOS interprets
  956. ' anything other than -1 as an OS error
  957.     OsErr% = -1
  958.  
  959.     RetCode% = UserSqlErrorHandler%(SqlConn, Severity%, ErrorNum%, OsErr%, ErrorStr$, OsErrStr$)
  960. End Sub
  961.  
  962. Sub VBSQL1_Message (SqlConn As Integer, Message As Long, State As Integer, Severity As Integer, MsgStr As String)
  963.     UserSqlMsgHandler SqlConn, Message&, State%, Severity%, MsgStr$
  964. End Sub
  965.  
  966. Sub VScroll1_Change ()
  967.  
  968. If Vscroll1.Value = 0 And CursorSliderValue% = 0 Then Exit Sub
  969.  
  970. Rem
  971. Rem Define <Page Up> and <Page Down> values
  972. Rem Get the current scroll value
  973. Rem
  974.  
  975. PAGEUP = CursorSliderValue% - Vscroll1.SmallChange
  976. PAGEDOWN = CursorSliderValue% + Vscroll1.SmallChange
  977.  
  978. x = Vscroll1.Value
  979.  
  980. Rem
  981. Rem Based on the scroll value, call the appropriate routine
  982. Rem If "Mixed" scroll and scrolling within the keyset, then just do a random
  983. Rem
  984.  
  985. If x > CursorSliderValue% And x < PAGEDOWN Then
  986.     If x > Vscroll1.SmallChange Then
  987.     Fetch_Random (x)
  988.     Else
  989.     Fetch_Relative (x)
  990.     End If
  991. Else
  992.     If x < CursorSliderValue% And x > PAGEUP Then
  993.     If x > Vscroll1.SmallChange Then
  994.         Fetch_Random (x)
  995.     Else
  996.         Fetch_Relative (x)
  997.     End If
  998.     Else
  999.  
  1000. Rem
  1001. Rem User is either doing a <Page Down>, <Page Up>, or Dynamic scrolling
  1002. Rem
  1003.  
  1004.     Select Case x
  1005.         Case Is = PAGEDOWN
  1006.         Fetch_Next
  1007.         Case Is = PAGEUP
  1008.         Fetch_Previous
  1009.         Case Is > PAGEDOWN
  1010.         If ScrollOpt% = CURKEYSET% Then
  1011.             Fetch_Random Int(x)
  1012.         Else
  1013.             Fetch_Relative Int(x)
  1014.         End If
  1015.         Case Is < PAGEUP
  1016.         If ScrollOpt% = CURKEYSET% Then
  1017.             Fetch_Random Int(x)
  1018.         Else
  1019.             Fetch_Relative Int(x)
  1020.         End If
  1021.     End Select
  1022.     End If
  1023. End If
  1024.  
  1025. Rem
  1026. Rem Save the current scroll value for next time.
  1027. Rem
  1028.  
  1029. CursorSliderValue = x
  1030.  
  1031.  
  1032. End Sub
  1033.  
  1034.