home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a522 / 30.ddi / WINSAM.PC < prev    next >
Encoding:
Text File  |  1991-03-11  |  22.9 KB  |  726 lines

  1. /*
  2.  * winsam.pc
  3.  *
  4.  * Example Pro*C Application for Windows V3.0.
  5.  *
  6.  * by F. Lopez -- Desktop Products Division.
  7.  *
  8.  * Copyright 1991, Oracle Corporation.
  9.  * Modified -
  10.  *   Criswell   3/11/91 - Include sqlproto.h
  11.  */
  12.  
  13. #include <windows.h>
  14. #include "winsam.h"
  15. #include <string.h>
  16. #include <sqlproto.h>
  17.  
  18.  
  19. /********************************************************************/
  20. /*                   Pro*C Declaration Section                      */
  21. /********************************************************************/
  22. /* You cannot use typedef's or the "C" macro facilities in the      */
  23. /* Pro*C declare section.  No constant folding either.              */
  24. /********************************************************************/
  25. EXEC SQL BEGIN DECLARE SECTION;
  26.  
  27.     /* Input host variables for logging into ORACLE. */
  28.     VARCHAR vc_connect[ 21 ];      /*used by CONNECT statement*/
  29.     VARCHAR vc_password[ 21 ];     /*used by CONNECT statement*/
  30.     VARCHAR vc_userid[ 21 ];       /*used by CONNECT statement*/
  31.  
  32.     /* Input/Output host variables for EMP table. */
  33.     VARCHAR vc_emp_empno[ 5 ];     /*used for EMP table*/
  34.     VARCHAR vc_emp_ename[ 11 ];    /*used for EMP table*/
  35.     VARCHAR vc_emp_job[ 10 ];      /*used for EMP table*/
  36.     VARCHAR vc_emp_mgr[ 5 ];       /*used for EMP table*/
  37.     VARCHAR vc_emp_hiredate[ 10 ]; /*used for EMP table*/
  38.     VARCHAR vc_emp_sal[ 9 ];       /*used for EMP table*/
  39.     VARCHAR vc_emp_comm[ 9 ];      /*used for EMP table*/
  40.     VARCHAR vc_emp_deptno[ 3 ];    /*used for EMP table*/
  41.  
  42.     /* Null field indicators for table EMP. */
  43.     short ind_emp_empno;           /*used for EMP table*/
  44.     short ind_emp_ename;           /*used for EMP table*/
  45.     short ind_emp_job;             /*used for EMP table*/
  46.     short ind_emp_mgr;             /*used for EMP table*/
  47.     short ind_emp_hiredate;        /*used for EMP table*/
  48.     short ind_emp_sal;             /*used for EMP table*/
  49.     short ind_emp_comm;            /*used for EMP table*/
  50.     short ind_emp_deptno;          /*used for EMP table*/
  51.  
  52. EXEC SQL END DECLARE SECTION;
  53.  
  54. EXEC SQL INCLUDE SQLCA.H;
  55. EXEC SQL INCLUDE SQLDA.H;
  56.  
  57. extern SQLDA *sqlald();
  58.  
  59.  
  60. /********************************************************************/
  61. /*                   Windows Declaration Section                    */
  62. /********************************************************************/
  63.  
  64. char szAbout[ MAX_ABOUT_STRING + 1 ];
  65. char szAppName[ MAX_APPNAME_STRING + 1 ];
  66. char szSampleMenu[ MAX_SAMPLEMENU_STRING + 1 ];
  67. char szTitle[ MAX_TITLE_STRING + 1 ];
  68.  
  69. long FAR PASCAL SampleWndProc(HWND, unsigned, WORD, LONG);
  70.  
  71. int DoDisconnect(HWND);
  72. int DoEmployees(HANDLE, HWND);
  73. int DoLogon(HANDLE, HWND);
  74. PROCEDURE GetEmpRecord(HWND);
  75. BOOL ProcessOracleErrorCode(HWND);
  76. BOOL SampleInit(HANDLE);
  77. PROCEDURE SetEmpRecord(HWND);
  78.  
  79. static HANDLE hInst;
  80. HWND hwndMain;
  81. FARPROC lpprocAbout;
  82. FARPROC lpprocLogon;
  83.  
  84. struct oracle_session session;
  85.  
  86.  
  87. /********************************************************************/
  88. /*                   Pro*C and Windows Code.                        */
  89. /********************************************************************/
  90.  
  91. /*
  92.  *ProcessOracleErrorCode
  93.  */
  94. BOOL ProcessOracleErrorCode(hWnd)
  95. HWND hWnd;
  96. {
  97.  
  98.     /* Check for a Pro*C error -- sqlcodes less than zero are errors. */
  99.     if (sqlca.sqlcode < 0) {
  100.         MessageBox(hWnd, sqlca.sqlerrm.sqlerrmc, "ORACLE Error", MB_OK);
  101.         return( FALSE );
  102.         } /*if*/
  103.  
  104.     return( TRUE );
  105.  
  106. } /*ProcessOracleErrorCode*/
  107.  
  108. /*
  109.  *AboutDlg
  110.  */
  111. BOOL FAR PASCAL AboutDlg(hDlg, message, wParam, lParam)
  112. HWND hDlg;
  113. unsigned message;
  114. WORD wParam;
  115. LONG lParam;
  116. {
  117.  
  118.     switch (message) {
  119.  
  120.         case WM_COMMAND :
  121.             EndDialog(hDlg, TRUE);
  122.             return(TRUE);
  123.  
  124.         case WM_INITDIALOG :
  125.             return(TRUE);
  126.  
  127.         default :
  128.             return(FALSE);
  129.         } /*switch*/
  130.  
  131.     return(FALSE);
  132.  
  133. } /*AboutDlg*/
  134.  
  135. /*
  136.  *GetEmpRecord
  137.  */
  138. PROCEDURE GetEmpRecord(hDlg)
  139. HWND hDlg;
  140. {
  141.  
  142.     ind_emp_empno = ind_emp_ename = ind_emp_job = ind_emp_mgr =
  143.       ind_emp_hiredate = ind_emp_sal = ind_emp_comm = ind_emp_deptno = 0;
  144.  
  145.     if ((vc_emp_empno.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_EMPNO,
  146.                                       (LPSTR)vc_emp_empno.arr, 5)) == 0)
  147.         ind_emp_empno = -1;
  148.  
  149.     if ((vc_emp_ename.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_ENAME,
  150.                                       (LPSTR)vc_emp_ename.arr, 11)) == 0)
  151.         ind_emp_ename = -1;
  152.  
  153.     if ((vc_emp_job.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_JOB,
  154.                                       (LPSTR)vc_emp_job.arr, 10)) == 0)
  155.         ind_emp_job = -1;
  156.  
  157.     if ((vc_emp_mgr.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_MGR,
  158.                                       (LPSTR)vc_emp_mgr.arr, 5)) == 0)
  159.         ind_emp_mgr = -1;
  160.  
  161.     if ((vc_emp_hiredate.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_HIREDATE,
  162.                                       (LPSTR)vc_emp_hiredate.arr, 10)) == 0)
  163.         ind_emp_hiredate = -1;
  164.  
  165.     if ((vc_emp_sal.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_SAL,
  166.                                       (LPSTR)vc_emp_sal.arr, 9)) == 0)
  167.         ind_emp_sal = -1;
  168.  
  169.     if ((vc_emp_comm.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_COMM,
  170.                                       (LPSTR)vc_emp_comm.arr, 9)) == 0)
  171.         ind_emp_comm = -1;
  172.  
  173.     if ((vc_emp_deptno.len = GetDlgItemText(hDlg, ID_EMPLOYEES_FLD_DEPTNO,
  174.                                       (LPSTR)vc_emp_deptno.arr, 3)) == 0)
  175.         ind_emp_deptno = -1;
  176.  
  177.     return;
  178.  
  179. } /*GetEmpRecord*/
  180.  
  181. /*
  182.  *SetEmpRecord
  183.  */
  184. PROCEDURE SetEmpRecord(hDlg)
  185. HWND hDlg;
  186. {
  187.  
  188.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_EMPNO, (LPSTR)vc_emp_empno.arr);
  189.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_ENAME, (LPSTR)vc_emp_ename.arr);
  190.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_JOB, (LPSTR)vc_emp_job.arr);
  191.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_MGR, (LPSTR)vc_emp_mgr.arr);
  192.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_HIREDATE,
  193.                                                (LPSTR)vc_emp_hiredate.arr);
  194.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_SAL, (LPSTR)vc_emp_sal.arr);
  195.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_COMM, (LPSTR)vc_emp_comm.arr);
  196.     SetDlgItemText(hDlg, ID_EMPLOYEES_FLD_DEPTNO, (LPSTR)vc_emp_deptno.arr);
  197.  
  198.     return;
  199.  
  200. } /*SetEmpRecord*/
  201.  
  202. /*
  203.  *EmployeesDlg
  204.  */
  205. BOOL FAR PASCAL EmployeesDlg(hDlg, message, wParam, lParam)
  206. HWND hDlg;
  207. unsigned message;
  208. WORD wParam;
  209. LONG lParam;
  210. {
  211.     int iReturn = TRUE;
  212.  
  213.     /* DECLARE is a declaration and it will not generate "C" right here. */
  214.     EXEC SQL DECLARE emp_cursor CURSOR FOR
  215.         SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
  216.         FROM EMP
  217.         FOR UPDATE OF EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO;
  218.  
  219.         /****************************************************************/
  220.         /* You need the "FOR UPDATE OF" clause so that you can use      */
  221.         /* the "FOR CURRENT OF" with UPDATE and DELETE statements. This */
  222.         /* also applies to an OCI cursor's ROWID field. This field will */
  223.         /* only be valid for other statements to use if and only if you */
  224.         /* use the "FOR UPDATE OF" clause with the SELECT for this locks*/
  225.         /* the ROWID until the next COMMIT [see SQL manuals].           */
  226.         /****************************************************************/
  227.  
  228.     switch (message) {
  229.  
  230.         case WM_COMMAND :
  231.  
  232.             switch (wParam) {
  233.  
  234.                 case ID_EMPLOYEES_EXIT :
  235.                     EndDialog(hDlg, 1);
  236.                     break;
  237.  
  238.                 case ID_EMPLOYEES_SELECT :
  239.  
  240.                     if (session.opened == TRUE)
  241.                         EXEC SQL CLOSE emp_cursor;
  242.  
  243.                     EXEC SQL OPEN emp_cursor;
  244.  
  245.                     /* Check for error. */
  246.                     if (ProcessOracleErrorCode(hDlg) == FALSE)
  247.                         break;
  248.  
  249.                     session.opened = TRUE;
  250.  
  251.                 case ID_EMPLOYEES_FETCH :
  252.  
  253.                     if (session.opened == FALSE) {
  254.                         MessageBox(hDlg, "No active set", "ORACLE", MB_OK);
  255.                         break;
  256.                         } /*if*/
  257.  
  258.                     EXEC SQL
  259.                     FETCH emp_cursor
  260.                     INTO :vc_emp_empno:ind_emp_empno,
  261.                          :vc_emp_ename:ind_emp_ename,
  262.                          :vc_emp_job:ind_emp_job,
  263.                          :vc_emp_mgr:ind_emp_mgr,
  264.                          :vc_emp_hiredate:ind_emp_hiredate,
  265.                          :vc_emp_sal:ind_emp_sal,
  266.                          :vc_emp_comm:ind_emp_comm,
  267.                          :vc_emp_deptno:ind_emp_deptno;
  268.  
  269.                     /* Check for no more data in active set. */
  270.                     if (sqlca.sqlcode == 1403) {
  271.                         MessageBox(hDlg, "No more data", "ORACLE", MB_OK);
  272.                         break;
  273.                         } /*if*/
  274.  
  275.                     vc_emp_empno.arr[ vc_emp_empno.len ] = EOS;
  276.                     vc_emp_ename.arr[ vc_emp_ename.len ] = EOS;
  277.                     vc_emp_job.arr[ vc_emp_job.len ] = EOS;
  278.                     vc_emp_mgr.arr[ vc_emp_mgr.len ] = EOS;
  279.                     vc_emp_hiredate.arr[ vc_emp_hiredate.len ] = EOS;
  280.                     vc_emp_sal.arr[ vc_emp_sal.len ] = EOS;
  281.                     vc_emp_comm.arr[ vc_emp_comm.len ] = EOS;
  282.                     vc_emp_deptno.arr[ vc_emp_deptno.len ] = EOS;
  283.  
  284.                     SetEmpRecord(hDlg);
  285.  
  286.                     ProcessOracleErrorCode(hDlg);
  287.                     break;
  288.  
  289.                 case ID_EMPLOYEES_INSERT :
  290.                     GetEmpRecord(hDlg);
  291.  
  292.                     EXEC SQL
  293.                     INSERT INTO emp
  294.                         (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
  295.                         VALUES (:vc_emp_empno:ind_emp_empno,
  296.                                 :vc_emp_ename:ind_emp_ename,
  297.                                 :vc_emp_job:ind_emp_job,
  298.                                 :vc_emp_mgr:ind_emp_mgr,
  299.                                 :vc_emp_hiredate:ind_emp_hiredate,
  300.                                 :vc_emp_sal:ind_emp_sal,
  301.                                 :vc_emp_comm:ind_emp_comm,
  302.                                 :vc_emp_deptno:ind_emp_deptno);
  303.  
  304.                     ProcessOracleErrorCode(hDlg);
  305.                     break;
  306.  
  307.                 case ID_EMPLOYEES_UPDATE :
  308.  
  309.                     if (session.opened == FALSE) {
  310.                         MessageBox(hDlg, "No active set", "ORACLE", MB_OK);
  311.                         break;
  312.                         } /*if*/
  313.  
  314.                     GetEmpRecord(hDlg);
  315.  
  316.                     EXEC SQL
  317.                     UPDATE emp
  318.                     SET EMPNO    = :vc_emp_empno:ind_emp_empno,
  319.                         ENAME    = :vc_emp_ename:ind_emp_ename,
  320.                         JOB      = :vc_emp_job:ind_emp_job,
  321.                         MGR      = :vc_emp_mgr:ind_emp_mgr,
  322.                         HIREDATE = :vc_emp_hiredate:ind_emp_hiredate,
  323.                         SAL      = :vc_emp_sal:ind_emp_sal,
  324.                         COMM     = :vc_emp_comm:ind_emp_comm,
  325.                         DEPTNO   = :vc_emp_deptno:ind_emp_deptno
  326.                     WHERE CURRENT OF emp_cursor;
  327.  
  328.                     ProcessOracleErrorCode(hDlg);
  329.                     break;
  330.  
  331.  
  332.                 case ID_EMPLOYEES_DELETE :
  333.  
  334.                     if (session.opened == FALSE) {
  335.                         MessageBox(hDlg, "No active set", "ORACLE", MB_OK);
  336.                         break;
  337.                         } /*if*/
  338.  
  339.                     EXEC SQL
  340.                     DELETE FROM emp
  341.                     WHERE CURRENT OF emp_cursor;
  342.  
  343.                     ProcessOracleErrorCode(hDlg);
  344.                     break;
  345.  
  346.                 case ID_EMPLOYEES_CLEAR :
  347.                     vc_emp_empno.arr[ 0 ] = EOS; vc_emp_empno.len = 0;
  348.                     vc_emp_ename.arr[ 0 ] = EOS; vc_emp_ename.len = 0;
  349.                     vc_emp_job.arr[ 0 ] = EOS; vc_emp_job.len = 0;
  350.                     vc_emp_mgr.arr[ 0 ] = EOS; vc_emp_mgr.len = 0;
  351.                     vc_emp_hiredate.arr[ 0 ] = EOS; vc_emp_hiredate.len = 0;
  352.                     vc_emp_sal.arr[ 0 ] = EOS; vc_emp_sal.len = 0;
  353.                     vc_emp_comm.arr[ 0 ] = EOS; vc_emp_comm.len = 0;
  354.                     vc_emp_deptno.arr[ 0 ] = EOS; vc_emp_deptno.len = 0;
  355.                     SetEmpRecord(hDlg);
  356.                     break;
  357.  
  358.                 case ID_EMPLOYEES_COMMIT :
  359.                     EXEC SQL COMMIT WORK;
  360.  
  361.                     /* COMMIT frees locks so close the SELECT. */
  362.                     EXEC SQL CLOSE emp_cursor;
  363.                     session.opened = FALSE;
  364.  
  365.                     ProcessOracleErrorCode(hDlg);
  366.                     break;
  367.  
  368.                 case ID_EMPLOYEES_ROLLBACK :
  369.                     EXEC SQL ROLLBACK WORK;
  370.  
  371.                     /* ROLLBACK frees locks so close the SELECT. */
  372.                     EXEC SQL CLOSE emp_cursor;
  373.                     session.opened = FALSE;
  374.  
  375.                     ProcessOracleErrorCode(hDlg);
  376.                     break;
  377.  
  378.                 default :
  379.                     iReturn = FALSE;
  380.                     break;
  381.                 } /*switch*/
  382.  
  383.             break;
  384.  
  385.         case WM_INITDIALOG :
  386.             break;
  387.  
  388.         default :
  389.             iReturn = FALSE;
  390.             break;
  391.         } /*switch*/
  392.  
  393.     return( iReturn );
  394.  
  395. } /*EmployeesDlg*/
  396.  
  397. /*
  398.  *DoEmployees
  399.  */
  400. int DoEmployees(hInst, hWnd)
  401. HANDLE hInst;
  402. HWND hWnd;
  403. {
  404.     int iReturn = 0;
  405.     FARPROC lpprocEmployeesDlg;
  406.  
  407.     lpprocEmployeesDlg = MakeProcInstance(EmployeesDlg, hInst);
  408.  
  409.     iReturn = DialogBox(hInst, MAKEINTRESOURCE( EMPLOYEESBOX ),
  410.                                                   hWnd, lpprocEmployeesDlg);
  411.  
  412.     FreeProcInstance(lpprocEmployeesDlg);
  413.  
  414.     return( iReturn );
  415.  
  416.     return 0;
  417.  
  418. } /*DoEmployees*/
  419.  
  420. /*
  421.  * SampleInit
  422.  *
  423.  * Do startup initialization for the sample application.
  424.  */
  425. BOOL SampleInit(in_hInst)
  426. HANDLE in_hInst;
  427. {
  428.     WNDCLASS SampleClass;
  429.  
  430.     /* Load strings from resource */
  431.     LoadString(in_hInst, IDS_ABOUT, (LPSTR)szAbout, MAX_ABOUT_STRING);
  432.     LoadString(in_hInst, IDS_APPNAME, (LPSTR)szAppName, MAX_APPNAME_STRING);
  433.     LoadString(in_hInst, IDS_SAMPLEMENU,
  434.                                 (LPSTR)szSampleMenu, MAX_SAMPLEMENU_STRING);
  435.     LoadString(in_hInst, IDS_TITLE, (LPSTR)szTitle, MAX_TITLE_STRING);
  436.  
  437.     SampleClass.style = CS_HREDRAW | CS_VREDRAW;
  438.     SampleClass.lpfnWndProc = SampleWndProc;
  439.     SampleClass.cbClsExtra = 0;
  440.     SampleClass.cbWndExtra = 0;
  441.     SampleClass.hInstance = in_hInst;
  442.     SampleClass.hIcon = LoadIcon(in_hInst, (LPSTR)szAppName);
  443.     SampleClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  444.     SampleClass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
  445.     SampleClass.lpszMenuName = (LPSTR)szSampleMenu;
  446.     SampleClass.lpszClassName = (LPSTR)szAppName;
  447.  
  448.     if (!RegisterClass((LPWNDCLASS)&SampleClass))
  449.         return FALSE;
  450.  
  451.     return( TRUE );
  452.  
  453. } /*SampleInit*/
  454.  
  455. /*
  456.  *WinMain
  457.  */
  458. int PASCAL WinMain( hInstance, hPrevInstance, lpszCmdLine, cmdShow )
  459. HANDLE hInstance, hPrevInstance;
  460. LPSTR lpszCmdLine;
  461. int cmdShow;
  462. {
  463.     HMENU hmenuSystem, hmenuSample;
  464.     HWND hWnd;
  465.     MSG msg;
  466.  
  467.     if (hPrevInstance)
  468.         return( FALSE );
  469.  
  470.     if (!SampleInit(hInstance))
  471.         return( FALSE );
  472.  
  473.     /* Initialize the ORACLE connection. */
  474.     session.connected = FALSE;
  475.     session.opened = FALSE;
  476.  
  477.     hInst = hInstance;
  478.  
  479.     hmenuSample = LoadMenu(hInst, "SAMPLEMENU");
  480.  
  481.     hwndMain = hWnd = CreateWindow((LPSTR)szAppName,
  482.                         (LPSTR)szTitle,
  483.                         WS_OVERLAPPEDWINDOW,
  484.                         CW_USEDEFAULT,
  485.                         CW_USEDEFAULT,
  486.                         CW_USEDEFAULT,
  487.                         CW_USEDEFAULT,
  488.                         (HWND)NULL,
  489.                         (HMENU)NULL,
  490.                         (HANDLE)hInst,
  491.                         (LPSTR)NULL);
  492.  
  493.     lpprocAbout = MakeProcInstance((FARPROC)AboutDlg, hInst);
  494.     hmenuSystem = GetSystemMenu(hWnd, FALSE);
  495.     InsertMenu(hmenuSystem, 0, MF_BYPOSITION | MF_STRING, IDS_ABOUT,
  496.                                                             (LPSTR)szAbout);
  497.  
  498.     ShowWindow(hWnd, SW_SHOWNORMAL);
  499.     UpdateWindow(hWnd);
  500.  
  501.     while (GetMessage((LPMSG)&msg, NULL, 0, 0)) {
  502.         TranslateMessage((LPMSG)&msg);
  503.         DispatchMessage((LPMSG)&msg);
  504.         } /*while*/
  505.  
  506.     return( (int)msg.wParam );
  507.  
  508. } /*WinMain*/
  509.  
  510. /*
  511.  *SampleWndProc
  512.  */
  513. long FAR PASCAL SampleWndProc(hWnd, message, wParam, lParam)
  514. HWND hWnd;
  515. unsigned message;
  516. WORD wParam;
  517. LONG lParam;
  518. {
  519.     static HWND hInst;
  520.     HMENU hmenuSample;
  521.  
  522.     switch (message) {
  523.  
  524.         case WM_CREATE :
  525.             hInst = ((LPCREATESTRUCT) lParam)->hInstance;
  526.             return TRUE;
  527.  
  528.         case WM_SYSCOMMAND :
  529.  
  530.             switch (wParam) {
  531.                 case IDS_ABOUT:
  532.                     DialogBox(hInst, MAKEINTRESOURCE(ABOUTBOX),
  533.                                                         hWnd, lpprocAbout);
  534.                     return TRUE;
  535.                     break;
  536.  
  537.                 default:
  538.                     break;
  539.                 } /*switch*/
  540.             break;
  541.  
  542.         case WM_COMMAND :
  543.             if (LOWORD(lParam) == 0) {    /*message from a menu*/
  544.  
  545.                 switch (wParam) {
  546.  
  547.                     case IDM_EXIT :
  548.                         SendMessage(hWnd, WM_CLOSE, 0, 0L);
  549.                         return( TRUE );
  550.  
  551.                     case IDM_ORACLE_CONNECT :
  552.                         if (DoLogon(hInst, hWnd) == TRUE) {
  553.                             hmenuSample = GetMenu( hWnd );
  554.                             EnableMenuItem(hmenuSample, IDM_ORACLE_CONNECT,
  555.                                                                   MF_GRAYED);
  556.                             EnableMenuItem(hmenuSample, IDM_ORACLE_DISCONNECT,
  557.                                                                   MF_ENABLED);
  558.                             EnableMenuItem(hmenuSample, IDM_ORACLE_EMPLOYEES,
  559.                                                                   MF_ENABLED);
  560.                             } /*if*/
  561.                         return( TRUE );
  562.  
  563.                     case IDM_ORACLE_DISCONNECT :
  564.                         if (DoDisconnect(hWnd) == TRUE) {
  565.                             hmenuSample = GetMenu( hWnd );
  566.                             EnableMenuItem(hmenuSample, IDM_ORACLE_CONNECT,
  567.                                                                   MF_ENABLED);
  568.                             EnableMenuItem(hmenuSample, IDM_ORACLE_DISCONNECT,
  569.                                                                   MF_GRAYED);
  570.                             EnableMenuItem(hmenuSample, IDM_ORACLE_EMPLOYEES,
  571.                                                                   MF_GRAYED);
  572.                             } /*if*/
  573.                         return( TRUE );
  574.  
  575.                     case IDM_ORACLE_EMPLOYEES :
  576.                         DoEmployees(hInst, hWnd);
  577.                         return( TRUE );
  578.  
  579.                     default :
  580.                         break;
  581.                     } /*switch*/
  582.                 } /*if*/
  583.             break;
  584.  
  585.         case WM_CLOSE :
  586.             /* Disconnect before terminating Windows application. */
  587.             if (session.connected == TRUE)
  588.                 DoDisconnect(hWnd);
  589.  
  590.             break; /* Let this pass thru so default operation can occur. */
  591.  
  592.         case WM_DESTROY :
  593.             PostQuitMessage(0);
  594.             break;
  595.  
  596.         default:
  597.             break;
  598.         } /*switch*/
  599.  
  600.     /* Performs default operation. */
  601.     return( DefWindowProc(hWnd, message, wParam, lParam) );
  602.  
  603. } /*SampleWndProc*/
  604.  
  605. /*
  606.  *LogonDlg
  607.  */
  608. BOOL FAR PASCAL LogonDlg(hDlg, message, wParam, lParam)
  609. HWND hDlg;
  610. unsigned message;
  611. WORD wParam;
  612. LONG lParam;
  613. {
  614.  
  615.     switch (message) {
  616.  
  617.         case WM_COMMAND :
  618.  
  619.             switch (wParam) {
  620.  
  621.                 case ID_LOGON_OK :
  622.                     GetDlgItemText(hDlg, ID_LOGON_USERID,
  623.                                        (LPSTR)vc_userid.arr, MAX_USERID);
  624.                     vc_userid.len = strlen((LPSTR)vc_userid.arr);
  625.                     GetDlgItemText(hDlg, ID_LOGON_PASSWORD,
  626.                                        (LPSTR)vc_password.arr, MAX_PASSWORD);
  627.                     vc_password.len = strlen((LPSTR)vc_password.arr);
  628.                     GetDlgItemText(hDlg, ID_LOGON_CONNECT,
  629.                                        (LPSTR)vc_connect.arr, MAX_CONNECT);
  630.                     vc_connect.len = strlen((LPSTR)vc_connect.arr);
  631.                     EndDialog(hDlg, 1);
  632.                     return( TRUE );
  633.  
  634.                 case ID_LOGON_CANCEL :
  635.                     EndDialog(hDlg, 0);
  636.                     return( TRUE );
  637.  
  638.                 default :
  639.                     break;
  640.                 } /*switch*/
  641.  
  642.             break;
  643.  
  644.         case WM_INITDIALOG :
  645.             return(TRUE);
  646.  
  647.         default :
  648.             return(FALSE);
  649.         } /*switch*/
  650.  
  651.     return(FALSE);
  652.  
  653. } /*LogonDlg*/
  654.  
  655. /*
  656.  *DoLogon
  657.  */
  658. int DoLogon(hInst, hWnd)
  659. HANDLE hInst;
  660. HWND hWnd;
  661. {
  662.     FARPROC lpprocLogonDlg;
  663.  
  664.     if (session.connected == TRUE)
  665.         return( TRUE );
  666.  
  667.     lpprocLogonDlg = MakeProcInstance(LogonDlg, hInst);
  668.  
  669.     while (session.connected == FALSE) {
  670.  
  671.         /* Give the Logon Dialog Box -- control passes to LogonDlg(). */
  672.         if (DialogBox(hInst, MAKEINTRESOURCE( LOGONBOX ), hWnd,
  673.                                                        lpprocLogonDlg) == 0)
  674.             break;
  675.  
  676.         /* Pro*C CONNECT statement - one of several possible forms. */
  677.         EXEC SQL CONNECT :vc_userid IDENTIFIED BY :vc_password
  678.                                                         USING :vc_connect;
  679.  
  680.         /* Process the results of the CONNECT statement. */
  681.         if (ProcessOracleErrorCode(hWnd) == FALSE) {
  682.             if (MessageBox(hWnd, "Login to ORACLE",
  683.                                   "ORACLE", MB_RETRYCANCEL) != IDRETRY)
  684.                 break;
  685.             } /*if*/
  686.         else {
  687.             MessageBox(hWnd, "Logon Successful", "ORACLE", MB_OK);
  688.             session.connected = TRUE;
  689.            } /*else*/
  690.  
  691.         } /*while*/
  692.  
  693.     FreeProcInstance(lpprocLogonDlg);
  694.  
  695.     return( session.connected );
  696.  
  697. } /*DoLogon*/
  698.  
  699. /*
  700.  *DoDisconnect
  701.  */
  702. int DoDisconnect(hWnd)
  703. HWND hWnd;
  704. {
  705.  
  706.     if (session.connected == FALSE)
  707.         return(TRUE);
  708.  
  709.     if (session.opened == TRUE) {
  710.         EXEC SQL CLOSE emp_cursor;
  711.         session.opened = FALSE;
  712.         } /*if*/
  713.  
  714.     /* Commits the current transaction and releases the current connection.*/
  715.     EXEC SQL COMMIT WORK RELEASE;
  716.  
  717.     /* Process the results of the COMMIT statement. */
  718.     if (ProcessOracleErrorCode(hWnd) == TRUE) {
  719.         MessageBox(hWnd, "Disconnect Successful", "ORACLE", MB_OK);
  720.         session.connected = FALSE;
  721.         } /*else*/
  722.  
  723.     return((session.connected == FALSE) ? TRUE : FALSE);
  724.  
  725. } /*DoDisconnect*/
  726.