RPC.FRM
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. VERSION 2.00
  2. Begin Form PrimaryWindow 
  3.    Caption         =   "Remote Stored Procedure"
  4.    Height          =   6765
  5.    Icon            =   0
  6.    Left            =   150
  7.    LinkMode        =   1  'Source
  8.    LinkTopic       =   "Form1"
  9.    ScaleHeight     =   6075
  10.    ScaleWidth      =   9060
  11.    Top             =   390
  12.    Width           =   9180
  13.    Begin VBSQL VBSQL1 
  14.       Caption         =   "VBSQL1"
  15.       Height          =   255
  16.       Left            =   5280
  17.       Top             =   120
  18.       Visible         =   0   'False
  19.       Width           =   855
  20.    End
  21.    Begin TextBox RESULT_FIELD 
  22.       FontBold        =   -1  'True
  23.       FontItalic      =   0   'False
  24.       FontName        =   "Courier"
  25.       FontSize        =   9.75
  26.       FontStrikethru  =   0   'False
  27.       FontUnderline   =   0   'False
  28.       Height          =   2430
  29.       Left            =   120
  30.       MultiLine       =   -1  'True
  31.       ScrollBars      =   3  'Both
  32.       TabIndex        =   3
  33.       Text            =   "Text1"
  34.       Top             =   3600
  35.       Width           =   8460
  36.    End
  37.    Begin Frame Frame2 
  38.       Caption         =   "Procedure Sampler"
  39.       Height          =   1575
  40.       Left            =   120
  41.       TabIndex        =   11
  42.       Top             =   1680
  43.       Width           =   8895
  44.       Begin TextBox PARAMVALUE_FIELD 
  45.          Height          =   285
  46.          Left            =   1800
  47.          TabIndex        =   15
  48.          Text            =   "Text1"
  49.          Top             =   1080
  50.          Width           =   6975
  51.       End
  52.       Begin TextBox PARAMNAME_FIELD 
  53.          Height          =   285
  54.          Left            =   1800
  55.          TabIndex        =   16
  56.          Text            =   "Text2"
  57.          Top             =   720
  58.          Width           =   6975
  59.       End
  60.       Begin ComboBox PROCNAME_COMBO 
  61.          Height          =   300
  62.          Left            =   1800
  63.          TabIndex        =   17
  64.          Top             =   360
  65.          Width           =   2895
  66.       End
  67.       Begin Label Label7 
  68.          Caption         =   "Parameter &Values:"
  69.          Height          =   255
  70.          Left            =   120
  71.          TabIndex        =   14
  72.          Top             =   1080
  73.          Width           =   1815
  74.       End
  75.       Begin Label Label6 
  76.          Caption         =   "Para&meter Names:"
  77.          Height          =   255
  78.          Left            =   120
  79.          TabIndex        =   13
  80.          Top             =   720
  81.          Width           =   1815
  82.       End
  83.       Begin Label Label3 
  84.          Caption         =   "&Procedure Name:"
  85.          Height          =   255
  86.          Left            =   120
  87.          TabIndex        =   12
  88.          Top             =   360
  89.          Width           =   1575
  90.       End
  91.    End
  92.    Begin CommandButton SEND_QUERY_BUTTON 
  93.       Caption         =   "E&xecute Proc"
  94.       Enabled         =   0   'False
  95.       Height          =   375
  96.       Left            =   6360
  97.       TabIndex        =   1
  98.       Top             =   720
  99.       Width           =   1575
  100.    End
  101.    Begin CommandButton MAKE_PROC_BUTTON 
  102.       Caption         =   "&Make Test Proc"
  103.       Enabled         =   0   'False
  104.       Height          =   375
  105.       Left            =   6360
  106.       TabIndex        =   0
  107.       Top             =   240
  108.       Width           =   1575
  109.    End
  110.    Begin Frame Frame1 
  111.       Caption         =   "Procedure qualifiers (optional)"
  112.       Height          =   1455
  113.       Left            =   120
  114.       TabIndex        =   4
  115.       Top             =   120
  116.       Width           =   5055
  117.       Begin TextBox OWNER_FIELD 
  118.          Height          =   285
  119.          Left            =   2040
  120.          TabIndex        =   10
  121.          Text            =   "Text3"
  122.          Top             =   1080
  123.          Width           =   2535
  124.       End
  125.       Begin TextBox DBNAME_FIELD 
  126.          Height          =   285
  127.          Left            =   2040
  128.          TabIndex        =   8
  129.          Text            =   "Text2"
  130.          Top             =   720
  131.          Width           =   2535
  132.       End
  133.       Begin ComboBox SERVER_COMBO 
  134.          Height          =   300
  135.          Left            =   2040
  136.          TabIndex        =   6
  137.          Top             =   360
  138.          Width           =   2535
  139.       End
  140.       Begin Label Label5 
  141.          Caption         =   "&Owner:"
  142.          Height          =   255
  143.          Left            =   120
  144.          TabIndex        =   9
  145.          Top             =   1080
  146.          Width           =   735
  147.       End
  148.       Begin Label Label4 
  149.          Caption         =   "&Database Name:"
  150.          Height          =   255
  151.          Left            =   120
  152.          TabIndex        =   7
  153.          Top             =   720
  154.          Width           =   1455
  155.       End
  156.       Begin Label Label1 
  157.          Caption         =   "Remote &Server:"
  158.          Height          =   255
  159.          Left            =   120
  160.          TabIndex        =   5
  161.          Top             =   360
  162.          Width           =   1455
  163.       End
  164.    End
  165.    Begin Label Label2 
  166.       Caption         =   "&Results:"
  167.       Height          =   255
  168.       Left            =   120
  169.       TabIndex        =   2
  170.       Top             =   3360
  171.       Width           =   735
  172.    End
  173.    Begin Menu CONNECT_MENU 
  174.       Caption         =   "&Connection"
  175.       Begin Menu LOGIN_MENU 
  176.          Caption         =   "&Login"
  177.       End
  178.       Begin Menu DATABASE_MENU 
  179.          Caption         =   "Change &Database"
  180.       End
  181.       Begin Menu EXIT_MENU 
  182.          Caption         =   "E&xit"
  183.       End
  184.    End
  185. End
  186. Sub ClearFields ()
  187.     RESULT_FIELD.Text = ""
  188.     DBNAME_FIELD.Text = ""
  189.     OWNER_FIELD.Text = ""
  190.     PARAMNAME_FIELD.Text = ""
  191.     PARAMVALUE_FIELD.Text = ""
  192. End Sub
  193. Sub DATABASE_MENU_Click ()
  194.     If SqlConn% = 0 Then
  195.         MsgBox "Must login first"
  196.         Exit Sub
  197.     End If
  198.     CHNGDB.Show 1
  199. End Sub
  200. Sub EXIT_MENU_Click ()
  201.     ExitApplication
  202. End Sub
  203. Sub Form_Load ()
  204. Rem
  205. Rem Initialize the connection to SQL Server
  206. Rem
  207.     InitializeApplication
  208.     MsgBox DBLIB_VERSION$
  209.     PrimaryWindowTitle = "VBSQL RPC demonstration"
  210. Rem
  211. Rem Call routine to clear the fields
  212. Rem Fill in the procedure names combobox
  213. Rem
  214.     ClearFields
  215.     PROCNAME_COMBO.AddItem "sp_help"
  216.     PROCNAME_COMBO.AddItem "sp_who"
  217.     PROCNAME_COMBO.AddItem "echo_test"
  218. End Sub
  219. Function GetServers (Server_Control As Control) As Integer
  220. Rem
  221. Rem This routine gets the name of all the remote servers
  222. Rem Fill each element in the combobox or list box which is passed into this procedure
  223. Rem execute the command.  Get each server name and fill the combobox.
  224. Rem
  225.     If ExecuteSQLCommand("Select srvname from master..sysservers where srvid != 0") = FAIL% Then
  226.         GetServers = FAIL
  227.         Exit Function
  228.     Else
  229.         If SqlResults(SqlConn%) = FAIL% Then Exit Function
  230.         While SqlNextRow(SqlConn%) <> NOMOREROWS%
  231.             Server_Control.AddItem SqlData(SqlConn%, 1)
  232.         Wend
  233.     End If
  234.     GetServers = SUCCEED
  235. End Function
  236. Sub LOGIN_MENU_Click ()
  237.     
  238.     Login.Show 1
  239.     If SqlConn% <> 0 Then
  240.         SEND_QUERY_BUTTON.Enabled = True
  241.         MAKE_PROC_BUTTON.Enabled = True
  242.         Results% = GetServers(SERVER_COMBO)
  243.     End If
  244. End Sub
  245. Sub MAKE_PROC_BUTTON_Click ()
  246. Static OutputData(0) As String
  247. cmd$ = "CREATE PROCEDURE echo_test(@inparm1 varchar(20), @inparm2 int, "
  248. cmd$ = cmd$ + "@outparm varchar(20) = NULL OUTPUT) AS "
  249. cmd$ = cmd$ + "select @outparm = @inparm1 "
  250. cmd$ = cmd$ + "return @inparm2"
  251. Ret% = ExecuteSQLCommand(cmd$)
  252. If Ret% = SUCCEED% Then
  253.     MsgBox "Procedure echo_test created successfully"
  254.     ' get rid of an result rows
  255.     numrows& = Process_SQL_query("", OutputData())
  256. End If
  257. End Sub
  258. Sub Parse_params (ParamIn As String, Delimiter As String, ParamOut() As String) '
  259. Rem
  260. Rem This routine takes the comma delimited Parameter names/values
  261. Rem
  262. Start% = 1
  263. For i% = 0 To UBound(ParamOut)
  264.     If done% = False Then
  265.         'look for delimiter
  266.         endpos% = InStr(Start%, ParamIn$, Delimiter$)
  267.         If endpos% = 0 Then
  268.             'we're at the last parameter
  269.             ParamOut(i%) = Mid$(ParamIn$, Start%, 255)
  270.             done% = True
  271.         Else
  272.             ParamOut(i%) = Mid$(ParamIn$, Start%, (endpos% - Start%))
  273.             Start% = endpos% + 1
  274.         End If
  275.     Else
  276.         'clear out rest of array
  277.         ParamOut(i%) = ""
  278.     End If
  279. Next i%
  280. End Sub
  281. Sub PROCNAME_COMBO_Click ()
  282. Select Case PROCNAME_COMBO.Text
  283.     Case Is = "sp_help"
  284.         PARAMNAME_FIELD.Text = "@objname VARCHAR(30)"
  285.         PARAMVALUE_FIELD.Text = "sysobjects"
  286.     Case Is = "echo_test"
  287.         PARAMNAME_FIELD.Text = "@inparm1 VARCHAR(20),@inparm2 INTEGER,@outparm VARCHAR(20) OUT"
  288.         PARAMVALUE_FIELD.Text = "hello,7,notused"
  289.     Case Else
  290.         PARAMNAME_FIELD.Text = ""
  291.         PARAMVALUE_FIELD.Text = ""
  292. End Select
  293. End Sub
  294. Sub SEND_QUERY_BUTTON_Click ()
  295.     
  296. Static OutputData(500) As String
  297. CRLF$ = Chr$(13) + Chr$(10)
  298. Rem
  299. Rem Assemble the procedure name
  300. Rem Get the parameter names
  301. Rem Get the parameter values
  302. Rem Initialize the stored proc.
  303. Rem Fill the parameters
  304. Rem
  305.     
  306. Static Param_Values(10) As String
  307. Static Param_Declares(10) As String
  308. Static Param_Types(2) As String
  309. Static Param_Datatype(1) As String
  310. '  Note:  If this is a remote server-to-server procedure call (SERVER_NAME is
  311. '       not blank), and your remote password is different from your local
  312. '       password, you will need to set the remote password field with SqlRPwSet%
  313. '       prior to logging on.
  314. procname$ = SERVER_COMBO.Text + "." + DBNAME_FIELD.Text + "." + OWNER_FIELD.Text + "." + PROCNAME_COMBO.Text
  315. Results% = SqlRpcInit(SqlConn%, procname$, 0)
  316. If PARAMVALUE_FIELD.Text <> "" Then
  317.     In$ = PARAMVALUE_FIELD.Text
  318.     Parse_params In$, ",", Param_Values()
  319.     In$ = PARAMNAME_FIELD.Text
  320.     Parse_params In$, ",", Param_Declares()
  321.     For i% = 0 To 10
  322.         'check to see if we are at the end of the parameters provided
  323.         If Param_Values(i%) = "" Then Exit For
  324.         'for each parameter, find out its type
  325.         'first split type declaration into name, type(len), output
  326.         In$ = Param_Declares(i%)
  327.         Parse_params In$, " ", Param_Types()
  328.         'param name is first part
  329.         paramname$ = Param_Types(0)
  330.         'If this is an output var, set the flag
  331.         If Left$(Param_Types(2), 3) = "OUT" Then
  332.             status% = SQLRPCRETURN%
  333.         Else
  334.             status% = 0
  335.         End If
  336.         
  337.         'now take type(len) and split into type, len)
  338.         In$ = Param_Types(1)
  339.         Parse_params In$, "(", Param_Datatype()
  340.         
  341.         Select Case Param_Datatype(0)
  342.             Case "VARCHAR"
  343.                 typecode% = SQLVARCHAR%
  344.                 If status% = SQLRPCRETURN% Then
  345.                     maxlen& = Val(Left$(Param_Datatype(1), Len(Param_Datatype(1)) - 1))
  346.                 Else
  347.                     maxlen& = -1
  348.                 End If
  349.                 datalen& = Len(Param_Values(i%))
  350.             Case "INTEGER"
  351.                 typecode% = SQLINT4%
  352.                 maxlen& = -1
  353.                 datalen& = -1
  354.             Case Else
  355.                 MsgBox "Sample does not handle " + Param_Datatype(0) + " paramters"
  356.                 Exit Sub
  357.         End Select
  358.         Results% = SqlRpcParam(SqlConn%, paramname$, status%, typecode%, maxlen&, datalen&, Param_Values(i%))
  359.     Next i%
  360. End If
  361. Results% = SqlRpcSend(SqlConn%)
  362. Rem
  363. Rem Clear the result array, and result controls first
  364. Rem
  365. i% = 0
  366. For i% = 0 To 499
  367.     OutputData(i%) = ""
  368. Next
  369. Rem
  370. Rem Fill the result array with the data
  371. Rem Fill the results field
  372. Rem
  373. RESULT_FIELD.Text = ""
  374. numrows& = Process_SQL_query(cmd$, OutputData())
  375. For i% = 0 To numrows& - 1
  376.     DataLine$ = DataLine$ + OutputData(i%) + CRLF$
  377. Next i%
  378. RESULT_FIELD.Text = DataLine$
  379. End Sub
  380. Sub VBSQL1_Error (SqlConn As Integer, Severity As Integer, ErrorNum As Integer, ErrorStr As String, RetCode As Integer)
  381. ' Call the required VBSQL error-handling function
  382. ' OSErr and OSErrStr not used in VBSQL for Windows, but DOS interprets
  383. ' anything other than -1 as an OS error
  384.     OsErr% = -1
  385.     RetCode% = UserSqlErrorHandler%(SqlConn, Severity%, ErrorNum%, OsErr%, ErrorStr$, OsErrStr$)
  386. End Sub
  387. Sub VBSQL1_Message (SqlConn As Integer, Message As Long, State As Integer, Severity As Integer, MsgStr As String)
  388.     UserSqlMsgHandler SqlConn, Message&, State%, Severity%, MsgStr$
  389. End Sub