From 97c0720ce65ddebe171bf9296510d24f9ab64de1 Mon Sep 17 00:00:00 2001 From: Christian Shay Date: Sun, 23 Feb 2020 17:05:20 -0800 Subject: [PATCH 01/76] Create DataReader.cs --- .../DataReader.cs | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs diff --git a/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs b/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs new file mode 100644 index 00000000..f82fe01e --- /dev/null +++ b/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs @@ -0,0 +1,75 @@ +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ + +using System; +using Oracle.ManagedDataAccess.Client; + +namespace VSADBDemo +{ + class Program + { + static void Main(string[] args) + { + //Demo: Basic ODP.NET Managed application to connect, query, and return + // results from an OracleDataReader to a console + + //Create a connection to Oracle + string conString = "User Id=hr;Password=mypassword;" + + + "Data Source=myalias>;"; + + using (OracleConnection con = new OracleConnection(conString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + cmd.BindByName = true; + + //Use the command to display employee names from + // the EMPLOYEES table + cmd.CommandText = "select first_name from employees where department_id = :id"; + + // Assign id to the department number 50 + OracleParameter id = new OracleParameter("id", 50); + cmd.Parameters.Add(id); + + //Execute the command and use DataReader to display the data + OracleDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Console.WriteLine("Employee First Name: " + reader.GetString(0)); + } + + Console.WriteLine(); + Console.WriteLine("Press 'Enter' to continue"); + + reader.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + Console.ReadLine(); + } + } + } + } +} From ef9d39f82fded37d0623e36956c773b795a0bff3 Mon Sep 17 00:00:00 2001 From: Christian Shay Date: Sun, 23 Feb 2020 17:10:06 -0800 Subject: [PATCH 02/76] Update DataReader.cs --- video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs b/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs index f82fe01e..50ee6e0a 100644 --- a/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs +++ b/video-demos/IntroVisualStudioAlwaysFreeADB/DataReader.cs @@ -32,7 +32,7 @@ static void Main(string[] args) //Create a connection to Oracle string conString = "User Id=hr;Password=mypassword;" + - "Data Source=myalias>;"; + "Data Source=myalias;"; using (OracleConnection con = new OracleConnection(conString)) { From 59ae4bd5f561014ea65e1185df37909d9232ac32 Mon Sep 17 00:00:00 2001 From: Christian Shay Date: Sun, 23 Feb 2020 17:28:42 -0800 Subject: [PATCH 03/76] Add files via upload --- .../IntroVisualStudioAlwaysFreeADB/hr.sql | 2931 +++++++++++++++++ 1 file changed, 2931 insertions(+) create mode 100644 video-demos/IntroVisualStudioAlwaysFreeADB/hr.sql diff --git a/video-demos/IntroVisualStudioAlwaysFreeADB/hr.sql b/video-demos/IntroVisualStudioAlwaysFreeADB/hr.sql new file mode 100644 index 00000000..6ac1898f --- /dev/null +++ b/video-demos/IntroVisualStudioAlwaysFreeADB/hr.sql @@ -0,0 +1,2931 @@ +Rem +Rem $Header: hr_cre.sql 29-aug-2002.11:44:03 hyeh Exp $ +Rem +Rem hr_cre.sql +Rem +Rem Copyright (c) 2001, 2015, Oracle Corporation. All rights reserved. +Rem +Rem Permission is hereby granted, free of charge, to any person obtaining +Rem a copy of this software and associated documentation files (the +Rem "Software"), to deal in the Software without restriction, including +Rem without limitation the rights to use, copy, modify, merge, publish, +Rem distribute, sublicense, and/or sell copies of the Software, and to +Rem permit persons to whom the Software is furnished to do so, subject to +Rem the following conditions: +Rem +Rem The above copyright notice and this permission notice shall be +Rem included in all copies or substantial portions of the Software. +Rem +Rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +Rem EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +Rem MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +Rem NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +Rem LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +Rem OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +Rem WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Rem +Rem NAME +Rem hr_cre.sql - Create data objects for HR schema +Rem +Rem DESCRIPTION +Rem This script creates six tables, associated constraints +Rem and indexes in the human resources (HR) schema. +Rem +Rem NOTES +Rem +Rem CREATED by Nancy Greenberg, Nagavalli Pataballa - 06/01/00 +Rem +Rem MODIFIED (MM/DD/YY) +Rem hyeh 08/29/02 - hyeh_mv_comschema_to_rdbms +Rem ahunold 09/14/00 - Added emp_details_view +Rem ahunold 02/20/01 - New header +Rem vpatabal 03/02/01 - Added regions table, modified regions +Rem column in countries table to NUMBER. +Rem Added foreign key from countries table +Rem to regions table on region_id. +Rem Removed currency name, currency symbol +Rem columns from the countries table. +Rem Removed dn columns from employees and +Rem departments tables. +Rem Added sequences. +Rem Removed not null constraint from +Rem salary column of the employees table. + +SET FEEDBACK 1 +SET NUMWIDTH 10 +SET LINESIZE 80 +SET TRIMSPOOL ON +SET TAB OFF +SET PAGESIZE 100 +SET ECHO OFF + +REM ******************************************************************** +REM Create the REGIONS table to hold region information for locations +REM HR.LOCATIONS table has a foreign key to this table. + +Prompt ****** Creating REGIONS table .... + +CREATE TABLE regions + ( region_id NUMBER + CONSTRAINT region_id_nn NOT NULL + , region_name VARCHAR2(25) + ); + +CREATE UNIQUE INDEX reg_id_pk +ON regions (region_id); + +ALTER TABLE regions +ADD ( CONSTRAINT reg_id_pk + PRIMARY KEY (region_id) + ) ; + +REM ******************************************************************** +REM Create the COUNTRIES table to hold country information for customers +REM and company locations. +REM OE.CUSTOMERS table and HR.LOCATIONS have a foreign key to this table. + +Prompt ****** Creating COUNTRIES table .... + +CREATE TABLE countries + ( country_id CHAR(2) + CONSTRAINT country_id_nn NOT NULL + , country_name VARCHAR2(40) + , region_id NUMBER + , CONSTRAINT country_c_id_pk + PRIMARY KEY (country_id) + ) + ORGANIZATION INDEX; + +ALTER TABLE countries +ADD ( CONSTRAINT countr_reg_fk + FOREIGN KEY (region_id) + REFERENCES regions(region_id) + ) ; + +REM ******************************************************************** +REM Create the LOCATIONS table to hold address information for company departments. +REM HR.DEPARTMENTS has a foreign key to this table. + +Prompt ****** Creating LOCATIONS table .... + +CREATE TABLE locations + ( location_id NUMBER(4) + , street_address VARCHAR2(40) + , postal_code VARCHAR2(12) + , city VARCHAR2(30) + CONSTRAINT loc_city_nn NOT NULL + , state_province VARCHAR2(25) + , country_id CHAR(2) + ) ; + +CREATE UNIQUE INDEX loc_id_pk +ON locations (location_id) ; + +ALTER TABLE locations +ADD ( CONSTRAINT loc_id_pk + PRIMARY KEY (location_id) + , CONSTRAINT loc_c_id_fk + FOREIGN KEY (country_id) + REFERENCES countries(country_id) + ) ; + +Rem Useful for any subsequent addition of rows to locations table +Rem Starts with 3300 + +CREATE SEQUENCE locations_seq + START WITH 3300 + INCREMENT BY 100 + MAXVALUE 9900 + NOCACHE + NOCYCLE; + +REM ******************************************************************** +REM Create the DEPARTMENTS table to hold company department information. +REM HR.EMPLOYEES and HR.JOB_HISTORY have a foreign key to this table. + +Prompt ****** Creating DEPARTMENTS table .... + +CREATE TABLE departments + ( department_id NUMBER(4) + , department_name VARCHAR2(30) + CONSTRAINT dept_name_nn NOT NULL + , manager_id NUMBER(6) + , location_id NUMBER(4) + ) ; + +CREATE UNIQUE INDEX dept_id_pk +ON departments (department_id) ; + +ALTER TABLE departments +ADD ( CONSTRAINT dept_id_pk + PRIMARY KEY (department_id) + , CONSTRAINT dept_loc_fk + FOREIGN KEY (location_id) + REFERENCES locations (location_id) + ) ; + +Rem Useful for any subsequent addition of rows to departments table +Rem Starts with 280 + +CREATE SEQUENCE departments_seq + START WITH 280 + INCREMENT BY 10 + MAXVALUE 9990 + NOCACHE + NOCYCLE; + +REM ******************************************************************** +REM Create the JOBS table to hold the different names of job roles within the company. +REM HR.EMPLOYEES has a foreign key to this table. + +Prompt ****** Creating JOBS table .... + +CREATE TABLE jobs + ( job_id VARCHAR2(10) + , job_title VARCHAR2(35) + CONSTRAINT job_title_nn NOT NULL + , min_salary NUMBER(6) + , max_salary NUMBER(6) + ) ; + +CREATE UNIQUE INDEX job_id_pk +ON jobs (job_id) ; + +ALTER TABLE jobs +ADD ( CONSTRAINT job_id_pk + PRIMARY KEY(job_id) + ) ; + +REM ******************************************************************** +REM Create the EMPLOYEES table to hold the employee personnel +REM information for the company. +REM HR.EMPLOYEES has a self referencing foreign key to this table. + +Prompt ****** Creating EMPLOYEES table .... + +CREATE TABLE employees + ( employee_id NUMBER(6) + , first_name VARCHAR2(20) + , last_name VARCHAR2(25) + CONSTRAINT emp_last_name_nn NOT NULL + , email VARCHAR2(25) + CONSTRAINT emp_email_nn NOT NULL + , phone_number VARCHAR2(20) + , hire_date DATE + CONSTRAINT emp_hire_date_nn NOT NULL + , job_id VARCHAR2(10) + CONSTRAINT emp_job_nn NOT NULL + , salary NUMBER(8,2) + , commission_pct NUMBER(2,2) + , manager_id NUMBER(6) + , department_id NUMBER(4) + , CONSTRAINT emp_salary_min + CHECK (salary > 0) + , CONSTRAINT emp_email_uk + UNIQUE (email) + ) ; + +CREATE UNIQUE INDEX emp_emp_id_pk +ON employees (employee_id) ; + + +ALTER TABLE employees +ADD ( CONSTRAINT emp_emp_id_pk + PRIMARY KEY (employee_id) + , CONSTRAINT emp_dept_fk + FOREIGN KEY (department_id) + REFERENCES departments + , CONSTRAINT emp_job_fk + FOREIGN KEY (job_id) + REFERENCES jobs (job_id) + , CONSTRAINT emp_manager_fk + FOREIGN KEY (manager_id) + REFERENCES employees + ) ; + +ALTER TABLE departments +ADD ( CONSTRAINT dept_mgr_fk + FOREIGN KEY (manager_id) + REFERENCES employees (employee_id) + ) ; + + +Rem Useful for any subsequent addition of rows to employees table +Rem Starts with 207 + + +CREATE SEQUENCE employees_seq + START WITH 207 + INCREMENT BY 1 + NOCACHE + NOCYCLE; + +REM ******************************************************************** +REM Create the JOB_HISTORY table to hold the history of jobs that +REM employees have held in the past. +REM HR.JOBS, HR_DEPARTMENTS, and HR.EMPLOYEES have a foreign key to this table. + +Prompt ****** Creating JOB_HISTORY table .... + +CREATE TABLE job_history + ( employee_id NUMBER(6) + CONSTRAINT jhist_employee_nn NOT NULL + , start_date DATE + CONSTRAINT jhist_start_date_nn NOT NULL + , end_date DATE + CONSTRAINT jhist_end_date_nn NOT NULL + , job_id VARCHAR2(10) + CONSTRAINT jhist_job_nn NOT NULL + , department_id NUMBER(4) + , CONSTRAINT jhist_date_interval + CHECK (end_date > start_date) + ) ; + +CREATE UNIQUE INDEX jhist_emp_id_st_date_pk +ON job_history (employee_id, start_date) ; + +ALTER TABLE job_history +ADD ( CONSTRAINT jhist_emp_id_st_date_pk + PRIMARY KEY (employee_id, start_date) + , CONSTRAINT jhist_job_fk + FOREIGN KEY (job_id) + REFERENCES jobs + , CONSTRAINT jhist_emp_fk + FOREIGN KEY (employee_id) + REFERENCES employees + , CONSTRAINT jhist_dept_fk + FOREIGN KEY (department_id) + REFERENCES departments + ) ; + +REM ******************************************************************** +REM Create the EMP_DETAILS_VIEW that joins the employees, jobs, +REM departments, jobs, countries, and locations table to provide details +REM about employees. + +Prompt ****** Creating EMP_DETAILS_VIEW view ... + +CREATE OR REPLACE VIEW emp_details_view + (employee_id, + job_id, + manager_id, + department_id, + location_id, + country_id, + first_name, + last_name, + salary, + commission_pct, + department_name, + job_title, + city, + state_province, + country_name, + region_name) +AS SELECT + e.employee_id, + e.job_id, + e.manager_id, + e.department_id, + d.location_id, + l.country_id, + e.first_name, + e.last_name, + e.salary, + e.commission_pct, + d.department_name, + j.job_title, + l.city, + l.state_province, + c.country_name, + r.region_name +FROM + employees e, + departments d, + jobs j, + locations l, + countries c, + regions r +WHERE e.department_id = d.department_id + AND d.location_id = l.location_id + AND l.country_id = c.country_id + AND c.region_id = r.region_id + AND j.job_id = e.job_id +WITH READ ONLY; + +COMMIT; +rem +rem Header: hr_popul.sql 09-jan-01 +rem +rem Copyright (c) 2001, 2015, Oracle. All rights reserved. +rem +rem Permission is hereby granted, free of charge, to any person obtaining +rem a copy of this software and associated documentation files (the +rem "Software"), to deal in the Software without restriction, including +rem without limitation the rights to use, copy, modify, merge, publish, +rem distribute, sublicense, and/or sell copies of the Software, and to +rem permit persons to whom the Software is furnished to do so, subject to +rem the following conditions: +rem +rem The above copyright notice and this permission notice shall be +rem included in all copies or substantial portions of the Software. +rem +rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +rem EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +rem MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +rem NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +rem LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +rem OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +rem WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +rem +rem Owner : ahunold +rem +rem NAME +rem hr_popul.sql - Populate script for HR schema +rem +rem DESCRIPTON +rem +rem +rem NOTES +rem There is a circular foreign key reference between +rem EMPLOYESS and DEPARTMENTS. That's why we disable +rem the FK constraints here +rem +rem CREATED +rem Nancy Greenberg, Nagavalli Pataballa - 06/01/00 +rem +rem MODIFIED (MM/DD/YY) +rem celsbern 08/07/08 - fixing date strings to use all numbers, no month +rem names +rem cbauwens 02/13/08 - employees.hire_date rolled forward 8 years +rem job_history start_date end_date rolled forward 8 years +rem hyeh 08/29/02 - hyeh_mv_comschema_to_rdbms +rem ahunold 03/07/01 - small data errors corrected +rem - Modified region values of countries table +rem - Replaced ID sequence values for employees +rem and departments tables with numbers +rem - Moved create sequence statements to hr_cre +rem - Removed dn values for employees and +rem departments tables +rem - Removed currency columns values from +rem countries table +rem ngreenbe - Updated employee 178 for no department +rem pnathan - Insert new rows to job_history table +rem ahunold 02/20/01 - NLS_LANGUAGE, replacing non American +rem ahunold 01/09/01 - checkin ADE + +SET VERIFY OFF +ALTER SESSION SET NLS_LANGUAGE=American; + +REM ***************************insert data into the REGIONS table + +Prompt ****** Populating REGIONS table .... + +INSERT INTO regions VALUES + ( 1 + , 'Europe' + ); + +INSERT INTO regions VALUES + ( 2 + , 'Americas' + ); + +INSERT INTO regions VALUES + ( 3 + , 'Asia' + ); + +INSERT INTO regions VALUES + ( 4 + , 'Middle East and Africa' + ); + +REM ***************************insert data into the COUNTRIES table + +Prompt ****** Populating COUNTIRES table .... + +INSERT INTO countries VALUES + ( 'IT' + , 'Italy' + , 1 + ); + +INSERT INTO countries VALUES + ( 'JP' + , 'Japan' + , 3 + ); + +INSERT INTO countries VALUES + ( 'US' + , 'United States of America' + , 2 + ); + +INSERT INTO countries VALUES + ( 'CA' + , 'Canada' + , 2 + ); + +INSERT INTO countries VALUES + ( 'CN' + , 'China' + , 3 + ); + +INSERT INTO countries VALUES + ( 'IN' + , 'India' + , 3 + ); + +INSERT INTO countries VALUES + ( 'AU' + , 'Australia' + , 3 + ); + +INSERT INTO countries VALUES + ( 'ZW' + , 'Zimbabwe' + , 4 + ); + +INSERT INTO countries VALUES + ( 'SG' + , 'Singapore' + , 3 + ); + +INSERT INTO countries VALUES + ( 'UK' + , 'United Kingdom' + , 1 + ); + +INSERT INTO countries VALUES + ( 'FR' + , 'France' + , 1 + ); + +INSERT INTO countries VALUES + ( 'DE' + , 'Germany' + , 1 + ); + +INSERT INTO countries VALUES + ( 'ZM' + , 'Zambia' + , 4 + ); + +INSERT INTO countries VALUES + ( 'EG' + , 'Egypt' + , 4 + ); + +INSERT INTO countries VALUES + ( 'BR' + , 'Brazil' + , 2 + ); + +INSERT INTO countries VALUES + ( 'CH' + , 'Switzerland' + , 1 + ); + +INSERT INTO countries VALUES + ( 'NL' + , 'Netherlands' + , 1 + ); + +INSERT INTO countries VALUES + ( 'MX' + , 'Mexico' + , 2 + ); + +INSERT INTO countries VALUES + ( 'KW' + , 'Kuwait' + , 4 + ); + +INSERT INTO countries VALUES + ( 'IL' + , 'Israel' + , 4 + ); + +INSERT INTO countries VALUES + ( 'DK' + , 'Denmark' + , 1 + ); + +INSERT INTO countries VALUES + ( 'ML' + , 'Malaysia' + , 3 + ); + +INSERT INTO countries VALUES + ( 'NG' + , 'Nigeria' + , 4 + ); + +INSERT INTO countries VALUES + ( 'AR' + , 'Argentina' + , 2 + ); + +INSERT INTO countries VALUES + ( 'BE' + , 'Belgium' + , 1 + ); + + +REM ***************************insert data into the LOCATIONS table + +Prompt ****** Populating LOCATIONS table .... + +INSERT INTO locations VALUES + ( 1000 + , '1297 Via Cola di Rie' + , '00989' + , 'Roma' + , NULL + , 'IT' + ); + +INSERT INTO locations VALUES + ( 1100 + , '93091 Calle della Testa' + , '10934' + , 'Venice' + , NULL + , 'IT' + ); + +INSERT INTO locations VALUES + ( 1200 + , '2017 Shinjuku-ku' + , '1689' + , 'Tokyo' + , 'Tokyo Prefecture' + , 'JP' + ); + +INSERT INTO locations VALUES + ( 1300 + , '9450 Kamiya-cho' + , '6823' + , 'Hiroshima' + , NULL + , 'JP' + ); + +INSERT INTO locations VALUES + ( 1400 + , '2014 Jabberwocky Rd' + , '26192' + , 'Southlake' + , 'Texas' + , 'US' + ); + +INSERT INTO locations VALUES + ( 1500 + , '2011 Interiors Blvd' + , '99236' + , 'South San Francisco' + , 'California' + , 'US' + ); + +INSERT INTO locations VALUES + ( 1600 + , '2007 Zagora St' + , '50090' + , 'South Brunswick' + , 'New Jersey' + , 'US' + ); + +INSERT INTO locations VALUES + ( 1700 + , '2004 Charade Rd' + , '98199' + , 'Seattle' + , 'Washington' + , 'US' + ); + +INSERT INTO locations VALUES + ( 1800 + , '147 Spadina Ave' + , 'M5V 2L7' + , 'Toronto' + , 'Ontario' + , 'CA' + ); + +INSERT INTO locations VALUES + ( 1900 + , '6092 Boxwood St' + , 'YSW 9T2' + , 'Whitehorse' + , 'Yukon' + , 'CA' + ); + +INSERT INTO locations VALUES + ( 2000 + , '40-5-12 Laogianggen' + , '190518' + , 'Beijing' + , NULL + , 'CN' + ); + +INSERT INTO locations VALUES + ( 2100 + , '1298 Vileparle (E)' + , '490231' + , 'Bombay' + , 'Maharashtra' + , 'IN' + ); + +INSERT INTO locations VALUES + ( 2200 + , '12-98 Victoria Street' + , '2901' + , 'Sydney' + , 'New South Wales' + , 'AU' + ); + +INSERT INTO locations VALUES + ( 2300 + , '198 Clementi North' + , '540198' + , 'Singapore' + , NULL + , 'SG' + ); + +INSERT INTO locations VALUES + ( 2400 + , '8204 Arthur St' + , NULL + , 'London' + , NULL + , 'UK' + ); + +INSERT INTO locations VALUES + ( 2500 + , 'Magdalen Centre, The Oxford Science Park' + , 'OX9 9ZB' + , 'Oxford' + , 'Oxford' + , 'UK' + ); + +INSERT INTO locations VALUES + ( 2600 + , '9702 Chester Road' + , '09629850293' + , 'Stretford' + , 'Manchester' + , 'UK' + ); + +INSERT INTO locations VALUES + ( 2700 + , 'Schwanthalerstr. 7031' + , '80925' + , 'Munich' + , 'Bavaria' + , 'DE' + ); + +INSERT INTO locations VALUES + ( 2800 + , 'Rua Frei Caneca 1360 ' + , '01307-002' + , 'Sao Paulo' + , 'Sao Paulo' + , 'BR' + ); + +INSERT INTO locations VALUES + ( 2900 + , '20 Rue des Corps-Saints' + , '1730' + , 'Geneva' + , 'Geneve' + , 'CH' + ); + +INSERT INTO locations VALUES + ( 3000 + , 'Murtenstrasse 921' + , '3095' + , 'Bern' + , 'BE' + , 'CH' + ); + +INSERT INTO locations VALUES + ( 3100 + , 'Pieter Breughelstraat 837' + , '3029SK' + , 'Utrecht' + , 'Utrecht' + , 'NL' + ); + +INSERT INTO locations VALUES + ( 3200 + , 'Mariano Escobedo 9991' + , '11932' + , 'Mexico City' + , 'Distrito Federal,' + , 'MX' + ); + + +REM ****************************insert data into the DEPARTMENTS table + +Prompt ****** Populating DEPARTMENTS table .... + +REM disable integrity constraint to EMPLOYEES to load data + +ALTER TABLE departments + DISABLE CONSTRAINT dept_mgr_fk; + +INSERT INTO departments VALUES + ( 10 + , 'Administration' + , 200 + , 1700 + ); + +INSERT INTO departments VALUES + ( 20 + , 'Marketing' + , 201 + , 1800 + ); + +INSERT INTO departments VALUES + ( 30 + , 'Purchasing' + , 114 + , 1700 + ); + +INSERT INTO departments VALUES + ( 40 + , 'Human Resources' + , 203 + , 2400 + ); + +INSERT INTO departments VALUES + ( 50 + , 'Shipping' + , 121 + , 1500 + ); + +INSERT INTO departments VALUES + ( 60 + , 'IT' + , 103 + , 1400 + ); + +INSERT INTO departments VALUES + ( 70 + , 'Public Relations' + , 204 + , 2700 + ); + +INSERT INTO departments VALUES + ( 80 + , 'Sales' + , 145 + , 2500 + ); + +INSERT INTO departments VALUES + ( 90 + , 'Executive' + , 100 + , 1700 + ); + +INSERT INTO departments VALUES + ( 100 + , 'Finance' + , 108 + , 1700 + ); + +INSERT INTO departments VALUES + ( 110 + , 'Accounting' + , 205 + , 1700 + ); + +INSERT INTO departments VALUES + ( 120 + , 'Treasury' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 130 + , 'Corporate Tax' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 140 + , 'Control And Credit' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 150 + , 'Shareholder Services' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 160 + , 'Benefits' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 170 + , 'Manufacturing' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 180 + , 'Construction' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 190 + , 'Contracting' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 200 + , 'Operations' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 210 + , 'IT Support' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 220 + , 'NOC' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 230 + , 'IT Helpdesk' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 240 + , 'Government Sales' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 250 + , 'Retail Sales' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 260 + , 'Recruiting' + , NULL + , 1700 + ); + +INSERT INTO departments VALUES + ( 270 + , 'Payroll' + , NULL + , 1700 + ); + + +REM ***************************insert data into the JOBS table + +Prompt ****** Populating JOBS table .... + +INSERT INTO jobs VALUES + ( 'AD_PRES' + , 'President' + , 20080 + , 40000 + ); +INSERT INTO jobs VALUES + ( 'AD_VP' + , 'Administration Vice President' + , 15000 + , 30000 + ); + +INSERT INTO jobs VALUES + ( 'AD_ASST' + , 'Administration Assistant' + , 3000 + , 6000 + ); + +INSERT INTO jobs VALUES + ( 'FI_MGR' + , 'Finance Manager' + , 8200 + , 16000 + ); + +INSERT INTO jobs VALUES + ( 'FI_ACCOUNT' + , 'Accountant' + , 4200 + , 9000 + ); + +INSERT INTO jobs VALUES + ( 'AC_MGR' + , 'Accounting Manager' + , 8200 + , 16000 + ); + +INSERT INTO jobs VALUES + ( 'AC_ACCOUNT' + , 'Public Accountant' + , 4200 + , 9000 + ); +INSERT INTO jobs VALUES + ( 'SA_MAN' + , 'Sales Manager' + , 10000 + , 20080 + ); + +INSERT INTO jobs VALUES + ( 'SA_REP' + , 'Sales Representative' + , 6000 + , 12008 + ); + +INSERT INTO jobs VALUES + ( 'PU_MAN' + , 'Purchasing Manager' + , 8000 + , 15000 + ); + +INSERT INTO jobs VALUES + ( 'PU_CLERK' + , 'Purchasing Clerk' + , 2500 + , 5500 + ); + +INSERT INTO jobs VALUES + ( 'ST_MAN' + , 'Stock Manager' + , 5500 + , 8500 + ); +INSERT INTO jobs VALUES + ( 'ST_CLERK' + , 'Stock Clerk' + , 2008 + , 5000 + ); + +INSERT INTO jobs VALUES + ( 'SH_CLERK' + , 'Shipping Clerk' + , 2500 + , 5500 + ); + +INSERT INTO jobs VALUES + ( 'IT_PROG' + , 'Programmer' + , 4000 + , 10000 + ); + +INSERT INTO jobs VALUES + ( 'MK_MAN' + , 'Marketing Manager' + , 9000 + , 15000 + ); + +INSERT INTO jobs VALUES + ( 'MK_REP' + , 'Marketing Representative' + , 4000 + , 9000 + ); + +INSERT INTO jobs VALUES + ( 'HR_REP' + , 'Human Resources Representative' + , 4000 + , 9000 + ); + +INSERT INTO jobs VALUES + ( 'PR_REP' + , 'Public Relations Representative' + , 4500 + , 10500 + ); + + +REM ***************************insert data into the EMPLOYEES table + +Prompt ****** Populating EMPLOYEES table .... + +INSERT INTO employees VALUES + ( 100 + , 'Steven' + , 'King' + , 'SKING' + , '515.123.4567' + , TO_DATE('17-06-2003', 'dd-MM-yyyy') + , 'AD_PRES' + , 24000 + , NULL + , NULL + , 90 + ); + +INSERT INTO employees VALUES + ( 101 + , 'Neena' + , 'Kochhar' + , 'NKOCHHAR' + , '515.123.4568' + , TO_DATE('21-09-2005', 'dd-MM-yyyy') + , 'AD_VP' + , 17000 + , NULL + , 100 + , 90 + ); + +INSERT INTO employees VALUES + ( 102 + , 'Lex' + , 'De Haan' + , 'LDEHAAN' + , '515.123.4569' + , TO_DATE('13-01-2001', 'dd-MM-yyyy') + , 'AD_VP' + , 17000 + , NULL + , 100 + , 90 + ); + +INSERT INTO employees VALUES + ( 103 + , 'Alexander' + , 'Hunold' + , 'AHUNOLD' + , '590.423.4567' + , TO_DATE('03-01-2006', 'dd-MM-yyyy') + , 'IT_PROG' + , 9000 + , NULL + , 102 + , 60 + ); + +INSERT INTO employees VALUES + ( 104 + , 'Bruce' + , 'Ernst' + , 'BERNST' + , '590.423.4568' + , TO_DATE('21-05-2007', 'dd-MM-yyyy') + , 'IT_PROG' + , 6000 + , NULL + , 103 + , 60 + ); + +INSERT INTO employees VALUES + ( 105 + , 'David' + , 'Austin' + , 'DAUSTIN' + , '590.423.4569' + , TO_DATE('25-06-2005', 'dd-MM-yyyy') + , 'IT_PROG' + , 4800 + , NULL + , 103 + , 60 + ); + +INSERT INTO employees VALUES + ( 106 + , 'Valli' + , 'Pataballa' + , 'VPATABAL' + , '590.423.4560' + , TO_DATE('05-02-2006', 'dd-MM-yyyy') + , 'IT_PROG' + , 4800 + , NULL + , 103 + , 60 + ); + +INSERT INTO employees VALUES + ( 107 + , 'Diana' + , 'Lorentz' + , 'DLORENTZ' + , '590.423.5567' + , TO_DATE('07-02-2007', 'dd-MM-yyyy') + , 'IT_PROG' + , 4200 + , NULL + , 103 + , 60 + ); + +INSERT INTO employees VALUES + ( 108 + , 'Nancy' + , 'Greenberg' + , 'NGREENBE' + , '515.124.4569' + , TO_DATE('17-08-2002', 'dd-MM-yyyy') + , 'FI_MGR' + , 12008 + , NULL + , 101 + , 100 + ); + +INSERT INTO employees VALUES + ( 109 + , 'Daniel' + , 'Faviet' + , 'DFAVIET' + , '515.124.4169' + , TO_DATE('16-08-2002', 'dd-MM-yyyy') + , 'FI_ACCOUNT' + , 9000 + , NULL + , 108 + , 100 + ); + +INSERT INTO employees VALUES + ( 110 + , 'John' + , 'Chen' + , 'JCHEN' + , '515.124.4269' + , TO_DATE('28-09-2005', 'dd-MM-yyyy') + , 'FI_ACCOUNT' + , 8200 + , NULL + , 108 + , 100 + ); + +INSERT INTO employees VALUES + ( 111 + , 'Ismael' + , 'Sciarra' + , 'ISCIARRA' + , '515.124.4369' + , TO_DATE('30-09-2005', 'dd-MM-yyyy') + , 'FI_ACCOUNT' + , 7700 + , NULL + , 108 + , 100 + ); + +INSERT INTO employees VALUES + ( 112 + , 'Jose Manuel' + , 'Urman' + , 'JMURMAN' + , '515.124.4469' + , TO_DATE('07-03-2006', 'dd-MM-yyyy') + , 'FI_ACCOUNT' + , 7800 + , NULL + , 108 + , 100 + ); + +INSERT INTO employees VALUES + ( 113 + , 'Luis' + , 'Popp' + , 'LPOPP' + , '515.124.4567' + , TO_DATE('07-12-2007', 'dd-MM-yyyy') + , 'FI_ACCOUNT' + , 6900 + , NULL + , 108 + , 100 + ); + +INSERT INTO employees VALUES + ( 114 + , 'Den' + , 'Raphaely' + , 'DRAPHEAL' + , '515.127.4561' + , TO_DATE('07-12-2002', 'dd-MM-yyyy') + , 'PU_MAN' + , 11000 + , NULL + , 100 + , 30 + ); + +INSERT INTO employees VALUES + ( 115 + , 'Alexander' + , 'Khoo' + , 'AKHOO' + , '515.127.4562' + , TO_DATE('18-05-2003', 'dd-MM-yyyy') + , 'PU_CLERK' + , 3100 + , NULL + , 114 + , 30 + ); + +INSERT INTO employees VALUES + ( 116 + , 'Shelli' + , 'Baida' + , 'SBAIDA' + , '515.127.4563' + , TO_DATE('24-12-2005', 'dd-MM-yyyy') + , 'PU_CLERK' + , 2900 + , NULL + , 114 + , 30 + ); + +INSERT INTO employees VALUES + ( 117 + , 'Sigal' + , 'Tobias' + , 'STOBIAS' + , '515.127.4564' + , TO_DATE('24-07-2005', 'dd-MM-yyyy') + , 'PU_CLERK' + , 2800 + , NULL + , 114 + , 30 + ); + +INSERT INTO employees VALUES + ( 118 + , 'Guy' + , 'Himuro' + , 'GHIMURO' + , '515.127.4565' + , TO_DATE('15-11-2006', 'dd-MM-yyyy') + , 'PU_CLERK' + , 2600 + , NULL + , 114 + , 30 + ); + +INSERT INTO employees VALUES + ( 119 + , 'Karen' + , 'Colmenares' + , 'KCOLMENA' + , '515.127.4566' + , TO_DATE('10-08-2007', 'dd-MM-yyyy') + , 'PU_CLERK' + , 2500 + , NULL + , 114 + , 30 + ); + +INSERT INTO employees VALUES + ( 120 + , 'Matthew' + , 'Weiss' + , 'MWEISS' + , '650.123.1234' + , TO_DATE('18-07-2004', 'dd-MM-yyyy') + , 'ST_MAN' + , 8000 + , NULL + , 100 + , 50 + ); + +INSERT INTO employees VALUES + ( 121 + , 'Adam' + , 'Fripp' + , 'AFRIPP' + , '650.123.2234' + , TO_DATE('10-04-2005', 'dd-MM-yyyy') + , 'ST_MAN' + , 8200 + , NULL + , 100 + , 50 + ); + +INSERT INTO employees VALUES + ( 122 + , 'Payam' + , 'Kaufling' + , 'PKAUFLIN' + , '650.123.3234' + , TO_DATE('01-05-2003', 'dd-MM-yyyy') + , 'ST_MAN' + , 7900 + , NULL + , 100 + , 50 + ); + +INSERT INTO employees VALUES + ( 123 + , 'Shanta' + , 'Vollman' + , 'SVOLLMAN' + , '650.123.4234' + , TO_DATE('10-10-2005', 'dd-MM-yyyy') + , 'ST_MAN' + , 6500 + , NULL + , 100 + , 50 + ); + +INSERT INTO employees VALUES + ( 124 + , 'Kevin' + , 'Mourgos' + , 'KMOURGOS' + , '650.123.5234' + , TO_DATE('16-11-2007', 'dd-MM-yyyy') + , 'ST_MAN' + , 5800 + , NULL + , 100 + , 50 + ); + +INSERT INTO employees VALUES + ( 125 + , 'Julia' + , 'Nayer' + , 'JNAYER' + , '650.124.1214' + , TO_DATE('16-07-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3200 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 126 + , 'Irene' + , 'Mikkilineni' + , 'IMIKKILI' + , '650.124.1224' + , TO_DATE('28-09-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2700 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 127 + , 'James' + , 'Landry' + , 'JLANDRY' + , '650.124.1334' + , TO_DATE('14-01-2007', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2400 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 128 + , 'Steven' + , 'Markle' + , 'SMARKLE' + , '650.124.1434' + , TO_DATE('08-03-2008', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2200 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 129 + , 'Laura' + , 'Bissot' + , 'LBISSOT' + , '650.124.5234' + , TO_DATE('20-08-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3300 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 130 + , 'Mozhe' + , 'Atkinson' + , 'MATKINSO' + , '650.124.6234' + , TO_DATE('30-10-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2800 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 131 + , 'James' + , 'Marlow' + , 'JAMRLOW' + , '650.124.7234' + , TO_DATE('16-02-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2500 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 132 + , 'TJ' + , 'Olson' + , 'TJOLSON' + , '650.124.8234' + , TO_DATE('10-04-2007', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2100 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 133 + , 'Jason' + , 'Mallin' + , 'JMALLIN' + , '650.127.1934' + , TO_DATE('14-06-2004', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3300 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 134 + , 'Michael' + , 'Rogers' + , 'MROGERS' + , '650.127.1834' + , TO_DATE('26-08-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2900 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 135 + , 'Ki' + , 'Gee' + , 'KGEE' + , '650.127.1734' + , TO_DATE('12-12-2007', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2400 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 136 + , 'Hazel' + , 'Philtanker' + , 'HPHILTAN' + , '650.127.1634' + , TO_DATE('06-02-2008', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2200 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 137 + , 'Renske' + , 'Ladwig' + , 'RLADWIG' + , '650.121.1234' + , TO_DATE('14-07-2003', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3600 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 138 + , 'Stephen' + , 'Stiles' + , 'SSTILES' + , '650.121.2034' + , TO_DATE('26-10-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3200 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 139 + , 'John' + , 'Seo' + , 'JSEO' + , '650.121.2019' + , TO_DATE('12-02-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2700 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 140 + , 'Joshua' + , 'Patel' + , 'JPATEL' + , '650.121.1834' + , TO_DATE('06-04-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2500 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 141 + , 'Trenna' + , 'Rajs' + , 'TRAJS' + , '650.121.8009' + , TO_DATE('17-10-2003', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3500 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 142 + , 'Curtis' + , 'Davies' + , 'CDAVIES' + , '650.121.2994' + , TO_DATE('29-01-2005', 'dd-MM-yyyy') + , 'ST_CLERK' + , 3100 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 143 + , 'Randall' + , 'Matos' + , 'RMATOS' + , '650.121.2874' + , TO_DATE('15-03-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2600 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 144 + , 'Peter' + , 'Vargas' + , 'PVARGAS' + , '650.121.2004' + , TO_DATE('09-07-2006', 'dd-MM-yyyy') + , 'ST_CLERK' + , 2500 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 145 + , 'John' + , 'Russell' + , 'JRUSSEL' + , '011.44.1344.429268' + , TO_DATE('01-10-2004', 'dd-MM-yyyy') + , 'SA_MAN' + , 14000 + , .4 + , 100 + , 80 + ); + +INSERT INTO employees VALUES + ( 146 + , 'Karen' + , 'Partners' + , 'KPARTNER' + , '011.44.1344.467268' + , TO_DATE('05-01-2005', 'dd-MM-yyyy') + , 'SA_MAN' + , 13500 + , .3 + , 100 + , 80 + ); + +INSERT INTO employees VALUES + ( 147 + , 'Alberto' + , 'Errazuriz' + , 'AERRAZUR' + , '011.44.1344.429278' + , TO_DATE('10-03-2005', 'dd-MM-yyyy') + , 'SA_MAN' + , 12000 + , .3 + , 100 + , 80 + ); + +INSERT INTO employees VALUES + ( 148 + , 'Gerald' + , 'Cambrault' + , 'GCAMBRAU' + , '011.44.1344.619268' + , TO_DATE('15-10-2007', 'dd-MM-yyyy') + , 'SA_MAN' + , 11000 + , .3 + , 100 + , 80 + ); + +INSERT INTO employees VALUES + ( 149 + , 'Eleni' + , 'Zlotkey' + , 'EZLOTKEY' + , '011.44.1344.429018' + , TO_DATE('29-01-2008', 'dd-MM-yyyy') + , 'SA_MAN' + , 10500 + , .2 + , 100 + , 80 + ); + +INSERT INTO employees VALUES + ( 150 + , 'Peter' + , 'Tucker' + , 'PTUCKER' + , '011.44.1344.129268' + , TO_DATE('30-01-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 10000 + , .3 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 151 + , 'David' + , 'Bernstein' + , 'DBERNSTE' + , '011.44.1344.345268' + , TO_DATE('24-03-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 9500 + , .25 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 152 + , 'Peter' + , 'Hall' + , 'PHALL' + , '011.44.1344.478968' + , TO_DATE('20-08-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 9000 + , .25 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 153 + , 'Christopher' + , 'Olsen' + , 'COLSEN' + , '011.44.1344.498718' + , TO_DATE('30-03-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 8000 + , .2 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 154 + , 'Nanette' + , 'Cambrault' + , 'NCAMBRAU' + , '011.44.1344.987668' + , TO_DATE('09-12-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 7500 + , .2 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 155 + , 'Oliver' + , 'Tuvault' + , 'OTUVAULT' + , '011.44.1344.486508' + , TO_DATE('23-11-2007', 'dd-MM-yyyy') + , 'SA_REP' + , 7000 + , .15 + , 145 + , 80 + ); + +INSERT INTO employees VALUES + ( 156 + , 'Janette' + , 'King' + , 'JKING' + , '011.44.1345.429268' + , TO_DATE('30-01-2004', 'dd-MM-yyyy') + , 'SA_REP' + , 10000 + , .35 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 157 + , 'Patrick' + , 'Sully' + , 'PSULLY' + , '011.44.1345.929268' + , TO_DATE('04-03-2004', 'dd-MM-yyyy') + , 'SA_REP' + , 9500 + , .35 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 158 + , 'Allan' + , 'McEwen' + , 'AMCEWEN' + , '011.44.1345.829268' + , TO_DATE('01-08-2004', 'dd-MM-yyyy') + , 'SA_REP' + , 9000 + , .35 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 159 + , 'Lindsey' + , 'Smith' + , 'LSMITH' + , '011.44.1345.729268' + , TO_DATE('10-03-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 8000 + , .3 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 160 + , 'Louise' + , 'Doran' + , 'LDORAN' + , '011.44.1345.629268' + , TO_DATE('15-12-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 7500 + , .3 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 161 + , 'Sarath' + , 'Sewall' + , 'SSEWALL' + , '011.44.1345.529268' + , TO_DATE('03-11-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 7000 + , .25 + , 146 + , 80 + ); + +INSERT INTO employees VALUES + ( 162 + , 'Clara' + , 'Vishney' + , 'CVISHNEY' + , '011.44.1346.129268' + , TO_DATE('11-11-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 10500 + , .25 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 163 + , 'Danielle' + , 'Greene' + , 'DGREENE' + , '011.44.1346.229268' + , TO_DATE('19-03-2007', 'dd-MM-yyyy') + , 'SA_REP' + , 9500 + , .15 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 164 + , 'Mattea' + , 'Marvins' + , 'MMARVINS' + , '011.44.1346.329268' + , TO_DATE('24-01-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 7200 + , .10 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 165 + , 'David' + , 'Lee' + , 'DLEE' + , '011.44.1346.529268' + , TO_DATE('23-02-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 6800 + , .1 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 166 + , 'Sundar' + , 'Ande' + , 'SANDE' + , '011.44.1346.629268' + , TO_DATE('24-03-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 6400 + , .10 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 167 + , 'Amit' + , 'Banda' + , 'ABANDA' + , '011.44.1346.729268' + , TO_DATE('21-04-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 6200 + , .10 + , 147 + , 80 + ); + +INSERT INTO employees VALUES + ( 168 + , 'Lisa' + , 'Ozer' + , 'LOZER' + , '011.44.1343.929268' + , TO_DATE('11-03-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 11500 + , .25 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 169 + , 'Harrison' + , 'Bloom' + , 'HBLOOM' + , '011.44.1343.829268' + , TO_DATE('23-03-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 10000 + , .20 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 170 + , 'Tayler' + , 'Fox' + , 'TFOX' + , '011.44.1343.729268' + , TO_DATE('24-01-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 9600 + , .20 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 171 + , 'William' + , 'Smith' + , 'WSMITH' + , '011.44.1343.629268' + , TO_DATE('23-02-2007', 'dd-MM-yyyy') + , 'SA_REP' + , 7400 + , .15 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 172 + , 'Elizabeth' + , 'Bates' + , 'EBATES' + , '011.44.1343.529268' + , TO_DATE('24-03-2007', 'dd-MM-yyyy') + , 'SA_REP' + , 7300 + , .15 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 173 + , 'Sundita' + , 'Kumar' + , 'SKUMAR' + , '011.44.1343.329268' + , TO_DATE('21-04-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 6100 + , .10 + , 148 + , 80 + ); + +INSERT INTO employees VALUES + ( 174 + , 'Ellen' + , 'Abel' + , 'EABEL' + , '011.44.1644.429267' + , TO_DATE('11-05-2004', 'dd-MM-yyyy') + , 'SA_REP' + , 11000 + , .30 + , 149 + , 80 + ); + +INSERT INTO employees VALUES + ( 175 + , 'Alyssa' + , 'Hutton' + , 'AHUTTON' + , '011.44.1644.429266' + , TO_DATE('19-03-2005', 'dd-MM-yyyy') + , 'SA_REP' + , 8800 + , .25 + , 149 + , 80 + ); + +INSERT INTO employees VALUES + ( 176 + , 'Jonathon' + , 'Taylor' + , 'JTAYLOR' + , '011.44.1644.429265' + , TO_DATE('24-03-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 8600 + , .20 + , 149 + , 80 + ); + +INSERT INTO employees VALUES + ( 177 + , 'Jack' + , 'Livingston' + , 'JLIVINGS' + , '011.44.1644.429264' + , TO_DATE('23-04-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 8400 + , .20 + , 149 + , 80 + ); + +INSERT INTO employees VALUES + ( 178 + , 'Kimberely' + , 'Grant' + , 'KGRANT' + , '011.44.1644.429263' + , TO_DATE('24-05-2007', 'dd-MM-yyyy') + , 'SA_REP' + , 7000 + , .15 + , 149 + , NULL + ); + +INSERT INTO employees VALUES + ( 179 + , 'Charles' + , 'Johnson' + , 'CJOHNSON' + , '011.44.1644.429262' + , TO_DATE('04-01-2008', 'dd-MM-yyyy') + , 'SA_REP' + , 6200 + , .10 + , 149 + , 80 + ); + +INSERT INTO employees VALUES + ( 180 + , 'Winston' + , 'Taylor' + , 'WTAYLOR' + , '650.507.9876' + , TO_DATE('24-01-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3200 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 181 + , 'Jean' + , 'Fleaur' + , 'JFLEAUR' + , '650.507.9877' + , TO_DATE('23-02-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3100 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 182 + , 'Martha' + , 'Sullivan' + , 'MSULLIVA' + , '650.507.9878' + , TO_DATE('21-06-2007', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2500 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 183 + , 'Girard' + , 'Geoni' + , 'GGEONI' + , '650.507.9879' + , TO_DATE('03-02-2008', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2800 + , NULL + , 120 + , 50 + ); + +INSERT INTO employees VALUES + ( 184 + , 'Nandita' + , 'Sarchand' + , 'NSARCHAN' + , '650.509.1876' + , TO_DATE('27-01-2004', 'dd-MM-yyyy') + , 'SH_CLERK' + , 4200 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 185 + , 'Alexis' + , 'Bull' + , 'ABULL' + , '650.509.2876' + , TO_DATE('20-02-2005', 'dd-MM-yyyy') + , 'SH_CLERK' + , 4100 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 186 + , 'Julia' + , 'Dellinger' + , 'JDELLING' + , '650.509.3876' + , TO_DATE('24-06-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3400 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 187 + , 'Anthony' + , 'Cabrio' + , 'ACABRIO' + , '650.509.4876' + , TO_DATE('07-02-2007', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3000 + , NULL + , 121 + , 50 + ); + +INSERT INTO employees VALUES + ( 188 + , 'Kelly' + , 'Chung' + , 'KCHUNG' + , '650.505.1876' + , TO_DATE('14-06-2005', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3800 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 189 + , 'Jennifer' + , 'Dilly' + , 'JDILLY' + , '650.505.2876' + , TO_DATE('13-08-2005', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3600 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 190 + , 'Timothy' + , 'Gates' + , 'TGATES' + , '650.505.3876' + , TO_DATE('11-07-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2900 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 191 + , 'Randall' + , 'Perkins' + , 'RPERKINS' + , '650.505.4876' + , TO_DATE('19-12-2007', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2500 + , NULL + , 122 + , 50 + ); + +INSERT INTO employees VALUES + ( 192 + , 'Sarah' + , 'Bell' + , 'SBELL' + , '650.501.1876' + , TO_DATE('04-02-2004', 'dd-MM-yyyy') + , 'SH_CLERK' + , 4000 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 193 + , 'Britney' + , 'Everett' + , 'BEVERETT' + , '650.501.2876' + , TO_DATE('03-03-2005', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3900 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 194 + , 'Samuel' + , 'McCain' + , 'SMCCAIN' + , '650.501.3876' + , TO_DATE('01-07-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3200 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 195 + , 'Vance' + , 'Jones' + , 'VJONES' + , '650.501.4876' + , TO_DATE('17-03-2007', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2800 + , NULL + , 123 + , 50 + ); + +INSERT INTO employees VALUES + ( 196 + , 'Alana' + , 'Walsh' + , 'AWALSH' + , '650.507.9811' + , TO_DATE('24-04-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3100 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 197 + , 'Kevin' + , 'Feeney' + , 'KFEENEY' + , '650.507.9822' + , TO_DATE('23-05-2006', 'dd-MM-yyyy') + , 'SH_CLERK' + , 3000 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 198 + , 'Donald' + , 'OConnell' + , 'DOCONNEL' + , '650.507.9833' + , TO_DATE('21-06-2007', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2600 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 199 + , 'Douglas' + , 'Grant' + , 'DGRANT' + , '650.507.9844' + , TO_DATE('13-01-2008', 'dd-MM-yyyy') + , 'SH_CLERK' + , 2600 + , NULL + , 124 + , 50 + ); + +INSERT INTO employees VALUES + ( 200 + , 'Jennifer' + , 'Whalen' + , 'JWHALEN' + , '515.123.4444' + , TO_DATE('17-09-2003', 'dd-MM-yyyy') + , 'AD_ASST' + , 4400 + , NULL + , 101 + , 10 + ); + +INSERT INTO employees VALUES + ( 201 + , 'Michael' + , 'Hartstein' + , 'MHARTSTE' + , '515.123.5555' + , TO_DATE('17-02-2004', 'dd-MM-yyyy') + , 'MK_MAN' + , 13000 + , NULL + , 100 + , 20 + ); + +INSERT INTO employees VALUES + ( 202 + , 'Pat' + , 'Fay' + , 'PFAY' + , '603.123.6666' + , TO_DATE('17-08-2005', 'dd-MM-yyyy') + , 'MK_REP' + , 6000 + , NULL + , 201 + , 20 + ); + +INSERT INTO employees VALUES + ( 203 + , 'Susan' + , 'Mavris' + , 'SMAVRIS' + , '515.123.7777' + , TO_DATE('07-06-2002', 'dd-MM-yyyy') + , 'HR_REP' + , 6500 + , NULL + , 101 + , 40 + ); + +INSERT INTO employees VALUES + ( 204 + , 'Hermann' + , 'Baer' + , 'HBAER' + , '515.123.8888' + , TO_DATE('07-06-2002', 'dd-MM-yyyy') + , 'PR_REP' + , 10000 + , NULL + , 101 + , 70 + ); + +INSERT INTO employees VALUES + ( 205 + , 'Shelley' + , 'Higgins' + , 'SHIGGINS' + , '515.123.8080' + , TO_DATE('07-06-2002', 'dd-MM-yyyy') + , 'AC_MGR' + , 12008 + , NULL + , 101 + , 110 + ); + +INSERT INTO employees VALUES + ( 206 + , 'William' + , 'Gietz' + , 'WGIETZ' + , '515.123.8181' + , TO_DATE('07-06-2002', 'dd-MM-yyyy') + , 'AC_ACCOUNT' + , 8300 + , NULL + , 205 + , 110 + ); + +REM ********* insert data into the JOB_HISTORY table + +Prompt ****** Populating JOB_HISTORY table .... + + +INSERT INTO job_history +VALUES (102 + , TO_DATE('13-01-2001', 'dd-MM-yyyy') + , TO_DATE('24-07-2006', 'dd-MM-yyyy') + , 'IT_PROG' + , 60); + +INSERT INTO job_history +VALUES (101 + , TO_DATE('21-09-1997', 'dd-MM-yyyy') + , TO_DATE('27-10-2001', 'dd-MM-yyyy') + , 'AC_ACCOUNT' + , 110); + +INSERT INTO job_history +VALUES (101 + , TO_DATE('28-10-2001', 'dd-MM-yyyy') + , TO_DATE('15-03-2005', 'dd-MM-yyyy') + , 'AC_MGR' + , 110); + +INSERT INTO job_history +VALUES (201 + , TO_DATE('17-02-2004', 'dd-MM-yyyy') + , TO_DATE('19-12-2007', 'dd-MM-yyyy') + , 'MK_REP' + , 20); + +INSERT INTO job_history +VALUES (114 + , TO_DATE('24-03-2006', 'dd-MM-yyyy') + , TO_DATE('31-12-2007', 'dd-MM-yyyy') + , 'ST_CLERK' + , 50 + ); + +INSERT INTO job_history +VALUES (122 + , TO_DATE('01-01-2007', 'dd-MM-yyyy') + , TO_DATE('31-12-2007', 'dd-MM-yyyy') + , 'ST_CLERK' + , 50 + ); + +INSERT INTO job_history +VALUES (200 + , TO_DATE('17-09-1995', 'dd-MM-yyyy') + , TO_DATE('17-06-2001', 'dd-MM-yyyy') + , 'AD_ASST' + , 90 + ); + +INSERT INTO job_history +VALUES (176 + , TO_DATE('24-03-2006', 'dd-MM-yyyy') + , TO_DATE('31-12-2006', 'dd-MM-yyyy') + , 'SA_REP' + , 80 + ); + +INSERT INTO job_history +VALUES (176 + , TO_DATE('01-01-2007', 'dd-MM-yyyy') + , TO_DATE('31-12-2007', 'dd-MM-yyyy') + , 'SA_MAN' + , 80 + ); + +INSERT INTO job_history +VALUES (200 + , TO_DATE('01-07-2002', 'dd-MM-yyyy') + , TO_DATE('31-12-2006', 'dd-MM-yyyy') + , 'AC_ACCOUNT' + , 90 + ); + +REM enable integrity constraint to DEPARTMENTS + +ALTER TABLE departments + ENABLE CONSTRAINT dept_mgr_fk; + +COMMIT; + +Rem +Rem $Header: hr_idx.sql 29-aug-2002.11:44:09 hyeh Exp $ +Rem +Rem hr_idx.sql +Rem +Rem Copyright (c) 2001, 2015, Oracle Corporation. All rights reserved. +Rem +Rem Permission is hereby granted, free of charge, to any person obtaining +Rem a copy of this software and associated documentation files (the +Rem "Software"), to deal in the Software without restriction, including +Rem without limitation the rights to use, copy, modify, merge, publish, +Rem distribute, sublicense, and/or sell copies of the Software, and to +Rem permit persons to whom the Software is furnished to do so, subject to +Rem the following conditions: +Rem +Rem The above copyright notice and this permission notice shall be +Rem included in all copies or substantial portions of the Software. +Rem +Rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +Rem EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +Rem MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +Rem NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +Rem LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +Rem OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +Rem WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Rem +Rem NAME +Rem hr_idx.sql - Create indexes for HR schema +Rem +Rem DESCRIPTION +Rem +Rem +Rem NOTES +Rem +Rem +Rem CREATED by Nancy Greenberg - 06/01/00 +Rem MODIFIED (MM/DD/YY) +Rem hyeh 08/29/02 - hyeh_mv_comschema_to_rdbms +Rem ahunold 02/20/01 - New header +Rem vpatabal 03/02/01 - Removed DROP INDEX statements + +SET FEEDBACK 1 +SET NUMWIDTH 10 +SET LINESIZE 80 +SET TRIMSPOOL ON +SET TAB OFF +SET PAGESIZE 100 +SET ECHO OFF + +CREATE INDEX emp_department_ix + ON employees (department_id); + +CREATE INDEX emp_job_ix + ON employees (job_id); + +CREATE INDEX emp_manager_ix + ON employees (manager_id); + +CREATE INDEX emp_name_ix + ON employees (last_name, first_name); + +CREATE INDEX dept_location_ix + ON departments (location_id); + +CREATE INDEX jhist_job_ix + ON job_history (job_id); + +CREATE INDEX jhist_employee_ix + ON job_history (employee_id); + +CREATE INDEX jhist_department_ix + ON job_history (department_id); + +CREATE INDEX loc_city_ix + ON locations (city); + +CREATE INDEX loc_state_province_ix + ON locations (state_province); + +CREATE INDEX loc_country_ix + ON locations (country_id); + +COMMIT; + +Rem +Rem $Header: hr_code.sql 29-aug-2002.11:44:01 hyeh Exp $ +Rem +Rem hr_code.sql +Rem +Rem Copyright (c) 2001, 2015, Oracle Corporation. All rights reserved. +Rem +Rem Permission is hereby granted, free of charge, to any person obtaining +Rem a copy of this software and associated documentation files (the +Rem "Software"), to deal in the Software without restriction, including +Rem without limitation the rights to use, copy, modify, merge, publish, +Rem distribute, sublicense, and/or sell copies of the Software, and to +Rem permit persons to whom the Software is furnished to do so, subject to +Rem the following conditions: +Rem +Rem The above copyright notice and this permission notice shall be +Rem included in all copies or substantial portions of the Software. +Rem +Rem THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +Rem EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +Rem MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +Rem NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +Rem LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +Rem OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +Rem WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Rem +Rem NAME +Rem hr_code.sql - Create procedural objects for HR schema +Rem +Rem DESCRIPTION +Rem Create a statement level trigger on EMPLOYEES +Rem to allow DML during business hours. +Rem Create a row level trigger on the EMPLOYEES table, +Rem after UPDATES on the department_id or job_id columns. +Rem Create a stored procedure to insert a row into the +Rem JOB_HISTORY table. Have the above row level trigger +Rem row level trigger call this stored procedure. +Rem +Rem NOTES +Rem +Rem CREATED by Nancy Greenberg - 06/01/00 +Rem +Rem MODIFIED (MM/DD/YY) +Rem hyeh 08/29/02 - hyeh_mv_comschema_to_rdbms +Rem ahunold 05/11/01 - disable +Rem ahunold 03/03/01 - HR simplification, REGIONS table +Rem ahunold 02/20/01 - Created +Rem + +SET FEEDBACK 1 +SET NUMWIDTH 10 +SET LINESIZE 80 +SET TRIMSPOOL ON +SET TAB OFF +SET PAGESIZE 100 +SET ECHO OFF + +REM ************************************************************************** + +REM procedure and statement trigger to allow dmls during business hours: +CREATE OR REPLACE PROCEDURE secure_dml +IS +BEGIN + IF TO_CHAR (SYSDATE, 'HH24:MI') NOT BETWEEN '08:00' AND '18:00' + OR TO_CHAR (SYSDATE, 'DY') IN ('SAT', 'SUN') THEN + RAISE_APPLICATION_ERROR (-20205, + 'You may only make changes during normal office hours'); + END IF; +END secure_dml; +/ + +CREATE OR REPLACE TRIGGER secure_employees + BEFORE INSERT OR UPDATE OR DELETE ON employees +BEGIN + secure_dml; +END secure_employees; +/ + +ALTER TRIGGER secure_employees DISABLE; + +REM ************************************************************************** +REM procedure to add a row to the JOB_HISTORY table and row trigger +REM to call the procedure when data is updated in the job_id or +REM department_id columns in the EMPLOYEES table: + +CREATE OR REPLACE PROCEDURE add_job_history + ( p_emp_id job_history.employee_id%type + , p_start_date job_history.start_date%type + , p_end_date job_history.end_date%type + , p_job_id job_history.job_id%type + , p_department_id job_history.department_id%type + ) +IS +BEGIN + INSERT INTO job_history (employee_id, start_date, end_date, + job_id, department_id) + VALUES(p_emp_id, p_start_date, p_end_date, p_job_id, p_department_id); +END add_job_history; +/ + +CREATE OR REPLACE TRIGGER update_job_history + AFTER UPDATE OF job_id, department_id ON employees + FOR EACH ROW +BEGIN + add_job_history(:old.employee_id, :old.hire_date, sysdate, + :old.job_id, :old.department_id); +END; +/ + +COMMIT; +/ + + From 6ddc7d3420a956fff8e9097a0783fbc8a45c8e6b Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Tue, 3 Mar 2020 12:59:46 -0800 Subject: [PATCH 04/76] Create adb-odp-efcore.cs --- .../ef-core/autonomous-db/adb-odp-efcore.cs | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs diff --git a/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs new file mode 100644 index 00000000..a3c2a145 --- /dev/null +++ b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs @@ -0,0 +1,83 @@ + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ + +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; + +// ODP.NET namespace added to access OracleConfiguration class +using Oracle.ManagedDataAccess.Client; + +namespace OracleEFCore_ADB +{ + // This sample code demonstrates using ODP.NET EF Core with an Oracle Autonomous Database + class Program + { + public class BloggingContext : DbContext + { + public DbSet Blogs { get; set; } + public DbSet Posts { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // Set TnsAdmin value to directory location of tnsnames.ora and sqlnet.ora files + OracleConfiguration.TnsAdmin = @""; + + // Set WalletLocation value to directory location of the ADB wallet (i.e. cwallet.sso) + OracleConfiguration.WalletLocation = @""; + + // Configure ODP.NET connection string + optionsBuilder.UseOracle(@"User Id=;Password=;Data Source=") ; + } + } + + public class Blog + { + public int BlogId { get; set; } + public string Url { get; set; } + public List Posts { get; set; } + } + + public class Post + { + public int PostId { get; set; } + public string Title { get; set; } + public string Content { get; set; } + + public int BlogId { get; set; } + public Blog Blog { get; set; } + } + + static void Main(string[] args) + { + + using (var db = new BloggingContext()) + { + var blog = new Blog { Url = "https://blogs.oracle.com" }; + db.Blogs.Add(blog); + db.SaveChanges(); + } + + using (var db = new BloggingContext()) + { + var blogs = db.Blogs; + } + } + } +} From 21f2d7ecf2026554249d98e207e395ac0d02d674 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Tue, 3 Mar 2020 13:00:15 -0800 Subject: [PATCH 05/76] Update adb-odp-efcore.cs --- samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs index a3c2a145..83c312b2 100644 --- a/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs +++ b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs @@ -1,4 +1,3 @@ - /* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ /****************************************************************************** From b647c5f3aaec07466109c4cbabeb01a06e23f912 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Tue, 3 Mar 2020 13:06:19 -0800 Subject: [PATCH 06/76] Create README.md --- samples/dotnet-core/ef-core/autonomous-db/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 samples/dotnet-core/ef-core/autonomous-db/README.md diff --git a/samples/dotnet-core/ef-core/autonomous-db/README.md b/samples/dotnet-core/ef-core/autonomous-db/README.md new file mode 100644 index 00000000..fd122fa1 --- /dev/null +++ b/samples/dotnet-core/ef-core/autonomous-db/README.md @@ -0,0 +1,7 @@ +This sample code demonstrates using ODP.NET Entity Framework Core with an Oracle Autonomous Database (ADB). It builds off [this introductory sample](https://github.com/oracle/dotnet-db-samples/blob/master/samples/dotnet-core/ef-core/get-started/) for Oracle EF Core beginners. In this sample, ADB connection setup occurs in the OnConfiguring method. + +1. Set the OracleConfiguration.TnsAdmin property value to the tnsnames.ora and sqlnet.ora files directory location. + +2. Set the OracleConfiguration.WalletLocation property value to the ADB wallet directory location. Most Oracle Autonomous Databases require TCP with SSL (TCPS) connections for security purposes. ODP.NET uses the Oracle wallet, which stores the security credentials, to connect. + +3. Set the connection string with the user id, password, and data source. The data source is commonly populated with the ADB TNS name value. From a1162c8615e628aee946a1dbd24430dd6b7e29e6 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 8 May 2020 20:09:17 -0700 Subject: [PATCH 07/76] Create README.md --- samples/autonomous-db/managed-odp/web-app/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 samples/autonomous-db/managed-odp/web-app/README.md diff --git a/samples/autonomous-db/managed-odp/web-app/README.md b/samples/autonomous-db/managed-odp/web-app/README.md new file mode 100644 index 00000000..8fe14dd0 --- /dev/null +++ b/samples/autonomous-db/managed-odp/web-app/README.md @@ -0,0 +1,7 @@ +To use the ASP.NET web sample code: +1. Create an empty ASP.NET Web Application (.NET Framework) in Visual Studio. +2. Add managed ODP.NET (Oracle.ManagedDataAccess) to your project from NuGet Gallery. +3. Save the files in this Github directory to your local project directory. +4. Add the files to your web project as existing items. +5. Modify the User Id, Password, and Data Source as necessary to connect to your Autonomous Database instance. +6. Run the app. From 1a714b30b3df779c8faccbff67aaefc61395719f Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 29 May 2020 11:53:24 -0700 Subject: [PATCH 08/76] Updated with .NET Core 3.x extension method --- .../ef-core/stored-procedure/return-ref-cursor.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/samples/dotnet-core/ef-core/stored-procedure/return-ref-cursor.cs b/samples/dotnet-core/ef-core/stored-procedure/return-ref-cursor.cs index 17ac8e4e..e1abb9c3 100644 --- a/samples/dotnet-core/ef-core/stored-procedure/return-ref-cursor.cs +++ b/samples/dotnet-core/ef-core/stored-procedure/return-ref-cursor.cs @@ -1,4 +1,4 @@ -/* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. */ +/* Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved. */ /****************************************************************************** * @@ -77,8 +77,10 @@ static void Main(string[] args) using (var db = new BloggingContext()) { // Use anonymous PL/SQL to call stored procedure and return result set + // Comment and uncomment the FromSql* extension method depending on the .NET Core version used var blogs = db.Blogs - .FromSql("BEGIN GETALLBLOGS_IMPLICIT(); END;") + .FromSqlRaw("BEGIN GETALLBLOGS_IMPLICIT(); END;") // .NET Core 3.x syntax + //.FromSql("BEGIN GETALLBLOGS_IMPLICIT(); END;") // .NET Core 2.x syntax .ToList() .OrderBy(Blog => Blog.BlogId); } @@ -90,8 +92,10 @@ static void Main(string[] args) var allblogs = new OracleParameter("blogparam", OracleDbType.RefCursor, ParameterDirection.Output); // Use anonymous PL/SQL to call stored procedure, bind output parameter, and return result set + // Comment and uncomment the FromSql* extension method depending on the .NET Core version used var blogs = db.Blogs - .FromSql("BEGIN GETALLBLOGS(:blogparam); END;", new object[] { allblogs }) + .FromSqlRaw("BEGIN GETALLBLOGS(:blogparam); END;", new object[] { allblogs }) // .NET Core 3.x syntax + //.FromSql("BEGIN GETALLBLOGS(:blogparam); END;", new object[] { allblogs }) // .NET Core 2.x syntax .ToList() .OrderBy(Blog => Blog.BlogId); } From f587ed7e3c165da2ccc1ace5e88abc2f5761a776 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 29 May 2020 15:02:38 -0700 Subject: [PATCH 09/76] Update README.md --- samples/dotnet-core/ef-core/dependency-injection/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/dotnet-core/ef-core/dependency-injection/README.md b/samples/dotnet-core/ef-core/dependency-injection/README.md index e0425eae..663e74c9 100644 --- a/samples/dotnet-core/ef-core/dependency-injection/README.md +++ b/samples/dotnet-core/ef-core/dependency-injection/README.md @@ -1,8 +1,8 @@ -This sample code demonstrates how to use dependency injection and ASP.NET Core with Oracle Entity Framework. +This sample code demonstrates how to use dependency injection and ASP.NET Core with Oracle Entity Framework Core 2.x. It does not support later EF Core versions. Before you run the application: -1. Add the Oracle.EntityFrameworkCore assembly from NuGet -2. Populate the Oracle User Id, Password, and Data Source information in the appsettings.json file +1. Add the Oracle.EntityFrameworkCore assembly from NuGet Gallery. +2. Populate the Oracle User Id, Password, and Data Source information in the appsettings.json file. 3. Use EF Core migrations to create the Blogs table and populate it with some data. When you then run this sample app, the web page will then return results. From bd15dfbe844dc01c179a767d837566306c6cde62 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Sat, 30 May 2020 06:24:30 -0700 Subject: [PATCH 10/76] Updated doc link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a62d4282..39577f58 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ For beginning Oracle .NET developers, these Documentation +
  • Documentation
  • Code samples are included with the ODAC Oracle Universal Installation. You will find them in the "ODACSamples" directory in the Oracle Client installation home (e.g. d:\app\client\<username>\product\<Oracle version>\client_1\ODACsamples).
  • Contibutions to code samples should review CONTRIBUTING for more details.
  • You may use files in this repository only if in compliance with the LICENSE.
  • From 966b7992d375534c382d4210bb277742ca94ca4e Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 1 Jun 2020 08:49:42 -0700 Subject: [PATCH 11/76] Moved TnsAdmin and WalletLocation to Main --- .../ef-core/autonomous-db/adb-odp-efcore.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs index 83c312b2..75dc0d15 100644 --- a/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs +++ b/samples/dotnet-core/ef-core/autonomous-db/adb-odp-efcore.cs @@ -25,7 +25,7 @@ namespace OracleEFCore_ADB { - // This sample code demonstrates using ODP.NET EF Core with an Oracle Autonomous Database + // This sample code demonstrates using ODP.NET EF Core with an Oracle Autonomous Database class Program { public class BloggingContext : DbContext @@ -35,14 +35,9 @@ public class BloggingContext : DbContext protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - // Set TnsAdmin value to directory location of tnsnames.ora and sqlnet.ora files - OracleConfiguration.TnsAdmin = @""; - - // Set WalletLocation value to directory location of the ADB wallet (i.e. cwallet.sso) - OracleConfiguration.WalletLocation = @""; // Configure ODP.NET connection string - optionsBuilder.UseOracle(@"User Id=;Password=;Data Source=") ; + optionsBuilder.UseOracle(@"User Id=;Password=;Data Source="); } } @@ -65,6 +60,11 @@ public class Post static void Main(string[] args) { + // Set TnsAdmin value to directory location of tnsnames.ora and sqlnet.ora files + OracleConfiguration.TnsAdmin = @""; + + // Set WalletLocation value to directory location of the ADB wallet (i.e. cwallet.sso) + OracleConfiguration.WalletLocation = @""; using (var db = new BloggingContext()) { From 4c77f9e597bc2c5b666f9d8cabd1569966d0d045 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 1 Jun 2020 08:56:34 -0700 Subject: [PATCH 12/76] Update README.md --- samples/dotnet-core/ef-core/autonomous-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dotnet-core/ef-core/autonomous-db/README.md b/samples/dotnet-core/ef-core/autonomous-db/README.md index fd122fa1..dac5bbef 100644 --- a/samples/dotnet-core/ef-core/autonomous-db/README.md +++ b/samples/dotnet-core/ef-core/autonomous-db/README.md @@ -1,4 +1,4 @@ -This sample code demonstrates using ODP.NET Entity Framework Core with an Oracle Autonomous Database (ADB). It builds off [this introductory sample](https://github.com/oracle/dotnet-db-samples/blob/master/samples/dotnet-core/ef-core/get-started/) for Oracle EF Core beginners. In this sample, ADB connection setup occurs in the OnConfiguring method. +This sample code demonstrates using ODP.NET Entity Framework Core with an Oracle Autonomous Database (ADB). It is compatible with EF Core 2.x and 3.x. It builds off [this introductory sample](https://github.com/oracle/dotnet-db-samples/blob/master/samples/dotnet-core/ef-core/get-started/) for Oracle EF Core beginners. In this sample, ADB connection setup occurs in the OnConfiguring method. 1. Set the OracleConfiguration.TnsAdmin property value to the tnsnames.ora and sqlnet.ora files directory location. From 4a83ef50aafd25ccfcad6873c35181188965ab5b Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 5 Jun 2020 11:01:47 -0700 Subject: [PATCH 13/76] Create keyless-entity-types-views.cs --- .../keyless-entity-types-views.cs | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs diff --git a/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs b/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs new file mode 100644 index 00000000..28ab8040 --- /dev/null +++ b/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs @@ -0,0 +1,162 @@ +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ +/* Copyright (c) .NET Foundation */ + +/****************************************************************************** + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.EntityFrameworkCore; + +namespace Oracle_KET_Views +{ + public class Program + { + private static void Main() + { + SetupDatabase(); + + using (var db = new BloggingContext()) + { + #region Query + var postCounts = db.BlogPostCounts.ToList(); + + foreach (var postCount in postCounts) + { + Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts."); + Console.WriteLine(); + } + #endregion + } + } + + private static void SetupDatabase() + { + using (var db = new BloggingContext()) + { + if (db.Database.EnsureCreated()) + { + db.Blogs.Add( + new Blog + { + Name = "Fish Blog", + Url = "http://sample.com/blogs/fish", + Posts = new List + { + new Post { Title = "Fish care 101" }, + new Post { Title = "Caring for tropical fish" }, + new Post { Title = "Types of ornamental fish" } + } + }); + + db.Blogs.Add( + new Blog + { + Name = "Cats Blog", + Url = "http://sample.com/blogs/cats", + Posts = new List + { + new Post { Title = "Cat care 101" }, + new Post { Title = "Caring for tropical cats" }, + new Post { Title = "Types of ornamental cats" } + } + }); + + db.Blogs.Add( + new Blog + { + Name = "Catfish Blog", + Url = "http://sample.com/blogs/catfish", + Posts = new List + { + new Post { Title = "Catfish care 101" }, + new Post { Title = "History of the catfish name" } + } + }); + + db.SaveChanges(); + + #region View + db.Database.ExecuteSqlRaw( + "CREATE VIEW \"View_BlogPostCounts\" AS " + + "SELECT b.\"Name\", Count(p.\"PostId\") as \"PostCount\" " + + "FROM \"Blogs\" b " + + "JOIN \"Posts\" p on p.\"BlogId\" = b.\"BlogId\" " + + "GROUP BY b.\"Name\" " + + "WITH READ ONLY;"); + #endregion + } + } + } + } + + public class BloggingContext : DbContext + { + public DbSet Blogs { get; set; } + public DbSet Posts { get; set; } + + #region DbSet + public DbSet BlogPostCounts { get; set; } + #endregion + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // Enter User Id, Password, and Data Source values + optionsBuilder + .UseOracle( + @"User Id=;Password=;Data Source="); + } + + #region Configuration + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder + .Entity(eb => + { + eb.HasNoKey(); + eb.ToView("View_BlogPostCounts"); + eb.Property(v => v.BlogName).HasColumnName("Name"); + }); + } + #endregion + } + + #region Entities + public class Blog + { + public int BlogId { get; set; } + public string Name { get; set; } + public string Url { get; set; } + public ICollection Posts { get; set; } + } + + public class Post + { + public int PostId { get; set; } + public string Title { get; set; } + public string Content { get; set; } + public int BlogId { get; set; } + } + #endregion + + #region KeylessEntityType + public class BlogPostsCount + { + public string BlogName { get; set; } + public int PostCount { get; set; } + } + #endregion +} From 04e0b7ef82109f628283d393e8f274bc5fd0927e Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 5 Jun 2020 11:26:27 -0700 Subject: [PATCH 14/76] Create README.md --- .../ef-core/keyless-entity-types-views/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 samples/dotnet-core/ef-core/keyless-entity-types-views/README.md diff --git a/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md new file mode 100644 index 00000000..f9660d90 --- /dev/null +++ b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md @@ -0,0 +1,8 @@ +This C# sample code shows how to use Oracle Entity Framework Core with keyless entity types and views. This sample works with Oracle EF Core 3.1. + +Oracle Entity Framework Core is available for free download on [NuGet Gallery](https://www.nuget.org/packages/Oracle.EntityFrameworkCore/). + +To use the sample code, enter the User Id, Password, and Data Source values for the Oracle connection string. + +Ensure the EF Core user has the database privileges to create the necessary schema objects to run the sample code. If you have granted the privileges in the [Oracle EF Core Getting Started sample](https://github.com/oracle/dotnet-db-samples/tree/master/samples/dotnet-core/ef-core/get-started) already, then you only have to grant following privilege to allow view creation: +* GRANT CREATE VIEW TO "<Oracle User>" From 1c5e86fa8d92e06cf017224374a87f94fe23e7e6 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Jun 2020 13:17:11 -0700 Subject: [PATCH 15/76] Genericized connection string --- samples/array-bind/ArrayBind.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/array-bind/ArrayBind.cs b/samples/array-bind/ArrayBind.cs index 58061b13..edb9e7ca 100644 --- a/samples/array-bind/ArrayBind.cs +++ b/samples/array-bind/ArrayBind.cs @@ -31,7 +31,8 @@ class ArrayBind static void Main(string[] args) { // Connect - string connectStr = "User Id=scott;Password=tiger;Data Source=oracle"; + // This sample code's DEPT table shares the same characteristics as SCOTT schema's DEPT table + string connectStr = "User Id=;Password=;Data Source="; // Setup the Tables for sample Setup(connectStr); From c58538a5c0d5616c69879c06eef5079b3433c386 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Jun 2020 13:36:50 -0700 Subject: [PATCH 16/76] Removed hard-coded password --- schemas/scott.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/schemas/scott.sql b/schemas/scott.sql index 116fc938..f843ba32 100644 --- a/schemas/scott.sql +++ b/schemas/scott.sql @@ -18,6 +18,8 @@ REM scott.sql Rem Rem DESCRIPTION Rem SCOTT is a database user whose schema is used for Oracle code demonstrations +Rem Be sure to replace on lines 31 and 34 with your preferred password. +Rem Historically, "tiger" has been SCOTT schema's password. SET TERMOUT OFF @@ -26,10 +28,10 @@ SET ECHO OFF rem CONGDON Invoked in RDBMS at build time. 29-DEC-1988 rem OATES: Created: 16-Feb-83 -GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT IDENTIFIED BY TIGER; +GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO SCOTT IDENTIFIED BY ; ALTER USER SCOTT DEFAULT TABLESPACE USERS; ALTER USER SCOTT TEMPORARY TABLESPACE TEMP; -CONNECT SCOTT/TIGER +CONNECT SCOTT/ DROP TABLE DEPT; CREATE TABLE DEPT (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, From d08f38ea2a2e145ecc5bc62e0dcd1011ea5e076c Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:03:41 -0700 Subject: [PATCH 17/76] Removed password --- samples/assoc-array/AssocArray.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/assoc-array/AssocArray.cs b/samples/assoc-array/AssocArray.cs index 62e15569..7315b9ff 100644 --- a/samples/assoc-array/AssocArray.cs +++ b/samples/assoc-array/AssocArray.cs @@ -33,7 +33,7 @@ static void Main(string[] args) Console.WriteLine("Demo: PL/SQL Associative Array"); // Connect - string connectStr = "User Id=scott;Password=tiger;Data Source=oracle"; + string connectStr = "User Id=scott;Password=;Data Source=oracle"; // Setup the Tables for sample Setup(connectStr); From 8005131584bfb1c4f5187f1a54443d5a7d284035 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:04:19 -0700 Subject: [PATCH 18/76] Update AssocArray.cs --- samples/assoc-array/AssocArray.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/assoc-array/AssocArray.cs b/samples/assoc-array/AssocArray.cs index 7315b9ff..e9dd9e66 100644 --- a/samples/assoc-array/AssocArray.cs +++ b/samples/assoc-array/AssocArray.cs @@ -32,7 +32,7 @@ static void Main(string[] args) { Console.WriteLine("Demo: PL/SQL Associative Array"); - // Connect + // Provide password and connect string connectStr = "User Id=scott;Password=;Data Source=oracle"; // Setup the Tables for sample From 0f12d0907f60acdb543e3c577f0c81e8082d1324 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:14:27 -0700 Subject: [PATCH 19/76] Update StatementCache.cs --- samples/statement-cache/StatementCache.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/statement-cache/StatementCache.cs b/samples/statement-cache/StatementCache.cs index e5b328d2..32ea19be 100644 --- a/samples/statement-cache/StatementCache.cs +++ b/samples/statement-cache/StatementCache.cs @@ -38,7 +38,7 @@ static void Main(string[] args) { // Connection String with Statement Caching not enabled - string constr = "User Id=scott;Password=tiger;Data Source=oracle;Statement Cache Size=0;Self Tuning=false"; + string constr = "User Id=scott;Password=;Data Source=oracle;Statement Cache Size=0;Self Tuning=false"; Console.WriteLine("Executing 5 Statements 1000 times each, please wait... "); @@ -53,7 +53,7 @@ static void Main(string[] args) // Hence cache size should be chosen depending on the number of statements // that the application repeatedly executes // Cache size should not exceed the size of OPEN_CURSORS as defined in init.ora - constr = "User Id=scott;Password=tiger;Data Source=oracle;Statement Cache Size=5;Self Tuning=false"; + constr = "User Id=scott;Password=;Data Source=oracle;Statement Cache Size=5;Self Tuning=false"; // Execute some statements with caching enabled and retrieve the time taken double totalSecCachingOn = StatementCache.MeasurePerformance(constr); From a2205b121265f96f334d71fb824ccc2996789ccb Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:15:51 -0700 Subject: [PATCH 20/76] Update ConnectionParams.cs --- samples/dataset/DML/src/ConnectionParams.cs | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/samples/dataset/DML/src/ConnectionParams.cs b/samples/dataset/DML/src/ConnectionParams.cs index 8c4dd657..90fbba4c 100644 --- a/samples/dataset/DML/src/ConnectionParams.cs +++ b/samples/dataset/DML/src/ConnectionParams.cs @@ -15,19 +15,19 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -namespace ManipulateProducts -{ - - public class ConnectionParams - { - //Parameters for database connection - //Change the values to those applicable to your database - public static string Datasource="oracle"; //Connect String as TNSNames - public static string Username="scott"; //Username - public static string Password="tiger"; //Password - } -} - \ No newline at end of file + *****************************************************************************/ + +using System; +namespace ManipulateProducts +{ + + public class ConnectionParams + { + //Parameters for database connection + //Change the values to those applicable to your database + public static string Datasource="oracle"; //Connect String as TNSNames + public static string Username="scott"; //Username + public static string Password=""; //Password + } +} + From 299e089f6dd9d744e148a9930b5752a18586c85d Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:19:05 -0700 Subject: [PATCH 21/76] Update DataReader.cs --- samples/data-reader/DataReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/data-reader/DataReader.cs b/samples/data-reader/DataReader.cs index 2c1aa888..97409ce7 100644 --- a/samples/data-reader/DataReader.cs +++ b/samples/data-reader/DataReader.cs @@ -26,7 +26,7 @@ class VisibleFieldCountSample { static void Main(string[] args) { - string constr = "User Id=scott; Password=tiger; Data Source=oracle;"; + string constr = "User Id=scott; Password=; Data Source=oracle;"; DbProviderFactory factory = DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client"); From 9af8907e66c8dcad7eb3c54b029ed6df5da303c4 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:19:52 -0700 Subject: [PATCH 22/76] Update ClientFactory.cs --- samples/client-factory/ClientFactory.cs | 78 ++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/samples/client-factory/ClientFactory.cs b/samples/client-factory/ClientFactory.cs index ed2040ce..733d2ca8 100644 --- a/samples/client-factory/ClientFactory.cs +++ b/samples/client-factory/ClientFactory.cs @@ -15,42 +15,42 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Data.Common; -using Oracle.ManagedDataAccess.Client; - -class FactorySample -{ - static void Main() - { - string constr = "user id=scott;password=tiger;data source=oracle"; - - DbProviderFactory factory = - DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client"); - - DbConnection conn = factory.CreateConnection(); - - try - { - conn.ConnectionString = constr; - conn.Open(); - - DbCommand cmd = factory.CreateCommand(); - cmd.Connection = conn; - cmd.CommandText = "select * from emp"; - - DbDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) - Console.WriteLine(reader["EMPNO"] + " : " + reader["ENAME"]); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - } -} - + *****************************************************************************/ + +using System; +using System.Data; +using System.Data.Common; +using Oracle.ManagedDataAccess.Client; + +class FactorySample +{ + static void Main() + { + string constr = "user id=scott;password=;data source=oracle"; + + DbProviderFactory factory = + DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client"); + + DbConnection conn = factory.CreateConnection(); + + try + { + conn.ConnectionString = constr; + conn.Open(); + + DbCommand cmd = factory.CreateCommand(); + cmd.Connection = conn; + cmd.CommandText = "select * from emp"; + + DbDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + Console.WriteLine(reader["EMPNO"] + " : " + reader["ENAME"]); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + } +} + From 0ecae8a41129a5545215af61de891464527fd220 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:20:50 -0700 Subject: [PATCH 23/76] Update Connection1.cs --- samples/connection/Connection1.cs | 74 +++++++++++++++---------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/samples/connection/Connection1.cs b/samples/connection/Connection1.cs index 5dd3836e..6dcbc8d2 100644 --- a/samples/connection/Connection1.cs +++ b/samples/connection/Connection1.cs @@ -15,40 +15,40 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Data.Common; -using Oracle.ManagedDataAccess.Client; - -class GetSchemaSample -{ - static void Main(string[] args) - { - string constr = "User Id=scott; Password=tiger; Data Source=oracle;"; - string ProviderName = "Oracle.ManagedDataAccess.Client"; - - DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); - - using (DbConnection conn = factory.CreateConnection()) - { - try - { - conn.ConnectionString = constr; - conn.Open(); - - //Get all the schema collections and write to an XML file. - //The XML file name is Oracle.ManagedDataAccess.Client_Schema.xml - DataTable dtSchema = conn.GetSchema(); - dtSchema.WriteXml(ProviderName + "_Schema.xml"); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - } - } -} - + *****************************************************************************/ + +using System; +using System.Data; +using System.Data.Common; +using Oracle.ManagedDataAccess.Client; + +class GetSchemaSample +{ + static void Main(string[] args) + { + string constr = "User Id=scott; Password=; Data Source=oracle;"; + string ProviderName = "Oracle.ManagedDataAccess.Client"; + + DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); + + using (DbConnection conn = factory.CreateConnection()) + { + try + { + conn.ConnectionString = constr; + conn.Open(); + + //Get all the schema collections and write to an XML file. + //The XML file name is Oracle.ManagedDataAccess.Client_Schema.xml + DataTable dtSchema = conn.GetSchema(); + dtSchema.WriteXml(ProviderName + "_Schema.xml"); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + } + } +} + From eb969bae35f4f6c62d7db56c1641ed3b036d64e2 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:21:46 -0700 Subject: [PATCH 24/76] Update ConnectionParams.cs --- samples/dataset/fill/src/ConnectionParams.cs | 62 ++++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/samples/dataset/fill/src/ConnectionParams.cs b/samples/dataset/fill/src/ConnectionParams.cs index b1953f96..fb3d8036 100644 --- a/samples/dataset/fill/src/ConnectionParams.cs +++ b/samples/dataset/fill/src/ConnectionParams.cs @@ -15,34 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -/************************************************************************** -@author Jagriti -@version 1.0 -Development Environment : MS Visual Studio .Net -Name of the File : ConnectionParams.cs -Creation/Modification History : - 23-July-2002 Created - -Overview: -This file defines the variables for connection parameters for database. -**************************************************************************/ - -using System; -namespace DSPopulate -{ - - public class ConnectionParams - { - //Parameters for database connection - //Change the values to those applicable to your database - - //Replace with Connect String as TNSNames - public static string Datasource="oracle"; - - public static string Username="scott"; //Username - public static string Password="tiger"; //Password - } -} - \ No newline at end of file + *****************************************************************************/ + +/************************************************************************** +@author Jagriti +@version 1.0 +Development Environment : MS Visual Studio .Net +Name of the File : ConnectionParams.cs +Creation/Modification History : + 23-July-2002 Created + +Overview: +This file defines the variables for connection parameters for database. +**************************************************************************/ + +using System; +namespace DSPopulate +{ + + public class ConnectionParams + { + //Parameters for database connection + //Change the values to those applicable to your database + + //Replace with Connect String as TNSNames + public static string Datasource="oracle"; + + public static string Username="scott"; //Username + public static string Password=""; //Password + } +} + From 79d9ce47b5b303f3711f27ac8b937a34ecf42ffb Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:22:29 -0700 Subject: [PATCH 25/76] Update ConnectionParams.cs --- samples/dataset/lob/src/ConnectionParams.cs | 60 ++++++++++----------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/samples/dataset/lob/src/ConnectionParams.cs b/samples/dataset/lob/src/ConnectionParams.cs index 437aed6d..514014a9 100644 --- a/samples/dataset/lob/src/ConnectionParams.cs +++ b/samples/dataset/lob/src/ConnectionParams.cs @@ -15,33 +15,33 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -/************************************************************************** -@author Jagriti -@version 1.0 -Development Environment : MS Visual Studio .Net -Name of the File : ConnectionParams.cs -Creation/Modification History : - 21-July-2002 Created - -Overview: -This file defines the variables for connection parameters for database. -**************************************************************************/ - -using System; -namespace ManipulateAds -{ - - public class ConnectionParams - { - //Parameters for database connection - //Change the values to those applicable to your database - - //Replace with Connect String as TNSNames - public static string Datasource="oracle"; - public static string Username="scott"; //Username - public static string Password="tiger"; //Password - } -} - \ No newline at end of file + *****************************************************************************/ + +/************************************************************************** +@author Jagriti +@version 1.0 +Development Environment : MS Visual Studio .Net +Name of the File : ConnectionParams.cs +Creation/Modification History : + 21-July-2002 Created + +Overview: +This file defines the variables for connection parameters for database. +**************************************************************************/ + +using System; +namespace ManipulateAds +{ + + public class ConnectionParams + { + //Parameters for database connection + //Change the values to those applicable to your database + + //Replace with Connect String as TNSNames + public static string Datasource="oracle"; + public static string Username="scott"; //Username + public static string Password=""; //Password + } +} + From 502bf4bc28c1f774a7ee9295ac6a3451c166abf5 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:22:55 -0700 Subject: [PATCH 26/76] Update ConnectionParams.vb --- samples/dataset/vb/src/ConnectionParams.vb | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/samples/dataset/vb/src/ConnectionParams.vb b/samples/dataset/vb/src/ConnectionParams.vb index 265cd818..8260348a 100644 --- a/samples/dataset/vb/src/ConnectionParams.vb +++ b/samples/dataset/vb/src/ConnectionParams.vb @@ -29,22 +29,22 @@ 'This file defines the variables for connection parameters for database. '************************************************************************** -Module ConnectionParams - - Public datasource As String - Public username As String - Public password As String - - Public Sub setparams() - 'Parameters for database connection - 'Change the values to those applicable to your database - - 'Replace with Connect String as TNSNames - datasource = "oracle" - 'Username - username = "scott" - 'Password - password = "tiger" - End Sub - -End Module +Module ConnectionParams + + Public datasource As String + Public username As String + Public password As String + + Public Sub setparams() + 'Parameters for database connection + 'Change the values to those applicable to your database + + 'Replace with Connect String as TNSNames + datasource = "oracle" + 'Username + username = "scott" + 'Password + password = "" + End Sub + +End Module From 6b176a67c4a8775bc5bf8fee055e093da88e4d2a Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:23:24 -0700 Subject: [PATCH 27/76] Update psfEnlistTransaction.cs --- .../enlist/psfEnlistTransaction.cs | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/samples/transaction/enlist/psfEnlistTransaction.cs b/samples/transaction/enlist/psfEnlistTransaction.cs index 14e19886..6a02efc7 100644 --- a/samples/transaction/enlist/psfEnlistTransaction.cs +++ b/samples/transaction/enlist/psfEnlistTransaction.cs @@ -15,62 +15,62 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using Oracle.ManagedDataAccess.Client; -using System.Data; -using System.Data.Common; -using System.Transactions; - -class psfEnlistTransaction -{ - static void Main() - { - int retVal = 0; - string providerName = "Oracle.ManagedDataAccess.Client"; - string constr = - @"User Id=scott;Password=tiger;Data Source=oracle;enlist=dynamic"; - - // Get the provider factory. - DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); - - try - { - // Create a committable transaction object. - CommittableTransaction cmtTx = new CommittableTransaction(); - - // Open a connection to the DB. - DbConnection conn1 = factory.CreateConnection(); - conn1.ConnectionString = constr; - conn1.Open(); - - // enlist the connection with the commitable transaction. - conn1.EnlistTransaction(cmtTx); - - // Create a command to execute the sql statement. - DbCommand cmd1 = factory.CreateCommand(); - cmd1.Connection = conn1; - cmd1.CommandText = @"insert into dept (deptno, dname, loc) - values (99, 'st', 'lex')"; - - // Execute the SQL statement to insert one row in DB. - retVal = cmd1.ExecuteNonQuery(); - Console.WriteLine("Rows to be affected by cmd1: {0}", retVal); - - // commit/rollback the transaction. - cmtTx.Commit(); // commits the txn. - //cmtTx.Rollback(); // rolls back the txn. - - // close and dispose the connection - conn1.Close(); - conn1.Dispose(); - cmd1.Dispose(); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - } -} + *****************************************************************************/ + +using System; +using Oracle.ManagedDataAccess.Client; +using System.Data; +using System.Data.Common; +using System.Transactions; + +class psfEnlistTransaction +{ + static void Main() + { + int retVal = 0; + string providerName = "Oracle.ManagedDataAccess.Client"; + string constr = + @"User Id=scott;Password=;Data Source=oracle;enlist=dynamic"; + + // Get the provider factory. + DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); + + try + { + // Create a committable transaction object. + CommittableTransaction cmtTx = new CommittableTransaction(); + + // Open a connection to the DB. + DbConnection conn1 = factory.CreateConnection(); + conn1.ConnectionString = constr; + conn1.Open(); + + // enlist the connection with the commitable transaction. + conn1.EnlistTransaction(cmtTx); + + // Create a command to execute the sql statement. + DbCommand cmd1 = factory.CreateCommand(); + cmd1.Connection = conn1; + cmd1.CommandText = @"insert into dept (deptno, dname, loc) + values (99, 'st', 'lex')"; + + // Execute the SQL statement to insert one row in DB. + retVal = cmd1.ExecuteNonQuery(); + Console.WriteLine("Rows to be affected by cmd1: {0}", retVal); + + // commit/rollback the transaction. + cmtTx.Commit(); // commits the txn. + //cmtTx.Rollback(); // rolls back the txn. + + // close and dispose the connection + conn1.Close(); + conn1.Dispose(); + cmd1.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + } +} From 67bc5e158251ed1e1332f21ee9d755b95734a8de Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:23:57 -0700 Subject: [PATCH 28/76] Update psfTxnScope.cs --- .../transaction-scope/psfTxnScope.cs | 126 +++++++++--------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/samples/transaction/transaction-scope/psfTxnScope.cs b/samples/transaction/transaction-scope/psfTxnScope.cs index 49ae352d..4401a49d 100644 --- a/samples/transaction/transaction-scope/psfTxnScope.cs +++ b/samples/transaction/transaction-scope/psfTxnScope.cs @@ -15,66 +15,66 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using Oracle.ManagedDataAccess.Client; -using System.Data; -using System.Data.Common; -using System.Transactions; - -class psfTxnScope -{ - static void Main() - { - int retVal = 0; - string providerName = "Oracle.ManagedDataAccess.Client"; - string constr = - @"User Id=scott;Password=tiger;Data Source=oracle;"; - - // Get the provider factory. - DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); - - try - { - // Create a TransactionScope object, (It will start an ambient - // transaction automatically). - using (TransactionScope scope = new TransactionScope()) - { - // Create first connection object. - using (DbConnection conn1 = factory.CreateConnection()) - { - // Set connection string and open the connection. this connection - // will be automatically enlisted in a distributed transaction. - conn1.ConnectionString = constr; - conn1.Open(); - - // Create a command to execute the sql statement. - DbCommand cmd1 = factory.CreateCommand(); - cmd1.Connection = conn1; - cmd1.CommandText = @"insert into dept (deptno, dname, loc) - values (99, 'st', 'lex')"; - - // Execute the SQL statement to insert one row in DB. - retVal = cmd1.ExecuteNonQuery(); - Console.WriteLine("Rows to be affected by cmd1: {0}", retVal); - - // Close the connection and dispose the command object. - conn1.Close(); - conn1.Dispose(); - cmd1.Dispose(); - } - - // The Complete method commits the transaction. If an exception has - // been thrown or Complete is not called then the transaction is - // rolled back. - scope.Complete(); - } - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - } -} + *****************************************************************************/ + +using System; +using Oracle.ManagedDataAccess.Client; +using System.Data; +using System.Data.Common; +using System.Transactions; + +class psfTxnScope +{ + static void Main() + { + int retVal = 0; + string providerName = "Oracle.ManagedDataAccess.Client"; + string constr = + @"User Id=scott;Password=;Data Source=oracle;"; + + // Get the provider factory. + DbProviderFactory factory = DbProviderFactories.GetFactory(providerName); + + try + { + // Create a TransactionScope object, (It will start an ambient + // transaction automatically). + using (TransactionScope scope = new TransactionScope()) + { + // Create first connection object. + using (DbConnection conn1 = factory.CreateConnection()) + { + // Set connection string and open the connection. this connection + // will be automatically enlisted in a distributed transaction. + conn1.ConnectionString = constr; + conn1.Open(); + + // Create a command to execute the sql statement. + DbCommand cmd1 = factory.CreateCommand(); + cmd1.Connection = conn1; + cmd1.CommandText = @"insert into dept (deptno, dname, loc) + values (99, 'st', 'lex')"; + + // Execute the SQL statement to insert one row in DB. + retVal = cmd1.ExecuteNonQuery(); + Console.WriteLine("Rows to be affected by cmd1: {0}", retVal); + + // Close the connection and dispose the command object. + conn1.Close(); + conn1.Dispose(); + cmd1.Dispose(); + } + + // The Complete method commits the transaction. If an exception has + // been thrown or Complete is not called then the transaction is + // rolled back. + scope.Complete(); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + } +} From cad3a6dee2682f4bf50adf9aec2bf120fb273cf9 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:24:34 -0700 Subject: [PATCH 29/76] Update ConnectionStringBuilder.cs --- samples/connection-string-builder/ConnectionStringBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/connection-string-builder/ConnectionStringBuilder.cs b/samples/connection-string-builder/ConnectionStringBuilder.cs index 91b1f448..46ae7545 100644 --- a/samples/connection-string-builder/ConnectionStringBuilder.cs +++ b/samples/connection-string-builder/ConnectionStringBuilder.cs @@ -27,7 +27,7 @@ class ConnectionStringBuilderSample { static void Main(string[] args) { - string connString = "user id=scott;password=tiger;Data source=oracle;"; + string connString = "user id=scott;password=;Data source=oracle;"; bool bRet = false; // Create an instance of OracleConnectionStringBuilder From 061cc1bbab7f1b6e3ccf3593a950108f380716c0 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:24:59 -0700 Subject: [PATCH 30/76] Update Connection2.cs --- samples/connection/Connection2.cs | 142 +++++++++++++++--------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/samples/connection/Connection2.cs b/samples/connection/Connection2.cs index b49bec87..c4dd04ac 100644 --- a/samples/connection/Connection2.cs +++ b/samples/connection/Connection2.cs @@ -15,74 +15,74 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Data.Common; -using Oracle.ManagedDataAccess.Client; - -class GetSchemaSample -{ - static void Main(string[] args) - { - string constr = "User Id=scott; Password=tiger; Data Source=oracle;"; - string ProviderName = "Oracle.ManagedDataAccess.Client"; - - DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); - - using (DbConnection conn = factory.CreateConnection()) - { - try - { - conn.ConnectionString = constr; - conn.Open(); - - //Get MetaDataCollections and write to an XML file. - //This is equivalent to GetSchema() - DataTable dtMetadata = - conn.GetSchema(DbMetaDataCollectionNames.MetaDataCollections); - dtMetadata.WriteXml(ProviderName + "_MetaDataCollections.xml"); - - //Get Restrictions and write to an XML file. - DataTable dtRestrictions = - conn.GetSchema(DbMetaDataCollectionNames.Restrictions); - dtRestrictions.WriteXml(ProviderName + "_Restrictions.xml"); - - //Get DataSourceInformation and write to an XML file. - DataTable dtDataSrcInfo = - conn.GetSchema(DbMetaDataCollectionNames.DataSourceInformation); - dtDataSrcInfo.WriteXml(ProviderName + "_DataSourceInformation.xml"); - - //DataTypes and write to an XML file. - DataTable dtDataTypes = - conn.GetSchema(DbMetaDataCollectionNames.DataTypes); - dtDataTypes.WriteXml(ProviderName + "_DataTypes.xml"); - - //Get ReservedWords and write to an XML file. - DataTable dtReservedWords = - conn.GetSchema(DbMetaDataCollectionNames.ReservedWords); - dtReservedWords.WriteXml(ProviderName + "_ReservedWords.xml"); - - //Get all the tables and write to an XML file. - DataTable dtTables = conn.GetSchema("Tables"); - dtTables.WriteXml(ProviderName + "_Tables.xml"); - - //Get all the views and write to an XML file. - DataTable dtViews = conn.GetSchema("Views"); - dtViews.WriteXml(ProviderName + "_Views.xml"); - - //Get all the columns and write to an XML file. - DataTable dtColumns = conn.GetSchema("Columns"); - dtColumns.WriteXml(ProviderName + "_Columns.xml"); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.StackTrace); - } - } - } -} - - + *****************************************************************************/ + +using System; +using System.Data; +using System.Data.Common; +using Oracle.ManagedDataAccess.Client; + +class GetSchemaSample +{ + static void Main(string[] args) + { + string constr = "User Id=scott; Password=; Data Source=oracle;"; + string ProviderName = "Oracle.ManagedDataAccess.Client"; + + DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); + + using (DbConnection conn = factory.CreateConnection()) + { + try + { + conn.ConnectionString = constr; + conn.Open(); + + //Get MetaDataCollections and write to an XML file. + //This is equivalent to GetSchema() + DataTable dtMetadata = + conn.GetSchema(DbMetaDataCollectionNames.MetaDataCollections); + dtMetadata.WriteXml(ProviderName + "_MetaDataCollections.xml"); + + //Get Restrictions and write to an XML file. + DataTable dtRestrictions = + conn.GetSchema(DbMetaDataCollectionNames.Restrictions); + dtRestrictions.WriteXml(ProviderName + "_Restrictions.xml"); + + //Get DataSourceInformation and write to an XML file. + DataTable dtDataSrcInfo = + conn.GetSchema(DbMetaDataCollectionNames.DataSourceInformation); + dtDataSrcInfo.WriteXml(ProviderName + "_DataSourceInformation.xml"); + + //DataTypes and write to an XML file. + DataTable dtDataTypes = + conn.GetSchema(DbMetaDataCollectionNames.DataTypes); + dtDataTypes.WriteXml(ProviderName + "_DataTypes.xml"); + + //Get ReservedWords and write to an XML file. + DataTable dtReservedWords = + conn.GetSchema(DbMetaDataCollectionNames.ReservedWords); + dtReservedWords.WriteXml(ProviderName + "_ReservedWords.xml"); + + //Get all the tables and write to an XML file. + DataTable dtTables = conn.GetSchema("Tables"); + dtTables.WriteXml(ProviderName + "_Tables.xml"); + + //Get all the views and write to an XML file. + DataTable dtViews = conn.GetSchema("Views"); + dtViews.WriteXml(ProviderName + "_Views.xml"); + + //Get all the columns and write to an XML file. + DataTable dtColumns = conn.GetSchema("Columns"); + dtColumns.WriteXml(ProviderName + "_Columns.xml"); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.StackTrace); + } + } + } +} + + From 461eb556eb118af183e5603d9274e34549b9f6c1 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:26:28 -0700 Subject: [PATCH 31/76] Update Connection3.cs --- samples/connection/Connection3.cs | 160 +++++++++++++++--------------- 1 file changed, 80 insertions(+), 80 deletions(-) diff --git a/samples/connection/Connection3.cs b/samples/connection/Connection3.cs index b03bf0a7..1008d4aa 100644 --- a/samples/connection/Connection3.cs +++ b/samples/connection/Connection3.cs @@ -15,83 +15,83 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Data.Common; -using Oracle.ManagedDataAccess.Client; - -class GetSchemaSample -{ - static void Main(string[] args) - { - string constr = "User Id=scott; Password=tiger; Data Source=oracle;"; - string ProviderName = "Oracle.ManagedDataAccess.Client"; - - DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); - - using (DbConnection conn = factory.CreateConnection()) - { - try - { - conn.ConnectionString = constr; - conn.Open(); - - //Get Restrictions - DataTable dtRestrictions = - conn.GetSchema(DbMetaDataCollectionNames.Restrictions); - - DataView dv = dtRestrictions.DefaultView; - - dv.RowFilter = "CollectionName = 'Columns'"; - dv.Sort = "RestrictionNumber"; - - for (int i = 0; i < dv.Count; i++) - Console.WriteLine("{0} (default) {1}" , - dtRestrictions.Rows[i]["RestrictionName"], - dtRestrictions.Rows[i]["RestrictionDefault"]); - - //Set restriction string array - string[] restrictions = new string[3]; - - //Get all columns from all tables owned by "SCOTT" - restrictions[0] = "SCOTT"; - DataTable dtAllScottCols = conn.GetSchema("Columns", restrictions); - - // clear collection - for (int i = 0; i < 3; i++) - restrictions[i] = null; - - //Get all columns from all tables named "EMP" owned by any - //owner/schema - restrictions[1] = "EMP"; - DataTable dtAllEmpCols = conn.GetSchema("Columns", restrictions); - - // clear collection - for (int i = 0; i < 3; i++) - restrictions[i] = null; - - //Get columns named "EMPNO" from tables named "EMP", - //owned by any owner/schema - restrictions[1] = "EMP"; - restrictions[2] = "EMPNO"; - DataTable dtAllScottEmpCols = conn.GetSchema("Columns", restrictions); - - // clear collection - for (int i = 0; i < 3; i++) - restrictions[i] = null; - - //Get columns named "EMPNO" from all - //tables, owned by any owner/schema - restrictions[2] = "EMPNO"; - DataTable dtAllEmpNoCols = conn.GetSchema("Columns", restrictions); - } - catch (Exception ex) - { - Console.WriteLine(ex.Message); - Console.WriteLine(ex.Source); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Data.Common; +using Oracle.ManagedDataAccess.Client; + +class GetSchemaSample +{ + static void Main(string[] args) + { + string constr = "User Id=scott; Password=; Data Source=oracle;"; + string ProviderName = "Oracle.ManagedDataAccess.Client"; + + DbProviderFactory factory = DbProviderFactories.GetFactory(ProviderName); + + using (DbConnection conn = factory.CreateConnection()) + { + try + { + conn.ConnectionString = constr; + conn.Open(); + + //Get Restrictions + DataTable dtRestrictions = + conn.GetSchema(DbMetaDataCollectionNames.Restrictions); + + DataView dv = dtRestrictions.DefaultView; + + dv.RowFilter = "CollectionName = 'Columns'"; + dv.Sort = "RestrictionNumber"; + + for (int i = 0; i < dv.Count; i++) + Console.WriteLine("{0} (default) {1}" , + dtRestrictions.Rows[i]["RestrictionName"], + dtRestrictions.Rows[i]["RestrictionDefault"]); + + //Set restriction string array + string[] restrictions = new string[3]; + + //Get all columns from all tables owned by "SCOTT" + restrictions[0] = "SCOTT"; + DataTable dtAllScottCols = conn.GetSchema("Columns", restrictions); + + // clear collection + for (int i = 0; i < 3; i++) + restrictions[i] = null; + + //Get all columns from all tables named "EMP" owned by any + //owner/schema + restrictions[1] = "EMP"; + DataTable dtAllEmpCols = conn.GetSchema("Columns", restrictions); + + // clear collection + for (int i = 0; i < 3; i++) + restrictions[i] = null; + + //Get columns named "EMPNO" from tables named "EMP", + //owned by any owner/schema + restrictions[1] = "EMP"; + restrictions[2] = "EMPNO"; + DataTable dtAllScottEmpCols = conn.GetSchema("Columns", restrictions); + + // clear collection + for (int i = 0; i < 3; i++) + restrictions[i] = null; + + //Get columns named "EMPNO" from all + //tables, owned by any owner/schema + restrictions[2] = "EMPNO"; + DataTable dtAllEmpNoCols = conn.GetSchema("Columns", restrictions); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + Console.WriteLine(ex.Source); + } + } + } +} From 01ae14c312ae8f104161c4ea9b8017f2ce654d54 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:27:07 -0700 Subject: [PATCH 32/76] Update sample1.cs --- samples/lob/sample1.cs | 264 ++++++++++++++++++++--------------------- 1 file changed, 132 insertions(+), 132 deletions(-) diff --git a/samples/lob/sample1.cs b/samples/lob/sample1.cs index 2966279b..a6e9830e 100644 --- a/samples/lob/sample1.cs +++ b/samples/lob/sample1.cs @@ -15,135 +15,135 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample1 -{ - /// - /// Sample 1: Demonstrates how to populate and obtain LOB data - /// from a DataSet. - /// - class Sample1 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup the table & Data - Setup(con); - - // Create the OracleCommand - OracleCommand cmd = new OracleCommand("select story from multimedia_tab"); - cmd.Connection = con; - cmd.CommandType = CommandType.Text; - - // Create the OracleDataAdapter - OracleDataAdapter da = new OracleDataAdapter(cmd); - - // Populate a DataSet - DataSet ds = new DataSet(); - try - { - da.FillSchema(ds, SchemaType.Source, "Media"); - - // Populate the DataSet with LOB data - da.Fill(ds, "Media"); - - // Obtain LOB data from the database and print it out - Console.WriteLine(ds.Tables["Media"].Rows[0]["story"]); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample1 +{ + /// + /// Sample 1: Demonstrates how to populate and obtain LOB data + /// from a DataSet. + /// + class Sample1 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup the table & Data + Setup(con); + + // Create the OracleCommand + OracleCommand cmd = new OracleCommand("select story from multimedia_tab"); + cmd.Connection = con; + cmd.CommandType = CommandType.Text; + + // Create the OracleDataAdapter + OracleDataAdapter da = new OracleDataAdapter(cmd); + + // Populate a DataSet + DataSet ds = new DataSet(); + try + { + da.FillSchema(ds, SchemaType.Source, "Media"); + + // Populate the DataSet with LOB data + da.Fill(ds, "Media"); + + // Obtain LOB data from the database and print it out + Console.WriteLine(ds.Tables["Media"].Rows[0]["story"]); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 0cb022c42e33d8f0ac078935dd1921546e7cac66 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:28:37 -0700 Subject: [PATCH 33/76] Update RowUpdate.vb --- samples/event-handler/src/RowUpdate.vb | 1186 ++++++++++++------------ 1 file changed, 593 insertions(+), 593 deletions(-) diff --git a/samples/event-handler/src/RowUpdate.vb b/samples/event-handler/src/RowUpdate.vb index 39d6b373..99ffb2f3 100644 --- a/samples/event-handler/src/RowUpdate.vb +++ b/samples/event-handler/src/RowUpdate.vb @@ -30,596 +30,596 @@ 'that handle events generated by widgets placed on the main form. '************************************************************************** -Imports System.Threading -Public Class RowUpdate - Inherits System.Windows.Forms.Form - Protected dba As DBAccess - Protected statusbool As Boolean - -#Region " Windows Form Designer generated code " - - Public Sub New() - MyBase.New() - - 'This call is required by the Windows Form Designer. - InitializeComponent() - - 'Add any initialization after the InitializeComponent() call - 'Create instance of the database access helper class and pass the reference - 'of status window to this object - dba = New DBAccess(StatusBox) - End Sub - - 'Form overrides dispose to clean up the component list. - Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing Then - If Not (components Is Nothing) Then - components.Dispose() - End If - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - Friend WithEvents Label1 As System.Windows.Forms.Label - Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox - Friend WithEvents Connection As System.Windows.Forms.GroupBox - Friend WithEvents UserNameLabel As System.Windows.Forms.Label - Friend WithEvents UserName As System.Windows.Forms.TextBox - Friend WithEvents PasswordLabel As System.Windows.Forms.Label - Friend WithEvents Password As System.Windows.Forms.TextBox - Friend WithEvents ConnectStringLabel As System.Windows.Forms.Label - Friend WithEvents ButtonConnect As System.Windows.Forms.Button - Friend WithEvents ButtonExit As System.Windows.Forms.Button - Friend WithEvents StatusLabel As System.Windows.Forms.Label - Friend WithEvents Status As System.Windows.Forms.Label - Friend WithEvents StatusBox As System.Windows.Forms.TextBox - Friend WithEvents DataSource As System.Windows.Forms.TextBox - Friend WithEvents Label2 As System.Windows.Forms.Label - Friend WithEvents ButtonUpdate As System.Windows.Forms.Button - Friend WithEvents GroupBoxupdating1 As System.Windows.Forms.GroupBox - Friend WithEvents GroupBox2 As System.Windows.Forms.GroupBox - Friend WithEvents UpdatingEnabled As System.Windows.Forms.RadioButton - Friend WithEvents UpdatingDisabled As System.Windows.Forms.RadioButton - Friend WithEvents UpdatedEnabled As System.Windows.Forms.RadioButton - Friend WithEvents UpdatedDisabled As System.Windows.Forms.RadioButton - Friend WithEvents ButtonApply As System.Windows.Forms.Button - Friend WithEvents CountryGrid As System.Windows.Forms.DataGrid - Friend WithEvents DataGridTableStyle1 As System.Windows.Forms.DataGridTableStyle - Friend WithEvents TextBoxCountryname As System.Windows.Forms.DataGridTextBoxColumn - Friend WithEvents TextBoxpopulation As System.Windows.Forms.DataGridTextBoxColumn - Friend WithEvents TextBoxLanguage As System.Windows.Forms.DataGridTextBoxColumn - Friend WithEvents TextBoxCurrency As System.Windows.Forms.DataGridTextBoxColumn - Friend WithEvents ButtonDisconnect As System.Windows.Forms.Button - Private Sub InitializeComponent() - Me.Label1 = New System.Windows.Forms.Label - Me.GroupBox1 = New System.Windows.Forms.GroupBox - Me.StatusBox = New System.Windows.Forms.TextBox - Me.UserNameLabel = New System.Windows.Forms.Label - Me.UserName = New System.Windows.Forms.TextBox - Me.PasswordLabel = New System.Windows.Forms.Label - Me.Password = New System.Windows.Forms.TextBox - Me.Connection = New System.Windows.Forms.GroupBox - Me.ButtonDisconnect = New System.Windows.Forms.Button - Me.Status = New System.Windows.Forms.Label - Me.StatusLabel = New System.Windows.Forms.Label - Me.ButtonExit = New System.Windows.Forms.Button - Me.ButtonConnect = New System.Windows.Forms.Button - Me.DataSource = New System.Windows.Forms.TextBox - Me.ConnectStringLabel = New System.Windows.Forms.Label - Me.Label2 = New System.Windows.Forms.Label - Me.ButtonUpdate = New System.Windows.Forms.Button - Me.GroupBoxupdating1 = New System.Windows.Forms.GroupBox - Me.UpdatingDisabled = New System.Windows.Forms.RadioButton - Me.UpdatingEnabled = New System.Windows.Forms.RadioButton - Me.GroupBox2 = New System.Windows.Forms.GroupBox - Me.UpdatedDisabled = New System.Windows.Forms.RadioButton - Me.UpdatedEnabled = New System.Windows.Forms.RadioButton - Me.ButtonApply = New System.Windows.Forms.Button - Me.CountryGrid = New System.Windows.Forms.DataGrid - Me.DataGridTableStyle1 = New System.Windows.Forms.DataGridTableStyle - Me.TextBoxCountryname = New System.Windows.Forms.DataGridTextBoxColumn - Me.TextBoxpopulation = New System.Windows.Forms.DataGridTextBoxColumn - Me.TextBoxLanguage = New System.Windows.Forms.DataGridTextBoxColumn - Me.TextBoxCurrency = New System.Windows.Forms.DataGridTextBoxColumn - Me.GroupBox1.SuspendLayout() - Me.Connection.SuspendLayout() - Me.GroupBoxupdating1.SuspendLayout() - Me.GroupBox2.SuspendLayout() - CType(Me.CountryGrid, System.ComponentModel.ISupportInitialize).BeginInit() - Me.SuspendLayout() - ' - 'Label1 - ' - Me.Label1.Font = New System.Drawing.Font("Arial", 16.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.Label1.Location = New System.Drawing.Point(24, 8) - Me.Label1.Name = "Label1" - Me.Label1.Size = New System.Drawing.Size(496, 24) - Me.Label1.TabIndex = 0 - Me.Label1.Text = "Row Update Event Handler Application" - Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - ' - 'GroupBox1 - ' - Me.GroupBox1.Controls.Add(Me.StatusBox) - Me.GroupBox1.Location = New System.Drawing.Point(8, 336) - Me.GroupBox1.Name = "GroupBox1" - Me.GroupBox1.Size = New System.Drawing.Size(544, 184) - Me.GroupBox1.TabIndex = 1 - Me.GroupBox1.TabStop = False - Me.GroupBox1.Text = "Status Window" - ' - 'StatusBox - ' - Me.StatusBox.Font = New System.Drawing.Font("Verdana", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.StatusBox.Location = New System.Drawing.Point(8, 16) - Me.StatusBox.Multiline = True - Me.StatusBox.Name = "StatusBox" - Me.StatusBox.ReadOnly = True - Me.StatusBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical - Me.StatusBox.Size = New System.Drawing.Size(528, 160) - Me.StatusBox.TabIndex = 35 - ' - 'UserNameLabel - ' - Me.UserNameLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!) - Me.UserNameLabel.Location = New System.Drawing.Point(16, 56) - Me.UserNameLabel.Name = "UserNameLabel" - Me.UserNameLabel.Size = New System.Drawing.Size(80, 16) - Me.UserNameLabel.TabIndex = 0 - Me.UserNameLabel.Text = "User Name" - ' - 'UserName - ' - Me.UserName.Location = New System.Drawing.Point(96, 56) - Me.UserName.Name = "UserName" - Me.UserName.Size = New System.Drawing.Size(88, 20) - Me.UserName.TabIndex = 0 - Me.UserName.Text = "scott" - ' - 'PasswordLabel - ' - Me.PasswordLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!) - Me.PasswordLabel.Location = New System.Drawing.Point(192, 56) - Me.PasswordLabel.Name = "PasswordLabel" - Me.PasswordLabel.Size = New System.Drawing.Size(72, 24) - Me.PasswordLabel.TabIndex = 0 - Me.PasswordLabel.Text = "Password" - ' - 'Password - ' - Me.Password.Location = New System.Drawing.Point(264, 56) - Me.Password.Name = "Password" - Me.Password.Size = New System.Drawing.Size(80, 20) - Me.Password.TabIndex = 1 - Me.Password.Text = "tiger" - ' - 'Connection - ' - Me.Connection.Controls.Add(Me.ButtonDisconnect) - Me.Connection.Controls.Add(Me.Status) - Me.Connection.Controls.Add(Me.StatusLabel) - Me.Connection.Controls.Add(Me.ButtonExit) - Me.Connection.Controls.Add(Me.ButtonConnect) - Me.Connection.Controls.Add(Me.DataSource) - Me.Connection.Controls.Add(Me.ConnectStringLabel) - Me.Connection.Location = New System.Drawing.Point(8, 40) - Me.Connection.Name = "Connection" - Me.Connection.Size = New System.Drawing.Size(544, 80) - Me.Connection.TabIndex = 0 - Me.Connection.TabStop = False - Me.Connection.Text = "Connection Details" - ' - 'ButtonDisconnect - ' - Me.ButtonDisconnect.Enabled = False - Me.ButtonDisconnect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.ButtonDisconnect.Location = New System.Drawing.Point(336, 48) - Me.ButtonDisconnect.Name = "ButtonDisconnect" - Me.ButtonDisconnect.Size = New System.Drawing.Size(88, 24) - Me.ButtonDisconnect.TabIndex = 2 - Me.ButtonDisconnect.Text = "Disconnect " - ' - 'Status - ' - Me.Status.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.Status.ForeColor = System.Drawing.Color.Red - Me.Status.ImageAlign = System.Drawing.ContentAlignment.BottomCenter - Me.Status.Location = New System.Drawing.Point(80, 56) - Me.Status.Name = "Status" - Me.Status.Size = New System.Drawing.Size(120, 16) - Me.Status.TabIndex = 0 - Me.Status.Text = "Not Connected" - ' - 'StatusLabel - ' - Me.StatusLabel.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.StatusLabel.Location = New System.Drawing.Point(16, 56) - Me.StatusLabel.Name = "StatusLabel" - Me.StatusLabel.Size = New System.Drawing.Size(48, 16) - Me.StatusLabel.TabIndex = 0 - Me.StatusLabel.Text = "Status: " - ' - 'ButtonExit - ' - Me.ButtonExit.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.ButtonExit.Location = New System.Drawing.Point(448, 48) - Me.ButtonExit.Name = "ButtonExit" - Me.ButtonExit.Size = New System.Drawing.Size(88, 24) - Me.ButtonExit.TabIndex = 2 - Me.ButtonExit.Text = "Exit" - ' - 'ButtonConnect - ' - Me.ButtonConnect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.ButtonConnect.Location = New System.Drawing.Point(224, 48) - Me.ButtonConnect.Name = "ButtonConnect" - Me.ButtonConnect.Size = New System.Drawing.Size(88, 24) - Me.ButtonConnect.TabIndex = 1 - Me.ButtonConnect.Text = "Connect " - ' - 'DataSource - ' - Me.DataSource.Location = New System.Drawing.Point(448, 16) - Me.DataSource.Name = "DataSource" - Me.DataSource.Size = New System.Drawing.Size(88, 20) - Me.DataSource.TabIndex = 0 - Me.DataSource.Text = "oracle" - ' - 'ConnectStringLabel - ' - Me.ConnectStringLabel.Font = New System.Drawing.Font("Arial", 10.25!) - Me.ConnectStringLabel.Location = New System.Drawing.Point(344, 16) - Me.ConnectStringLabel.Name = "ConnectStringLabel" - Me.ConnectStringLabel.Size = New System.Drawing.Size(104, 24) - Me.ConnectStringLabel.TabIndex = 4 - Me.ConnectStringLabel.Text = "Data Source" - ' - 'Label2 - ' - Me.Label2.Font = New System.Drawing.Font("Arial", 10.25!, System.Drawing.FontStyle.Bold) - Me.Label2.Location = New System.Drawing.Point(216, 8) - Me.Label2.Name = "Label2" - Me.Label2.Size = New System.Drawing.Size(96, 24) - Me.Label2.TabIndex = 0 - Me.Label2.Text = "Source Code " - ' - 'ButtonUpdate - ' - Me.ButtonUpdate.Enabled = False - Me.ButtonUpdate.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold) - Me.ButtonUpdate.Location = New System.Drawing.Point(456, 248) - Me.ButtonUpdate.Name = "ButtonUpdate" - Me.ButtonUpdate.Size = New System.Drawing.Size(88, 24) - Me.ButtonUpdate.TabIndex = 2 - Me.ButtonUpdate.Text = "Update" - ' - 'GroupBoxupdating1 - ' - Me.GroupBoxupdating1.Controls.Add(Me.UpdatingDisabled) - Me.GroupBoxupdating1.Controls.Add(Me.UpdatingEnabled) - Me.GroupBoxupdating1.Location = New System.Drawing.Point(8, 280) - Me.GroupBoxupdating1.Name = "GroupBoxupdating1" - Me.GroupBoxupdating1.Size = New System.Drawing.Size(208, 48) - Me.GroupBoxupdating1.TabIndex = 10 - Me.GroupBoxupdating1.TabStop = False - Me.GroupBoxupdating1.Text = "OracleRowUpdatingEventHandler" - ' - 'UpdatingDisabled - ' - Me.UpdatingDisabled.Enabled = False - Me.UpdatingDisabled.Location = New System.Drawing.Point(112, 24) - Me.UpdatingDisabled.Name = "UpdatingDisabled" - Me.UpdatingDisabled.Size = New System.Drawing.Size(72, 16) - Me.UpdatingDisabled.TabIndex = 1 - Me.UpdatingDisabled.Text = "Disabled" - ' - 'UpdatingEnabled - ' - Me.UpdatingEnabled.Checked = True - Me.UpdatingEnabled.Enabled = False - Me.UpdatingEnabled.Location = New System.Drawing.Point(24, 24) - Me.UpdatingEnabled.Name = "UpdatingEnabled" - Me.UpdatingEnabled.Size = New System.Drawing.Size(112, 16) - Me.UpdatingEnabled.TabIndex = 0 - Me.UpdatingEnabled.TabStop = True - Me.UpdatingEnabled.Text = "Enabled" - ' - 'GroupBox2 - ' - Me.GroupBox2.Controls.Add(Me.UpdatedDisabled) - Me.GroupBox2.Controls.Add(Me.UpdatedEnabled) - Me.GroupBox2.Location = New System.Drawing.Point(240, 280) - Me.GroupBox2.Name = "GroupBox2" - Me.GroupBox2.Size = New System.Drawing.Size(208, 48) - Me.GroupBox2.TabIndex = 11 - Me.GroupBox2.TabStop = False - Me.GroupBox2.Text = "OracleRowUpdatedEventHandler" - ' - 'UpdatedDisabled - ' - Me.UpdatedDisabled.Enabled = False - Me.UpdatedDisabled.Location = New System.Drawing.Point(96, 24) - Me.UpdatedDisabled.Name = "UpdatedDisabled" - Me.UpdatedDisabled.Size = New System.Drawing.Size(72, 16) - Me.UpdatedDisabled.TabIndex = 1 - Me.UpdatedDisabled.Text = "Disabled" - ' - 'UpdatedEnabled - ' - Me.UpdatedEnabled.Checked = True - Me.UpdatedEnabled.Enabled = False - Me.UpdatedEnabled.Location = New System.Drawing.Point(16, 24) - Me.UpdatedEnabled.Name = "UpdatedEnabled" - Me.UpdatedEnabled.Size = New System.Drawing.Size(104, 16) - Me.UpdatedEnabled.TabIndex = 0 - Me.UpdatedEnabled.TabStop = True - Me.UpdatedEnabled.Text = "Enabled" - ' - 'ButtonApply - ' - Me.ButtonApply.Enabled = False - Me.ButtonApply.Location = New System.Drawing.Point(456, 304) - Me.ButtonApply.Name = "ButtonApply" - Me.ButtonApply.Size = New System.Drawing.Size(88, 24) - Me.ButtonApply.TabIndex = 3 - Me.ButtonApply.Text = "Apply" - ' - 'CountryGrid - ' - Me.CountryGrid.CaptionText = "Country Table" - Me.CountryGrid.DataMember = "" - Me.CountryGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText - Me.CountryGrid.Location = New System.Drawing.Point(8, 136) - Me.CountryGrid.Name = "CountryGrid" - Me.CountryGrid.PreferredColumnWidth = 100 - Me.CountryGrid.Size = New System.Drawing.Size(440, 136) - Me.CountryGrid.TabIndex = 4 - Me.CountryGrid.TableStyles.AddRange(New System.Windows.Forms.DataGridTableStyle() {Me.DataGridTableStyle1}) - ' - 'DataGridTableStyle1 - ' - Me.DataGridTableStyle1.DataGrid = Me.CountryGrid - Me.DataGridTableStyle1.GridColumnStyles.AddRange(New System.Windows.Forms.DataGridColumnStyle() {Me.TextBoxCountryname, Me.TextBoxpopulation, Me.TextBoxLanguage, Me.TextBoxCurrency}) - Me.DataGridTableStyle1.HeaderForeColor = System.Drawing.SystemColors.ControlText - ' - 'TextBoxCountryname - ' - Me.TextBoxCountryname.Format = "" - Me.TextBoxCountryname.FormatInfo = Nothing - Me.TextBoxCountryname.MappingName = "COUNTRYNAME" - Me.TextBoxCountryname.ReadOnly = True - Me.TextBoxCountryname.Width = 20 - ' - 'TextBoxpopulation - ' - Me.TextBoxpopulation.Format = "" - Me.TextBoxpopulation.FormatInfo = Nothing - Me.TextBoxpopulation.MappingName = "POPULATION" - Me.TextBoxpopulation.ReadOnly = True - Me.TextBoxpopulation.Width = 20 - ' - 'TextBoxLanguage - ' - Me.TextBoxLanguage.Format = "" - Me.TextBoxLanguage.FormatInfo = Nothing - Me.TextBoxLanguage.MappingName = "LANGUAGE" - Me.TextBoxLanguage.NullText = "NULL" - Me.TextBoxLanguage.Width = 20 - ' - 'TextBoxCurrency - ' - Me.TextBoxCurrency.Format = "" - Me.TextBoxCurrency.FormatInfo = Nothing - Me.TextBoxCurrency.MappingName = "CURRENCY" - Me.TextBoxCurrency.NullText = "NULL" - Me.TextBoxCurrency.Width = 20 - ' - 'RowUpdate - ' - Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) - Me.ClientSize = New System.Drawing.Size(552, 514) - Me.Controls.Add(Me.CountryGrid) - Me.Controls.Add(Me.ButtonApply) - Me.Controls.Add(Me.GroupBox2) - Me.Controls.Add(Me.GroupBoxupdating1) - Me.Controls.Add(Me.ButtonUpdate) - Me.Controls.Add(Me.Password) - Me.Controls.Add(Me.PasswordLabel) - Me.Controls.Add(Me.UserName) - Me.Controls.Add(Me.UserNameLabel) - Me.Controls.Add(Me.GroupBox1) - Me.Controls.Add(Me.Label1) - Me.Controls.Add(Me.Connection) - Me.Controls.Add(Me.Label2) - Me.MaximizeBox = False - Me.MaximumSize = New System.Drawing.Size(568, 552) - Me.MinimumSize = New System.Drawing.Size(568, 552) - Me.Name = "RowUpdate" - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Text = "Row Update Event Handler Application" - Me.GroupBox1.ResumeLayout(False) - Me.GroupBox1.PerformLayout() - Me.Connection.ResumeLayout(False) - Me.Connection.PerformLayout() - Me.GroupBoxupdating1.ResumeLayout(False) - Me.GroupBox2.ResumeLayout(False) - CType(Me.CountryGrid, System.ComponentModel.ISupportInitialize).EndInit() - Me.ResumeLayout(False) - Me.PerformLayout() - - End Sub - -#End Region - - '************************************************************************** - 'This method handles the Connect button click event. With the help of DBAccess - 'class it tries to connect to the database. If connection is obtained then - 'other GUI components are enabled. - '************************************************************************** - Private Sub ButtonConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonConnect.Click - - ButtonExit.Enabled = False - Dim tempStr As String = UserName.Text - Dim flag As Boolean = True - 'Check if Username width is more than 0 characters - If (tempStr.Length = 0) Then - flag = False - MessageBox.Show("Username cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) - Return - End If - tempStr = Password.Text - 'Check if Password width is more than 0 characters - If (tempStr.Length = 0) Then - flag = False - MessageBox.Show("Password cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) - Return - End If - tempStr = DataSource.Text - 'Check if dataSource width is more than 0 characters - If (tempStr.Length = 0) Then - flag = False - MessageBox.Show("DataSource cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) - Return - End If - - If (flag = True) Then - 'Trying to connect disable connect button - ButtonConnect.Enabled = False - 'Try to connect to the database - dba.connect(UserName.Text, Password.Text, DataSource.Text) - 'If no exception is thrown set status to true - statusbool = True - End If - - 'Check if the program is connected to the database and enable user - 'controls if it is connected. - flag = dba.isConnected - If (flag = True) Then - Status.Text = "Connected" - Status.ForeColor = Color.Green - Status.Update() - dba.CreateTable() - dba.PopulateDataGrid(CountryGrid) - ButtonUpdate.Enabled = True - UpdatingEnabled.Enabled = True - UpdatingDisabled.Enabled = True - UpdatedEnabled.Enabled = True - UpdatedDisabled.Enabled = True - ButtonApply.Enabled = True - ButtonConnect.Enabled = False - ButtonDisconnect.Enabled = True - ButtonExit.Enabled = False - CountryGrid.Enabled = True - ButtonUpdate.Enabled = True - ButtonApply.Enabled = True - ButtonExit.Enabled = False - Else - 'Not connected to database enable connect button - Status.Text = "Not Connected" - Status.ForeColor = Color.Red - ButtonConnect.Enabled = True - ButtonDisconnect.Enabled = False - ButtonUpdate.Enabled = False - ButtonApply.Enabled = False - ButtonExit.Enabled = True - End If - - End Sub - - '************************************************************************** - 'This method handles the Exit button click event. Closes the connection and - 'exits the application. - '************************************************************************** - Private Sub ButtonExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonExit.Click - 'Update status text and color - Status.Text = "Exiting, Please wait" - Status.ForeColor = Color.Red - Status.Update() - Thread.CurrentThread.Sleep(1500) - 'Exit the application - Application.Exit() - End Sub - - '************************************************************************** - 'This method handles the Update button click event. Updates the database with - 'the modified DataGrid entries. - '************************************************************************** - Private Sub ButtonUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonUpdate.Click - 'Update the database - dba.UpdateRecords() - End Sub - - '************************************************************************** - 'This method handles the Apply button click event. Either registers or - 'de-registers the event handlers depending on radio button states. - '************************************************************************** - Private Sub ButtonApply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonApply.Click - - 'Check the radio buttons that are selected and call appropriate methods. - If (UpdatingEnabled.Checked = True) Then - dba.AddUpdatingHandler() - End If - - If (UpdatingDisabled.Checked = True) Then - dba.RemoveUpdatingHandler() - End If - - If (UpdatedEnabled.Checked = True) Then - dba.AddUpdatedHandler() - End If - - If (UpdatedDisabled.Checked = True) Then - dba.RemoveUpdatedHandler() - End If - StatusBox.AppendText("Event Handlers Updated" + Environment.NewLine) - StatusBox.Update() - End Sub - - '************************************************************************** - 'This method prevents insertion of new row - '************************************************************************** - Private Sub CountryGrid_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CountryGrid.CurrentCellChanged - If (CountryGrid.CurrentCell.RowNumber > 3) Then - CountryGrid.CurrentCell = New DataGridCell(3, CountryGrid.CurrentCell.ColumnNumber) - End If - End Sub - - '************************************************************************** - 'This method is called when users press Disconnect button - '************************************************************************** - Private Sub ButtonDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDisconnect.Click - ButtonDisconnect.Enabled = False - CountryGrid.Enabled = False - dba.RemoveUpdatedHandler() - dba.RemoveUpdatingHandler() - ButtonUpdate.Enabled = False - ButtonApply.Enabled = False - dba.closeConnection() - Status.Text = "Not Connected" - Status.ForeColor = Color.Red - ButtonExit.Enabled = True - ButtonConnect.Enabled = True - ButtonExit.Enabled = True - End Sub - - '************************************************************************** - 'This method is called when user closes the form - '************************************************************************** - Private Sub Form_Close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closed - ButtonUpdate.Enabled = False - ButtonApply.Enabled = False - ButtonExit.Enabled = False - ButtonConnect.Enabled = False - ButtonDisconnect.Enabled = False - dba.closeConnection() - Application.Exit() - End Sub - - -End Class +Imports System.Threading +Public Class RowUpdate + Inherits System.Windows.Forms.Form + Protected dba As DBAccess + Protected statusbool As Boolean + +#Region " Windows Form Designer generated code " + + Public Sub New() + MyBase.New() + + 'This call is required by the Windows Form Designer. + InitializeComponent() + + 'Add any initialization after the InitializeComponent() call + 'Create instance of the database access helper class and pass the reference + 'of status window to this object + dba = New DBAccess(StatusBox) + End Sub + + 'Form overrides dispose to clean up the component list. + Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) + If disposing Then + If Not (components Is Nothing) Then + components.Dispose() + End If + End If + MyBase.Dispose(disposing) + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + Friend WithEvents Label1 As System.Windows.Forms.Label + Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox + Friend WithEvents Connection As System.Windows.Forms.GroupBox + Friend WithEvents UserNameLabel As System.Windows.Forms.Label + Friend WithEvents UserName As System.Windows.Forms.TextBox + Friend WithEvents PasswordLabel As System.Windows.Forms.Label + Friend WithEvents Password As System.Windows.Forms.TextBox + Friend WithEvents ConnectStringLabel As System.Windows.Forms.Label + Friend WithEvents ButtonConnect As System.Windows.Forms.Button + Friend WithEvents ButtonExit As System.Windows.Forms.Button + Friend WithEvents StatusLabel As System.Windows.Forms.Label + Friend WithEvents Status As System.Windows.Forms.Label + Friend WithEvents StatusBox As System.Windows.Forms.TextBox + Friend WithEvents DataSource As System.Windows.Forms.TextBox + Friend WithEvents Label2 As System.Windows.Forms.Label + Friend WithEvents ButtonUpdate As System.Windows.Forms.Button + Friend WithEvents GroupBoxupdating1 As System.Windows.Forms.GroupBox + Friend WithEvents GroupBox2 As System.Windows.Forms.GroupBox + Friend WithEvents UpdatingEnabled As System.Windows.Forms.RadioButton + Friend WithEvents UpdatingDisabled As System.Windows.Forms.RadioButton + Friend WithEvents UpdatedEnabled As System.Windows.Forms.RadioButton + Friend WithEvents UpdatedDisabled As System.Windows.Forms.RadioButton + Friend WithEvents ButtonApply As System.Windows.Forms.Button + Friend WithEvents CountryGrid As System.Windows.Forms.DataGrid + Friend WithEvents DataGridTableStyle1 As System.Windows.Forms.DataGridTableStyle + Friend WithEvents TextBoxCountryname As System.Windows.Forms.DataGridTextBoxColumn + Friend WithEvents TextBoxpopulation As System.Windows.Forms.DataGridTextBoxColumn + Friend WithEvents TextBoxLanguage As System.Windows.Forms.DataGridTextBoxColumn + Friend WithEvents TextBoxCurrency As System.Windows.Forms.DataGridTextBoxColumn + Friend WithEvents ButtonDisconnect As System.Windows.Forms.Button + Private Sub InitializeComponent() + Me.Label1 = New System.Windows.Forms.Label + Me.GroupBox1 = New System.Windows.Forms.GroupBox + Me.StatusBox = New System.Windows.Forms.TextBox + Me.UserNameLabel = New System.Windows.Forms.Label + Me.UserName = New System.Windows.Forms.TextBox + Me.PasswordLabel = New System.Windows.Forms.Label + Me.Password = New System.Windows.Forms.TextBox + Me.Connection = New System.Windows.Forms.GroupBox + Me.ButtonDisconnect = New System.Windows.Forms.Button + Me.Status = New System.Windows.Forms.Label + Me.StatusLabel = New System.Windows.Forms.Label + Me.ButtonExit = New System.Windows.Forms.Button + Me.ButtonConnect = New System.Windows.Forms.Button + Me.DataSource = New System.Windows.Forms.TextBox + Me.ConnectStringLabel = New System.Windows.Forms.Label + Me.Label2 = New System.Windows.Forms.Label + Me.ButtonUpdate = New System.Windows.Forms.Button + Me.GroupBoxupdating1 = New System.Windows.Forms.GroupBox + Me.UpdatingDisabled = New System.Windows.Forms.RadioButton + Me.UpdatingEnabled = New System.Windows.Forms.RadioButton + Me.GroupBox2 = New System.Windows.Forms.GroupBox + Me.UpdatedDisabled = New System.Windows.Forms.RadioButton + Me.UpdatedEnabled = New System.Windows.Forms.RadioButton + Me.ButtonApply = New System.Windows.Forms.Button + Me.CountryGrid = New System.Windows.Forms.DataGrid + Me.DataGridTableStyle1 = New System.Windows.Forms.DataGridTableStyle + Me.TextBoxCountryname = New System.Windows.Forms.DataGridTextBoxColumn + Me.TextBoxpopulation = New System.Windows.Forms.DataGridTextBoxColumn + Me.TextBoxLanguage = New System.Windows.Forms.DataGridTextBoxColumn + Me.TextBoxCurrency = New System.Windows.Forms.DataGridTextBoxColumn + Me.GroupBox1.SuspendLayout() + Me.Connection.SuspendLayout() + Me.GroupBoxupdating1.SuspendLayout() + Me.GroupBox2.SuspendLayout() + CType(Me.CountryGrid, System.ComponentModel.ISupportInitialize).BeginInit() + Me.SuspendLayout() + ' + 'Label1 + ' + Me.Label1.Font = New System.Drawing.Font("Arial", 16.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Label1.Location = New System.Drawing.Point(24, 8) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(496, 24) + Me.Label1.TabIndex = 0 + Me.Label1.Text = "Row Update Event Handler Application" + Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter + ' + 'GroupBox1 + ' + Me.GroupBox1.Controls.Add(Me.StatusBox) + Me.GroupBox1.Location = New System.Drawing.Point(8, 336) + Me.GroupBox1.Name = "GroupBox1" + Me.GroupBox1.Size = New System.Drawing.Size(544, 184) + Me.GroupBox1.TabIndex = 1 + Me.GroupBox1.TabStop = False + Me.GroupBox1.Text = "Status Window" + ' + 'StatusBox + ' + Me.StatusBox.Font = New System.Drawing.Font("Verdana", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.StatusBox.Location = New System.Drawing.Point(8, 16) + Me.StatusBox.Multiline = True + Me.StatusBox.Name = "StatusBox" + Me.StatusBox.ReadOnly = True + Me.StatusBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical + Me.StatusBox.Size = New System.Drawing.Size(528, 160) + Me.StatusBox.TabIndex = 35 + ' + 'UserNameLabel + ' + Me.UserNameLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!) + Me.UserNameLabel.Location = New System.Drawing.Point(16, 56) + Me.UserNameLabel.Name = "UserNameLabel" + Me.UserNameLabel.Size = New System.Drawing.Size(80, 16) + Me.UserNameLabel.TabIndex = 0 + Me.UserNameLabel.Text = "User Name" + ' + 'UserName + ' + Me.UserName.Location = New System.Drawing.Point(96, 56) + Me.UserName.Name = "UserName" + Me.UserName.Size = New System.Drawing.Size(88, 20) + Me.UserName.TabIndex = 0 + Me.UserName.Text = "scott" + ' + 'PasswordLabel + ' + Me.PasswordLabel.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.25!) + Me.PasswordLabel.Location = New System.Drawing.Point(192, 56) + Me.PasswordLabel.Name = "PasswordLabel" + Me.PasswordLabel.Size = New System.Drawing.Size(72, 24) + Me.PasswordLabel.TabIndex = 0 + Me.PasswordLabel.Text = "Password" + ' + 'Password + ' + Me.Password.Location = New System.Drawing.Point(264, 56) + Me.Password.Name = "Password" + Me.Password.Size = New System.Drawing.Size(80, 20) + Me.Password.TabIndex = 1 + Me.Password.Text = "" + ' + 'Connection + ' + Me.Connection.Controls.Add(Me.ButtonDisconnect) + Me.Connection.Controls.Add(Me.Status) + Me.Connection.Controls.Add(Me.StatusLabel) + Me.Connection.Controls.Add(Me.ButtonExit) + Me.Connection.Controls.Add(Me.ButtonConnect) + Me.Connection.Controls.Add(Me.DataSource) + Me.Connection.Controls.Add(Me.ConnectStringLabel) + Me.Connection.Location = New System.Drawing.Point(8, 40) + Me.Connection.Name = "Connection" + Me.Connection.Size = New System.Drawing.Size(544, 80) + Me.Connection.TabIndex = 0 + Me.Connection.TabStop = False + Me.Connection.Text = "Connection Details" + ' + 'ButtonDisconnect + ' + Me.ButtonDisconnect.Enabled = False + Me.ButtonDisconnect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.ButtonDisconnect.Location = New System.Drawing.Point(336, 48) + Me.ButtonDisconnect.Name = "ButtonDisconnect" + Me.ButtonDisconnect.Size = New System.Drawing.Size(88, 24) + Me.ButtonDisconnect.TabIndex = 2 + Me.ButtonDisconnect.Text = "Disconnect " + ' + 'Status + ' + Me.Status.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.Status.ForeColor = System.Drawing.Color.Red + Me.Status.ImageAlign = System.Drawing.ContentAlignment.BottomCenter + Me.Status.Location = New System.Drawing.Point(80, 56) + Me.Status.Name = "Status" + Me.Status.Size = New System.Drawing.Size(120, 16) + Me.Status.TabIndex = 0 + Me.Status.Text = "Not Connected" + ' + 'StatusLabel + ' + Me.StatusLabel.Font = New System.Drawing.Font("Arial", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.StatusLabel.Location = New System.Drawing.Point(16, 56) + Me.StatusLabel.Name = "StatusLabel" + Me.StatusLabel.Size = New System.Drawing.Size(48, 16) + Me.StatusLabel.TabIndex = 0 + Me.StatusLabel.Text = "Status: " + ' + 'ButtonExit + ' + Me.ButtonExit.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.ButtonExit.Location = New System.Drawing.Point(448, 48) + Me.ButtonExit.Name = "ButtonExit" + Me.ButtonExit.Size = New System.Drawing.Size(88, 24) + Me.ButtonExit.TabIndex = 2 + Me.ButtonExit.Text = "Exit" + ' + 'ButtonConnect + ' + Me.ButtonConnect.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) + Me.ButtonConnect.Location = New System.Drawing.Point(224, 48) + Me.ButtonConnect.Name = "ButtonConnect" + Me.ButtonConnect.Size = New System.Drawing.Size(88, 24) + Me.ButtonConnect.TabIndex = 1 + Me.ButtonConnect.Text = "Connect " + ' + 'DataSource + ' + Me.DataSource.Location = New System.Drawing.Point(448, 16) + Me.DataSource.Name = "DataSource" + Me.DataSource.Size = New System.Drawing.Size(88, 20) + Me.DataSource.TabIndex = 0 + Me.DataSource.Text = "oracle" + ' + 'ConnectStringLabel + ' + Me.ConnectStringLabel.Font = New System.Drawing.Font("Arial", 10.25!) + Me.ConnectStringLabel.Location = New System.Drawing.Point(344, 16) + Me.ConnectStringLabel.Name = "ConnectStringLabel" + Me.ConnectStringLabel.Size = New System.Drawing.Size(104, 24) + Me.ConnectStringLabel.TabIndex = 4 + Me.ConnectStringLabel.Text = "Data Source" + ' + 'Label2 + ' + Me.Label2.Font = New System.Drawing.Font("Arial", 10.25!, System.Drawing.FontStyle.Bold) + Me.Label2.Location = New System.Drawing.Point(216, 8) + Me.Label2.Name = "Label2" + Me.Label2.Size = New System.Drawing.Size(96, 24) + Me.Label2.TabIndex = 0 + Me.Label2.Text = "Source Code " + ' + 'ButtonUpdate + ' + Me.ButtonUpdate.Enabled = False + Me.ButtonUpdate.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold) + Me.ButtonUpdate.Location = New System.Drawing.Point(456, 248) + Me.ButtonUpdate.Name = "ButtonUpdate" + Me.ButtonUpdate.Size = New System.Drawing.Size(88, 24) + Me.ButtonUpdate.TabIndex = 2 + Me.ButtonUpdate.Text = "Update" + ' + 'GroupBoxupdating1 + ' + Me.GroupBoxupdating1.Controls.Add(Me.UpdatingDisabled) + Me.GroupBoxupdating1.Controls.Add(Me.UpdatingEnabled) + Me.GroupBoxupdating1.Location = New System.Drawing.Point(8, 280) + Me.GroupBoxupdating1.Name = "GroupBoxupdating1" + Me.GroupBoxupdating1.Size = New System.Drawing.Size(208, 48) + Me.GroupBoxupdating1.TabIndex = 10 + Me.GroupBoxupdating1.TabStop = False + Me.GroupBoxupdating1.Text = "OracleRowUpdatingEventHandler" + ' + 'UpdatingDisabled + ' + Me.UpdatingDisabled.Enabled = False + Me.UpdatingDisabled.Location = New System.Drawing.Point(112, 24) + Me.UpdatingDisabled.Name = "UpdatingDisabled" + Me.UpdatingDisabled.Size = New System.Drawing.Size(72, 16) + Me.UpdatingDisabled.TabIndex = 1 + Me.UpdatingDisabled.Text = "Disabled" + ' + 'UpdatingEnabled + ' + Me.UpdatingEnabled.Checked = True + Me.UpdatingEnabled.Enabled = False + Me.UpdatingEnabled.Location = New System.Drawing.Point(24, 24) + Me.UpdatingEnabled.Name = "UpdatingEnabled" + Me.UpdatingEnabled.Size = New System.Drawing.Size(112, 16) + Me.UpdatingEnabled.TabIndex = 0 + Me.UpdatingEnabled.TabStop = True + Me.UpdatingEnabled.Text = "Enabled" + ' + 'GroupBox2 + ' + Me.GroupBox2.Controls.Add(Me.UpdatedDisabled) + Me.GroupBox2.Controls.Add(Me.UpdatedEnabled) + Me.GroupBox2.Location = New System.Drawing.Point(240, 280) + Me.GroupBox2.Name = "GroupBox2" + Me.GroupBox2.Size = New System.Drawing.Size(208, 48) + Me.GroupBox2.TabIndex = 11 + Me.GroupBox2.TabStop = False + Me.GroupBox2.Text = "OracleRowUpdatedEventHandler" + ' + 'UpdatedDisabled + ' + Me.UpdatedDisabled.Enabled = False + Me.UpdatedDisabled.Location = New System.Drawing.Point(96, 24) + Me.UpdatedDisabled.Name = "UpdatedDisabled" + Me.UpdatedDisabled.Size = New System.Drawing.Size(72, 16) + Me.UpdatedDisabled.TabIndex = 1 + Me.UpdatedDisabled.Text = "Disabled" + ' + 'UpdatedEnabled + ' + Me.UpdatedEnabled.Checked = True + Me.UpdatedEnabled.Enabled = False + Me.UpdatedEnabled.Location = New System.Drawing.Point(16, 24) + Me.UpdatedEnabled.Name = "UpdatedEnabled" + Me.UpdatedEnabled.Size = New System.Drawing.Size(104, 16) + Me.UpdatedEnabled.TabIndex = 0 + Me.UpdatedEnabled.TabStop = True + Me.UpdatedEnabled.Text = "Enabled" + ' + 'ButtonApply + ' + Me.ButtonApply.Enabled = False + Me.ButtonApply.Location = New System.Drawing.Point(456, 304) + Me.ButtonApply.Name = "ButtonApply" + Me.ButtonApply.Size = New System.Drawing.Size(88, 24) + Me.ButtonApply.TabIndex = 3 + Me.ButtonApply.Text = "Apply" + ' + 'CountryGrid + ' + Me.CountryGrid.CaptionText = "Country Table" + Me.CountryGrid.DataMember = "" + Me.CountryGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText + Me.CountryGrid.Location = New System.Drawing.Point(8, 136) + Me.CountryGrid.Name = "CountryGrid" + Me.CountryGrid.PreferredColumnWidth = 100 + Me.CountryGrid.Size = New System.Drawing.Size(440, 136) + Me.CountryGrid.TabIndex = 4 + Me.CountryGrid.TableStyles.AddRange(New System.Windows.Forms.DataGridTableStyle() {Me.DataGridTableStyle1}) + ' + 'DataGridTableStyle1 + ' + Me.DataGridTableStyle1.DataGrid = Me.CountryGrid + Me.DataGridTableStyle1.GridColumnStyles.AddRange(New System.Windows.Forms.DataGridColumnStyle() {Me.TextBoxCountryname, Me.TextBoxpopulation, Me.TextBoxLanguage, Me.TextBoxCurrency}) + Me.DataGridTableStyle1.HeaderForeColor = System.Drawing.SystemColors.ControlText + ' + 'TextBoxCountryname + ' + Me.TextBoxCountryname.Format = "" + Me.TextBoxCountryname.FormatInfo = Nothing + Me.TextBoxCountryname.MappingName = "COUNTRYNAME" + Me.TextBoxCountryname.ReadOnly = True + Me.TextBoxCountryname.Width = 20 + ' + 'TextBoxpopulation + ' + Me.TextBoxpopulation.Format = "" + Me.TextBoxpopulation.FormatInfo = Nothing + Me.TextBoxpopulation.MappingName = "POPULATION" + Me.TextBoxpopulation.ReadOnly = True + Me.TextBoxpopulation.Width = 20 + ' + 'TextBoxLanguage + ' + Me.TextBoxLanguage.Format = "" + Me.TextBoxLanguage.FormatInfo = Nothing + Me.TextBoxLanguage.MappingName = "LANGUAGE" + Me.TextBoxLanguage.NullText = "NULL" + Me.TextBoxLanguage.Width = 20 + ' + 'TextBoxCurrency + ' + Me.TextBoxCurrency.Format = "" + Me.TextBoxCurrency.FormatInfo = Nothing + Me.TextBoxCurrency.MappingName = "CURRENCY" + Me.TextBoxCurrency.NullText = "NULL" + Me.TextBoxCurrency.Width = 20 + ' + 'RowUpdate + ' + Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) + Me.ClientSize = New System.Drawing.Size(552, 514) + Me.Controls.Add(Me.CountryGrid) + Me.Controls.Add(Me.ButtonApply) + Me.Controls.Add(Me.GroupBox2) + Me.Controls.Add(Me.GroupBoxupdating1) + Me.Controls.Add(Me.ButtonUpdate) + Me.Controls.Add(Me.Password) + Me.Controls.Add(Me.PasswordLabel) + Me.Controls.Add(Me.UserName) + Me.Controls.Add(Me.UserNameLabel) + Me.Controls.Add(Me.GroupBox1) + Me.Controls.Add(Me.Label1) + Me.Controls.Add(Me.Connection) + Me.Controls.Add(Me.Label2) + Me.MaximizeBox = False + Me.MaximumSize = New System.Drawing.Size(568, 552) + Me.MinimumSize = New System.Drawing.Size(568, 552) + Me.Name = "RowUpdate" + Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen + Me.Text = "Row Update Event Handler Application" + Me.GroupBox1.ResumeLayout(False) + Me.GroupBox1.PerformLayout() + Me.Connection.ResumeLayout(False) + Me.Connection.PerformLayout() + Me.GroupBoxupdating1.ResumeLayout(False) + Me.GroupBox2.ResumeLayout(False) + CType(Me.CountryGrid, System.ComponentModel.ISupportInitialize).EndInit() + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + +#End Region + + '************************************************************************** + 'This method handles the Connect button click event. With the help of DBAccess + 'class it tries to connect to the database. If connection is obtained then + 'other GUI components are enabled. + '************************************************************************** + Private Sub ButtonConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonConnect.Click + + ButtonExit.Enabled = False + Dim tempStr As String = UserName.Text + Dim flag As Boolean = True + 'Check if Username width is more than 0 characters + If (tempStr.Length = 0) Then + flag = False + MessageBox.Show("Username cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) + Return + End If + tempStr = Password.Text + 'Check if Password width is more than 0 characters + If (tempStr.Length = 0) Then + flag = False + MessageBox.Show("Password cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) + Return + End If + tempStr = DataSource.Text + 'Check if dataSource width is more than 0 characters + If (tempStr.Length = 0) Then + flag = False + MessageBox.Show("DataSource cannot be a null String", "Error Message", MessageBoxButtons.OK, MessageBoxIcon.Error) + Return + End If + + If (flag = True) Then + 'Trying to connect disable connect button + ButtonConnect.Enabled = False + 'Try to connect to the database + dba.connect(UserName.Text, Password.Text, DataSource.Text) + 'If no exception is thrown set status to true + statusbool = True + End If + + 'Check if the program is connected to the database and enable user + 'controls if it is connected. + flag = dba.isConnected + If (flag = True) Then + Status.Text = "Connected" + Status.ForeColor = Color.Green + Status.Update() + dba.CreateTable() + dba.PopulateDataGrid(CountryGrid) + ButtonUpdate.Enabled = True + UpdatingEnabled.Enabled = True + UpdatingDisabled.Enabled = True + UpdatedEnabled.Enabled = True + UpdatedDisabled.Enabled = True + ButtonApply.Enabled = True + ButtonConnect.Enabled = False + ButtonDisconnect.Enabled = True + ButtonExit.Enabled = False + CountryGrid.Enabled = True + ButtonUpdate.Enabled = True + ButtonApply.Enabled = True + ButtonExit.Enabled = False + Else + 'Not connected to database enable connect button + Status.Text = "Not Connected" + Status.ForeColor = Color.Red + ButtonConnect.Enabled = True + ButtonDisconnect.Enabled = False + ButtonUpdate.Enabled = False + ButtonApply.Enabled = False + ButtonExit.Enabled = True + End If + + End Sub + + '************************************************************************** + 'This method handles the Exit button click event. Closes the connection and + 'exits the application. + '************************************************************************** + Private Sub ButtonExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonExit.Click + 'Update status text and color + Status.Text = "Exiting, Please wait" + Status.ForeColor = Color.Red + Status.Update() + Thread.CurrentThread.Sleep(1500) + 'Exit the application + Application.Exit() + End Sub + + '************************************************************************** + 'This method handles the Update button click event. Updates the database with + 'the modified DataGrid entries. + '************************************************************************** + Private Sub ButtonUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonUpdate.Click + 'Update the database + dba.UpdateRecords() + End Sub + + '************************************************************************** + 'This method handles the Apply button click event. Either registers or + 'de-registers the event handlers depending on radio button states. + '************************************************************************** + Private Sub ButtonApply_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonApply.Click + + 'Check the radio buttons that are selected and call appropriate methods. + If (UpdatingEnabled.Checked = True) Then + dba.AddUpdatingHandler() + End If + + If (UpdatingDisabled.Checked = True) Then + dba.RemoveUpdatingHandler() + End If + + If (UpdatedEnabled.Checked = True) Then + dba.AddUpdatedHandler() + End If + + If (UpdatedDisabled.Checked = True) Then + dba.RemoveUpdatedHandler() + End If + StatusBox.AppendText("Event Handlers Updated" + Environment.NewLine) + StatusBox.Update() + End Sub + + '************************************************************************** + 'This method prevents insertion of new row + '************************************************************************** + Private Sub CountryGrid_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CountryGrid.CurrentCellChanged + If (CountryGrid.CurrentCell.RowNumber > 3) Then + CountryGrid.CurrentCell = New DataGridCell(3, CountryGrid.CurrentCell.ColumnNumber) + End If + End Sub + + '************************************************************************** + 'This method is called when users press Disconnect button + '************************************************************************** + Private Sub ButtonDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDisconnect.Click + ButtonDisconnect.Enabled = False + CountryGrid.Enabled = False + dba.RemoveUpdatedHandler() + dba.RemoveUpdatingHandler() + ButtonUpdate.Enabled = False + ButtonApply.Enabled = False + dba.closeConnection() + Status.Text = "Not Connected" + Status.ForeColor = Color.Red + ButtonExit.Enabled = True + ButtonConnect.Enabled = True + ButtonExit.Enabled = True + End Sub + + '************************************************************************** + 'This method is called when user closes the form + '************************************************************************** + Private Sub Form_Close(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Closed + ButtonUpdate.Enabled = False + ButtonApply.Enabled = False + ButtonExit.Enabled = False + ButtonConnect.Enabled = False + ButtonDisconnect.Enabled = False + dba.closeConnection() + Application.Exit() + End Sub + + +End Class From e0e54e9a5998be26152c650e09495288a30b01ed Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:29:36 -0700 Subject: [PATCH 34/76] Update Sample7.cs --- samples/ref-cursor/Sample7.cs | 556 +++++++++++++++++----------------- 1 file changed, 278 insertions(+), 278 deletions(-) diff --git a/samples/ref-cursor/Sample7.cs b/samples/ref-cursor/Sample7.cs index ad024b42..460cd2d2 100644 --- a/samples/ref-cursor/Sample7.cs +++ b/samples/ref-cursor/Sample7.cs @@ -15,281 +15,281 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample7 -{ - /// - /// Sample 7: Demonstrates how to selectively obtain - /// OracleDataReader objects from the REF Cursors - /// - class Sample7 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Get 3 RefCursors - OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); - cmd.CommandType = CommandType.StoredProcedure; - - OracleRefCursor[] refCursors = Get3RefCursors(cmd); - - try - { - // Obtain an OracleDataReader for the RefCursors except - // for the first one. - for(int i=1; i - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Header - blr = new StringBuilder(); - blr.Append("CREATE OR REPLACE PACKAGE TEST is "); - blr.Append("TYPE refcursor is ref cursor;"); - blr.Append("FUNCTION Ret1Cur return refCursor;"); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor;"); - - blr.Append("FUNCTION Get1Cur return refCursor;"); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); - blr.Append("clipid in NUMBER);"); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Body - blr = new StringBuilder(); - - blr.Append("create or replace package body TEST is "); - - blr.Append("FUNCTION Ret1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Ret1Cur; "); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("OPEN p_cursor1 for select * from emp; "); - blr.Append("END Get1CurOut; "); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("open p_cursor1 for select * from emp; "); - blr.Append("open p_cursor2 for select * from dept; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get3Cur; "); - - blr.Append("FUNCTION Get1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get1Cur; "); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); - blr.Append("clipid in NUMBER) is "); - blr.Append("BEGIN "); - blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); - blr.Append("END UpdateRefCur; "); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for "); - blr.Append("Select story from multimedia_tab where thekey = 1; "); - blr.Append("END GetStoryForClip1; "); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); - blr.Append("myStory out VARCHAR2) is "); - blr.Append("BEGIN "); - blr.Append("FETCH p_cursor into myStory; "); - blr.Append("END GetRefCurData; "); - - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - - /// - /// Get 3 Ref Cursors with a PL/SQL - /// - /// - /// - public static OracleRefCursor[] Get3RefCursors(OracleCommand cmd) - { - // 1. Get 3 OracleParameters as REF CURSORs - // Set the command - - - // Bind - // select * from multimedia_tab - OracleParameter p1 = cmd.Parameters.Add("refcursor1", - OracleDbType.RefCursor); - p1.Direction = ParameterDirection.ReturnValue; - - // select * from emp - OracleParameter p2 = cmd.Parameters.Add("refcursor2", - OracleDbType.RefCursor); - p2.Direction = ParameterDirection.Output; - - // select * from dept - OracleParameter p3 = cmd.Parameters.Add("refcursor3", - OracleDbType.RefCursor); - p3.Direction = ParameterDirection.Output; - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - OracleRefCursor[] refCursors = new OracleRefCursor[3]; - refCursors[0] = (OracleRefCursor)p1.Value; - refCursors[1] = (OracleRefCursor)p2.Value; - refCursors[2] = (OracleRefCursor)p3.Value; - - return refCursors; - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample7 +{ + /// + /// Sample 7: Demonstrates how to selectively obtain + /// OracleDataReader objects from the REF Cursors + /// + class Sample7 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Get 3 RefCursors + OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); + cmd.CommandType = CommandType.StoredProcedure; + + OracleRefCursor[] refCursors = Get3RefCursors(cmd); + + try + { + // Obtain an OracleDataReader for the RefCursors except + // for the first one. + for(int i=1; i + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Header + blr = new StringBuilder(); + blr.Append("CREATE OR REPLACE PACKAGE TEST is "); + blr.Append("TYPE refcursor is ref cursor;"); + blr.Append("FUNCTION Ret1Cur return refCursor;"); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor;"); + + blr.Append("FUNCTION Get1Cur return refCursor;"); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); + blr.Append("clipid in NUMBER);"); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Body + blr = new StringBuilder(); + + blr.Append("create or replace package body TEST is "); + + blr.Append("FUNCTION Ret1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Ret1Cur; "); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("OPEN p_cursor1 for select * from emp; "); + blr.Append("END Get1CurOut; "); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("open p_cursor1 for select * from emp; "); + blr.Append("open p_cursor2 for select * from dept; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get3Cur; "); + + blr.Append("FUNCTION Get1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get1Cur; "); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); + blr.Append("clipid in NUMBER) is "); + blr.Append("BEGIN "); + blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); + blr.Append("END UpdateRefCur; "); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for "); + blr.Append("Select story from multimedia_tab where thekey = 1; "); + blr.Append("END GetStoryForClip1; "); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); + blr.Append("myStory out VARCHAR2) is "); + blr.Append("BEGIN "); + blr.Append("FETCH p_cursor into myStory; "); + blr.Append("END GetRefCurData; "); + + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + + /// + /// Get 3 Ref Cursors with a PL/SQL + /// + /// + /// + public static OracleRefCursor[] Get3RefCursors(OracleCommand cmd) + { + // 1. Get 3 OracleParameters as REF CURSORs + // Set the command + + + // Bind + // select * from multimedia_tab + OracleParameter p1 = cmd.Parameters.Add("refcursor1", + OracleDbType.RefCursor); + p1.Direction = ParameterDirection.ReturnValue; + + // select * from emp + OracleParameter p2 = cmd.Parameters.Add("refcursor2", + OracleDbType.RefCursor); + p2.Direction = ParameterDirection.Output; + + // select * from dept + OracleParameter p3 = cmd.Parameters.Add("refcursor3", + OracleDbType.RefCursor); + p3.Direction = ParameterDirection.Output; + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + OracleRefCursor[] refCursors = new OracleRefCursor[3]; + refCursors[0] = (OracleRefCursor)p1.Value; + refCursors[1] = (OracleRefCursor)p2.Value; + refCursors[2] = (OracleRefCursor)p3.Value; + + return refCursors; + } + } +} From 1d6190513e934217b206debd1a1b7ae5f3cc43cc Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:30:01 -0700 Subject: [PATCH 35/76] Update Sample6.cs --- samples/ref-cursor/Sample6.cs | 558 +++++++++++++++++----------------- 1 file changed, 279 insertions(+), 279 deletions(-) diff --git a/samples/ref-cursor/Sample6.cs b/samples/ref-cursor/Sample6.cs index 2d32e490..6c69a2e5 100644 --- a/samples/ref-cursor/Sample6.cs +++ b/samples/ref-cursor/Sample6.cs @@ -15,282 +15,282 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample6 -{ - /// - /// Sample 6: Demonstrates how to populate a DataSet with - /// multiple REF Cursors selectively - /// - class Sample6 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Get 3 RefCursors - OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); - cmd.CommandType = CommandType.StoredProcedure; - - OracleRefCursor[] refCursors = Get3RefCursors(cmd); - - try - { - // Create 2 DataTable in a DataSet - DataSet ds = new DataSet(); - ds.Tables.Add(new DataTable("refcur0")); - ds.Tables.Add(new DataTable("refcur2")); - - // Use Adapter.Fill to populate the DataTable using - // only two of the three OracleRefCursor objects - OracleDataAdapter adpt = new OracleDataAdapter(); - adpt.Fill(ds.Tables["refcur0"], refCursors[0]); - adpt.Fill(ds.Tables["refcur2"], refCursors[2]); - - // Display the Row count of each DataTable - Console.WriteLine("Row Count:{0}", ds.Tables["refcur0"].Rows.Count); - Console.WriteLine("Row Count:{0}", ds.Tables["refcur2"].Rows.Count); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Header - blr = new StringBuilder(); - blr.Append("CREATE OR REPLACE PACKAGE TEST is "); - blr.Append("TYPE refcursor is ref cursor;"); - blr.Append("FUNCTION Ret1Cur return refCursor;"); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor;"); - - blr.Append("FUNCTION Get1Cur return refCursor;"); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); - blr.Append("clipid in NUMBER);"); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Body - blr = new StringBuilder(); - - blr.Append("create or replace package body TEST is "); - - blr.Append("FUNCTION Ret1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Ret1Cur; "); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("OPEN p_cursor1 for select * from emp; "); - blr.Append("END Get1CurOut; "); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("open p_cursor1 for select * from emp; "); - blr.Append("open p_cursor2 for select * from dept; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get3Cur; "); - - blr.Append("FUNCTION Get1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get1Cur; "); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); - blr.Append("clipid in NUMBER) is "); - blr.Append("BEGIN "); - blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); - blr.Append("END UpdateRefCur; "); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for "); - blr.Append("Select story from multimedia_tab where thekey = 1; "); - blr.Append("END GetStoryForClip1; "); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); - blr.Append("myStory out VARCHAR2) is "); - blr.Append("BEGIN "); - blr.Append("FETCH p_cursor into myStory; "); - blr.Append("END GetRefCurData; "); - - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - - /// - /// Get 3 Ref Cursors with a PL/SQL - /// - /// - /// - public static OracleRefCursor[] Get3RefCursors(OracleCommand cmd) - { - // 1. Get 3 OracleParameters as REF CURSORs - // Set the command - - - // Bind - // select * from multimedia_tab - OracleParameter p1 = cmd.Parameters.Add("refcursor1", - OracleDbType.RefCursor); - p1.Direction = ParameterDirection.ReturnValue; - - // select * from emp - OracleParameter p2 = cmd.Parameters.Add("refcursor2", - OracleDbType.RefCursor); - p2.Direction = ParameterDirection.Output; - - // select * from dept - OracleParameter p3 = cmd.Parameters.Add("refcursor3", - OracleDbType.RefCursor); - p3.Direction = ParameterDirection.Output; - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - OracleRefCursor[] refCursors = new OracleRefCursor[3]; - refCursors[0] = (OracleRefCursor)p1.Value; - refCursors[1] = (OracleRefCursor)p2.Value; - refCursors[2] = (OracleRefCursor)p3.Value; - - return refCursors; - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample6 +{ + /// + /// Sample 6: Demonstrates how to populate a DataSet with + /// multiple REF Cursors selectively + /// + class Sample6 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Get 3 RefCursors + OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); + cmd.CommandType = CommandType.StoredProcedure; + + OracleRefCursor[] refCursors = Get3RefCursors(cmd); + + try + { + // Create 2 DataTable in a DataSet + DataSet ds = new DataSet(); + ds.Tables.Add(new DataTable("refcur0")); + ds.Tables.Add(new DataTable("refcur2")); + + // Use Adapter.Fill to populate the DataTable using + // only two of the three OracleRefCursor objects + OracleDataAdapter adpt = new OracleDataAdapter(); + adpt.Fill(ds.Tables["refcur0"], refCursors[0]); + adpt.Fill(ds.Tables["refcur2"], refCursors[2]); + + // Display the Row count of each DataTable + Console.WriteLine("Row Count:{0}", ds.Tables["refcur0"].Rows.Count); + Console.WriteLine("Row Count:{0}", ds.Tables["refcur2"].Rows.Count); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Header + blr = new StringBuilder(); + blr.Append("CREATE OR REPLACE PACKAGE TEST is "); + blr.Append("TYPE refcursor is ref cursor;"); + blr.Append("FUNCTION Ret1Cur return refCursor;"); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor;"); + + blr.Append("FUNCTION Get1Cur return refCursor;"); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); + blr.Append("clipid in NUMBER);"); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Body + blr = new StringBuilder(); + + blr.Append("create or replace package body TEST is "); + + blr.Append("FUNCTION Ret1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Ret1Cur; "); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("OPEN p_cursor1 for select * from emp; "); + blr.Append("END Get1CurOut; "); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("open p_cursor1 for select * from emp; "); + blr.Append("open p_cursor2 for select * from dept; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get3Cur; "); + + blr.Append("FUNCTION Get1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get1Cur; "); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); + blr.Append("clipid in NUMBER) is "); + blr.Append("BEGIN "); + blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); + blr.Append("END UpdateRefCur; "); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for "); + blr.Append("Select story from multimedia_tab where thekey = 1; "); + blr.Append("END GetStoryForClip1; "); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); + blr.Append("myStory out VARCHAR2) is "); + blr.Append("BEGIN "); + blr.Append("FETCH p_cursor into myStory; "); + blr.Append("END GetRefCurData; "); + + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + + /// + /// Get 3 Ref Cursors with a PL/SQL + /// + /// + /// + public static OracleRefCursor[] Get3RefCursors(OracleCommand cmd) + { + // 1. Get 3 OracleParameters as REF CURSORs + // Set the command + + + // Bind + // select * from multimedia_tab + OracleParameter p1 = cmd.Parameters.Add("refcursor1", + OracleDbType.RefCursor); + p1.Direction = ParameterDirection.ReturnValue; + + // select * from emp + OracleParameter p2 = cmd.Parameters.Add("refcursor2", + OracleDbType.RefCursor); + p2.Direction = ParameterDirection.Output; + + // select * from dept + OracleParameter p3 = cmd.Parameters.Add("refcursor3", + OracleDbType.RefCursor); + p3.Direction = ParameterDirection.Output; + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + OracleRefCursor[] refCursors = new OracleRefCursor[3]; + refCursors[0] = (OracleRefCursor)p1.Value; + refCursors[1] = (OracleRefCursor)p2.Value; + refCursors[2] = (OracleRefCursor)p3.Value; + + return refCursors; + } + } +} From bbde6e5e03b82712a27bafd8f076750eb3475e63 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:30:32 -0700 Subject: [PATCH 36/76] Update Sample4.cs --- samples/ref-cursor/Sample4.cs | 520 +++++++++++++++++----------------- 1 file changed, 260 insertions(+), 260 deletions(-) diff --git a/samples/ref-cursor/Sample4.cs b/samples/ref-cursor/Sample4.cs index a86a74c1..b6c16e59 100644 --- a/samples/ref-cursor/Sample4.cs +++ b/samples/ref-cursor/Sample4.cs @@ -15,263 +15,263 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample4 -{ - /// - /// Sample 4: Demonstrates how a DataSet can be populated from a - /// REF Cursor. The sample also demonstrates how a REF - /// Cursor can be updated. - /// - class Sample4 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand("TEST.Ret1Cur", con); - cmd.CommandType = CommandType.StoredProcedure; - - // Bind - // TEST.Ret1Cur is a function so ParameterDirection is ReturnValue. - OracleParameter param = cmd.Parameters.Add("refcursor", - OracleDbType.RefCursor); - param.Direction = ParameterDirection.ReturnValue; - - // Create an OracleDataAdapter - OracleDataAdapter da = new OracleDataAdapter(cmd); - - try - { - // 1. Demostrate populating a DataSet with RefCursor - // Populate a DataSet - DataSet ds = new DataSet(); - da.FillSchema(ds, SchemaType.Source, "myRefCursor"); - da.Fill(ds, "myRefCursor"); - - // Obtain the row which we want to modify - DataRow[] rowsWanted = ds.Tables["myRefCursor"].Select("THEKEY = 1"); - - // 2. Demostrate how to update with RefCursor - // Update the "story" column - rowsWanted[0]["story"] = "New story"; - - // Setup the update command on the DataAdapter - OracleCommand updcmd = new OracleCommand("TEST.UpdateREFCur", con); - updcmd.CommandType = CommandType.StoredProcedure; - - OracleParameter param1 = updcmd.Parameters.Add("myStory", - OracleDbType.Varchar2, 32); - param1.SourceVersion = DataRowVersion.Current; - param1.SourceColumn = "STORY"; - OracleParameter param2 = updcmd.Parameters.Add("myClipId", - OracleDbType.Decimal); - param2.SourceColumn = "THEKEY"; - param2.SourceVersion = DataRowVersion.Original; - - da.UpdateCommand = updcmd; - - // Update - da.Update(ds, "myRefCursor"); - Console.WriteLine("Data has been updated."); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Header - blr = new StringBuilder(); - blr.Append("CREATE OR REPLACE PACKAGE TEST is "); - blr.Append("TYPE refcursor is ref cursor;"); - blr.Append("FUNCTION Ret1Cur return refCursor;"); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor;"); - - blr.Append("FUNCTION Get1Cur return refCursor;"); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); - blr.Append("clipid in NUMBER);"); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Body - blr = new StringBuilder(); - - blr.Append("create or replace package body TEST is "); - - blr.Append("FUNCTION Ret1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Ret1Cur; "); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("OPEN p_cursor1 for select * from emp; "); - blr.Append("END Get1CurOut; "); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("open p_cursor1 for select * from emp; "); - blr.Append("open p_cursor2 for select * from dept; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get3Cur; "); - - blr.Append("FUNCTION Get1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get1Cur; "); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); - blr.Append("clipid in NUMBER) is "); - blr.Append("BEGIN "); - blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); - blr.Append("END UpdateRefCur; "); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for "); - blr.Append("Select story from multimedia_tab where thekey = 1; "); - blr.Append("END GetStoryForClip1; "); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); - blr.Append("myStory out VARCHAR2) is "); - blr.Append("BEGIN "); - blr.Append("FETCH p_cursor into myStory; "); - blr.Append("END GetRefCurData; "); - - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample4 +{ + /// + /// Sample 4: Demonstrates how a DataSet can be populated from a + /// REF Cursor. The sample also demonstrates how a REF + /// Cursor can be updated. + /// + class Sample4 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand("TEST.Ret1Cur", con); + cmd.CommandType = CommandType.StoredProcedure; + + // Bind + // TEST.Ret1Cur is a function so ParameterDirection is ReturnValue. + OracleParameter param = cmd.Parameters.Add("refcursor", + OracleDbType.RefCursor); + param.Direction = ParameterDirection.ReturnValue; + + // Create an OracleDataAdapter + OracleDataAdapter da = new OracleDataAdapter(cmd); + + try + { + // 1. Demostrate populating a DataSet with RefCursor + // Populate a DataSet + DataSet ds = new DataSet(); + da.FillSchema(ds, SchemaType.Source, "myRefCursor"); + da.Fill(ds, "myRefCursor"); + + // Obtain the row which we want to modify + DataRow[] rowsWanted = ds.Tables["myRefCursor"].Select("THEKEY = 1"); + + // 2. Demostrate how to update with RefCursor + // Update the "story" column + rowsWanted[0]["story"] = "New story"; + + // Setup the update command on the DataAdapter + OracleCommand updcmd = new OracleCommand("TEST.UpdateREFCur", con); + updcmd.CommandType = CommandType.StoredProcedure; + + OracleParameter param1 = updcmd.Parameters.Add("myStory", + OracleDbType.Varchar2, 32); + param1.SourceVersion = DataRowVersion.Current; + param1.SourceColumn = "STORY"; + OracleParameter param2 = updcmd.Parameters.Add("myClipId", + OracleDbType.Decimal); + param2.SourceColumn = "THEKEY"; + param2.SourceVersion = DataRowVersion.Original; + + da.UpdateCommand = updcmd; + + // Update + da.Update(ds, "myRefCursor"); + Console.WriteLine("Data has been updated."); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Header + blr = new StringBuilder(); + blr.Append("CREATE OR REPLACE PACKAGE TEST is "); + blr.Append("TYPE refcursor is ref cursor;"); + blr.Append("FUNCTION Ret1Cur return refCursor;"); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor;"); + + blr.Append("FUNCTION Get1Cur return refCursor;"); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); + blr.Append("clipid in NUMBER);"); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Body + blr = new StringBuilder(); + + blr.Append("create or replace package body TEST is "); + + blr.Append("FUNCTION Ret1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Ret1Cur; "); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("OPEN p_cursor1 for select * from emp; "); + blr.Append("END Get1CurOut; "); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("open p_cursor1 for select * from emp; "); + blr.Append("open p_cursor2 for select * from dept; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get3Cur; "); + + blr.Append("FUNCTION Get1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get1Cur; "); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); + blr.Append("clipid in NUMBER) is "); + blr.Append("BEGIN "); + blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); + blr.Append("END UpdateRefCur; "); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for "); + blr.Append("Select story from multimedia_tab where thekey = 1; "); + blr.Append("END GetStoryForClip1; "); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); + blr.Append("myStory out VARCHAR2) is "); + blr.Append("BEGIN "); + blr.Append("FETCH p_cursor into myStory; "); + blr.Append("END GetRefCurData; "); + + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 6769fb89e54233bb1a5d80b02073ffaf1d69cb9f Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:30:59 -0700 Subject: [PATCH 37/76] Update sample1.cs --- samples/ref-cursor/sample1.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/ref-cursor/sample1.cs b/samples/ref-cursor/sample1.cs index a7181d37..7f4de580 100644 --- a/samples/ref-cursor/sample1.cs +++ b/samples/ref-cursor/sample1.cs @@ -35,7 +35,7 @@ class Sample1 /// static void Main(string[] args) { - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; + string constr = "User Id=scott;Password=;Data Source=oracle"; // Connect OracleConnection con = Connect(constr); From 42dd1504071499c8e9e106c38b1ad469a836668c Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:31:18 -0700 Subject: [PATCH 38/76] Update sample2.cs --- samples/ref-cursor/sample2.cs | 286 +++++++++++++++++----------------- 1 file changed, 143 insertions(+), 143 deletions(-) diff --git a/samples/ref-cursor/sample2.cs b/samples/ref-cursor/sample2.cs index 6f5906e2..0ff65e4c 100644 --- a/samples/ref-cursor/sample2.cs +++ b/samples/ref-cursor/sample2.cs @@ -15,146 +15,146 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample2 -{ - /// - /// Sample 2: Demonstrates how a REF Cursor is obtained as an - /// OracleDataReader through the use of an OracleRefCursor object. - /// - class Sample2 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand( - "begin open :1 for select * from multimedia_tab where thekey = 1; end;", - con); - - cmd.CommandType = CommandType.Text; - - // Bind - OracleParameter oparam = cmd.Parameters.Add("refcur", OracleDbType.RefCursor); - oparam.Direction = ParameterDirection.Output; - - try - { - // Execute command - cmd.ExecuteNonQuery(); - - // Obtain the OracleDataReader from the REF Cursor parameter - // oparam.Value returns an OracleRefCursor object. - // GetDataReader is a method of OracleRefCursor that returns an OracleDataReader object. - OracleDataReader reader = (OracleDataReader)((OracleRefCursor)(oparam.Value)).GetDataReader(); - - // show the first row - reader.Read(); - - // Print out SCOTT.MULTIMEDIA_TAB THEKEY column - Console.WriteLine("THEKEY: {0}", reader.GetDecimal(0)); - - // Print out SCOTT.MULTIMEDIA_TAB STORY column - Console.WriteLine("STORY : {0}", reader.GetString(1)); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample2 +{ + /// + /// Sample 2: Demonstrates how a REF Cursor is obtained as an + /// OracleDataReader through the use of an OracleRefCursor object. + /// + class Sample2 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand( + "begin open :1 for select * from multimedia_tab where thekey = 1; end;", + con); + + cmd.CommandType = CommandType.Text; + + // Bind + OracleParameter oparam = cmd.Parameters.Add("refcur", OracleDbType.RefCursor); + oparam.Direction = ParameterDirection.Output; + + try + { + // Execute command + cmd.ExecuteNonQuery(); + + // Obtain the OracleDataReader from the REF Cursor parameter + // oparam.Value returns an OracleRefCursor object. + // GetDataReader is a method of OracleRefCursor that returns an OracleDataReader object. + OracleDataReader reader = (OracleDataReader)((OracleRefCursor)(oparam.Value)).GetDataReader(); + + // show the first row + reader.Read(); + + // Print out SCOTT.MULTIMEDIA_TAB THEKEY column + Console.WriteLine("THEKEY: {0}", reader.GetDecimal(0)); + + // Print out SCOTT.MULTIMEDIA_TAB STORY column + Console.WriteLine("STORY : {0}", reader.GetString(1)); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From b1b3df8acdd620559fb5086ac5114420be298ada Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:32:22 -0700 Subject: [PATCH 39/76] Update Sample7.cs --- samples/lob/Sample7.cs | 278 ++++++++++++++++++++--------------------- 1 file changed, 139 insertions(+), 139 deletions(-) diff --git a/samples/lob/Sample7.cs b/samples/lob/Sample7.cs index db4febec..16fdf351 100644 --- a/samples/lob/Sample7.cs +++ b/samples/lob/Sample7.cs @@ -15,142 +15,142 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using System.Threading; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample7 -{ - /// - /// Sample7: Demonstrates LOB updates using result set locking. - /// - class Sample7 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - OracleTransaction txn = con.BeginTransaction(); - OracleCommand cmd = new OracleCommand("",con); - - try - { - // Lock the result set using FOR UPDATE clause - cmd.CommandText = "select STORY from multimedia_tab for update"; - - OracleDataReader reader = cmd.ExecuteReader(); - reader.Read(); - OracleClob clob = reader.GetOracleClob(0); - Console.WriteLine("Old Data: {0}", clob.Value); - - // Modify the CLOB column of the row - string ending = " The end."; - clob.Append(ending.ToCharArray(), 0, ending.Length); - - // Release the lock - txn.Commit(); - - // Fetch the new data; transaction or locking not required. - cmd.CommandText = "select STORY from multimedia_tab where THEKEY = 1"; - reader = cmd.ExecuteReader(); - reader.Read(); - clob = reader.GetOracleClob(0); - Console.WriteLine("New Data: {0}", clob.Value); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using System.Threading; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample7 +{ + /// + /// Sample7: Demonstrates LOB updates using result set locking. + /// + class Sample7 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + OracleTransaction txn = con.BeginTransaction(); + OracleCommand cmd = new OracleCommand("",con); + + try + { + // Lock the result set using FOR UPDATE clause + cmd.CommandText = "select STORY from multimedia_tab for update"; + + OracleDataReader reader = cmd.ExecuteReader(); + reader.Read(); + OracleClob clob = reader.GetOracleClob(0); + Console.WriteLine("Old Data: {0}", clob.Value); + + // Modify the CLOB column of the row + string ending = " The end."; + clob.Append(ending.ToCharArray(), 0, ending.Length); + + // Release the lock + txn.Commit(); + + // Fetch the new data; transaction or locking not required. + cmd.CommandText = "select STORY from multimedia_tab where THEKEY = 1"; + reader = cmd.ExecuteReader(); + reader.Read(); + clob = reader.GetOracleClob(0); + Console.WriteLine("New Data: {0}", clob.Value); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 6447afebb06a8e0bfee4201df02a56f2072b2daa Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:32:45 -0700 Subject: [PATCH 40/76] Update Sample6.cs --- samples/lob/Sample6.cs | 280 ++++++++++++++++++++--------------------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/samples/lob/Sample6.cs b/samples/lob/Sample6.cs index a4363757..b515d663 100644 --- a/samples/lob/Sample6.cs +++ b/samples/lob/Sample6.cs @@ -15,143 +15,143 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using System.Threading; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample6 -{ - /// - /// Sample6: Demonstrates LOB updates using row-level locking. - /// - class Sample6 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - OracleTransaction txn = con.BeginTransaction(); - OracleCommand cmd = new OracleCommand("",con); - - try - { - // Select the LOB with the primary key - // The primary key will be used for row-level locking - cmd.CommandText = "select STORY, THEKEY from multimedia_tab where THEKEY = 1"; - - OracleDataReader reader = cmd.ExecuteReader(); - reader.Read(); - OracleClob clob = reader.GetOracleClobForUpdate(0); // Lock the row - Console.WriteLine("Old Data: {0}", clob.Value); - - // Modify the CLOB column of the row - string ending = " The end."; - clob.Append(ending.ToCharArray(), 0, ending.Length); - - // Release the lock - txn.Commit(); - - // Fetch the new data; transaction or locking not required. - cmd.CommandText = "select STORY from multimedia_tab where THEKEY = 1"; - reader = cmd.ExecuteReader(); - reader.Read(); - clob = reader.GetOracleClob(0); - Console.WriteLine("New Data: {0}", clob.Value); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using System.Threading; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample6 +{ + /// + /// Sample6: Demonstrates LOB updates using row-level locking. + /// + class Sample6 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + OracleTransaction txn = con.BeginTransaction(); + OracleCommand cmd = new OracleCommand("",con); + + try + { + // Select the LOB with the primary key + // The primary key will be used for row-level locking + cmd.CommandText = "select STORY, THEKEY from multimedia_tab where THEKEY = 1"; + + OracleDataReader reader = cmd.ExecuteReader(); + reader.Read(); + OracleClob clob = reader.GetOracleClobForUpdate(0); // Lock the row + Console.WriteLine("Old Data: {0}", clob.Value); + + // Modify the CLOB column of the row + string ending = " The end."; + clob.Append(ending.ToCharArray(), 0, ending.Length); + + // Release the lock + txn.Commit(); + + // Fetch the new data; transaction or locking not required. + cmd.CommandText = "select STORY from multimedia_tab where THEKEY = 1"; + reader = cmd.ExecuteReader(); + reader.Read(); + clob = reader.GetOracleClob(0); + Console.WriteLine("New Data: {0}", clob.Value); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 3f30ad94c7f62ec18df5f7a58e241b625a00eaca Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:33:17 -0700 Subject: [PATCH 41/76] Update Sample5.cs --- samples/lob/Sample5.cs | 332 ++++++++++++++++++++--------------------- 1 file changed, 166 insertions(+), 166 deletions(-) diff --git a/samples/lob/Sample5.cs b/samples/lob/Sample5.cs index 5bce6778..b4fd802b 100644 --- a/samples/lob/Sample5.cs +++ b/samples/lob/Sample5.cs @@ -15,169 +15,169 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample5 -{ - /// - /// Sample 5: Demonstrates how to bind an OracleClob object - /// as a parameter. This sample also refetches the newly - /// updated CLOB data using an OracleDataReader and an - /// OracleClob object. - /// - class Sample5 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand( - "update multimedia_tab set story = :1 where thekey = 1"); - cmd.Connection = con; - cmd.CommandType = CommandType.Text; - - // Create an OracleClob object, specifying no caching and not a NCLOB - OracleClob clob = new OracleClob(con, false, false); - - // Write data to the OracleClob object, clob, which is a temporary LOB - string str = "this is a new story"; - clob.Write(str.ToCharArray(), 0, str.Length); - - // Bind a parameter with OracleDbType.Clob - cmd.Parameters.Add("clobdata", - OracleDbType.Clob, - clob, - ParameterDirection.Input); - - try - { - // Execute command - cmd.ExecuteNonQuery(); - - // A new command text - cmd.CommandText = "select thekey, story from multimedia_tab where thekey = 1"; - - // Create DataReader - OracleDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine(e.StackTrace); - } - - // Read the first row - reader.Read(); - - // Get an OracleClob object from the DataReader. Column index is 0-based. - // clob is no more a temporary LOB. It's now a persistent LOB. - clob = reader.GetOracleClob(1); - - // Display the new data using Value property - Console.WriteLine(clob.Value); - } - catch (Exception e) - { - Console.WriteLine("Exception:" + e.Message); - } - finally - { - // Dispose OracleClob object - clob.Dispose(); - - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample5 +{ + /// + /// Sample 5: Demonstrates how to bind an OracleClob object + /// as a parameter. This sample also refetches the newly + /// updated CLOB data using an OracleDataReader and an + /// OracleClob object. + /// + class Sample5 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand( + "update multimedia_tab set story = :1 where thekey = 1"); + cmd.Connection = con; + cmd.CommandType = CommandType.Text; + + // Create an OracleClob object, specifying no caching and not a NCLOB + OracleClob clob = new OracleClob(con, false, false); + + // Write data to the OracleClob object, clob, which is a temporary LOB + string str = "this is a new story"; + clob.Write(str.ToCharArray(), 0, str.Length); + + // Bind a parameter with OracleDbType.Clob + cmd.Parameters.Add("clobdata", + OracleDbType.Clob, + clob, + ParameterDirection.Input); + + try + { + // Execute command + cmd.ExecuteNonQuery(); + + // A new command text + cmd.CommandText = "select thekey, story from multimedia_tab where thekey = 1"; + + // Create DataReader + OracleDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine(e.StackTrace); + } + + // Read the first row + reader.Read(); + + // Get an OracleClob object from the DataReader. Column index is 0-based. + // clob is no more a temporary LOB. It's now a persistent LOB. + clob = reader.GetOracleClob(1); + + // Display the new data using Value property + Console.WriteLine(clob.Value); + } + catch (Exception e) + { + Console.WriteLine("Exception:" + e.Message); + } + finally + { + // Dispose OracleClob object + clob.Dispose(); + + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From d2bdc836c15b39b66e47a073037b17db81b24699 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:33:43 -0700 Subject: [PATCH 42/76] Update Sample4.cs --- samples/lob/Sample4.cs | 298 ++++++++++++++++++++--------------------- 1 file changed, 149 insertions(+), 149 deletions(-) diff --git a/samples/lob/Sample4.cs b/samples/lob/Sample4.cs index de66d69e..f8ca9fea 100644 --- a/samples/lob/Sample4.cs +++ b/samples/lob/Sample4.cs @@ -15,152 +15,152 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample4 -{ - /// - /// Sample 4: Demonstrates how the LOB column data can be - /// read as a .NET type by utilizing stream reads. - /// l - class Sample4 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand( - "select story from multimedia_tab where thekey = 1"); - cmd.Connection = con; - cmd.CommandType = CommandType.Text; - - OracleDataReader reader; - try - { - // Create DataReader - reader = cmd.ExecuteReader(); - - // Read the first row - while(reader.Read()) - { - // Set the OracleClob object to the CLOB selected - OracleClob clob = reader.GetOracleClob(0); - - // Read data all data - Byte [] clob_data = new Byte[120]; - Int64 amountRead = 0; - int readSize = 8; - Int64 totalRead = 0; - - do - { - amountRead = clob.Read(clob_data, (int)totalRead, readSize); - Console.WriteLine("Actual read: {0} bytes", amountRead); - totalRead += amountRead; - } while(amountRead > 0); - - Console.WriteLine("Total number of bytes read: {0}", totalRead); - - // Dispose OracleClob object - clob.Dispose(); - } - } - catch (Exception e) - { - Console.WriteLine("Exception:" + e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample4 +{ + /// + /// Sample 4: Demonstrates how the LOB column data can be + /// read as a .NET type by utilizing stream reads. + /// l + class Sample4 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand( + "select story from multimedia_tab where thekey = 1"); + cmd.Connection = con; + cmd.CommandType = CommandType.Text; + + OracleDataReader reader; + try + { + // Create DataReader + reader = cmd.ExecuteReader(); + + // Read the first row + while(reader.Read()) + { + // Set the OracleClob object to the CLOB selected + OracleClob clob = reader.GetOracleClob(0); + + // Read data all data + Byte [] clob_data = new Byte[120]; + Int64 amountRead = 0; + int readSize = 8; + Int64 totalRead = 0; + + do + { + amountRead = clob.Read(clob_data, (int)totalRead, readSize); + Console.WriteLine("Actual read: {0} bytes", amountRead); + totalRead += amountRead; + } while(amountRead > 0); + + Console.WriteLine("Total number of bytes read: {0}", totalRead); + + // Dispose OracleClob object + clob.Dispose(); + } + } + catch (Exception e) + { + Console.WriteLine("Exception:" + e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 7fe12e246ef0fb64178fdb8b87a956f528e6147f Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:34:10 -0700 Subject: [PATCH 43/76] Update Sample3.cs --- samples/lob/Sample3.cs | 304 ++++++++++++++++++++--------------------- 1 file changed, 152 insertions(+), 152 deletions(-) diff --git a/samples/lob/Sample3.cs b/samples/lob/Sample3.cs index 817440b9..2b8dd3e8 100644 --- a/samples/lob/Sample3.cs +++ b/samples/lob/Sample3.cs @@ -15,155 +15,155 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample3 -{ - /// - /// Sample 3: Demonstrates how an OracleClob object is obtained - /// from an output parameter of a stored procedure - /// - class Sample3 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand("", con); - cmd.CommandText = "SelectStory"; - cmd.CommandType = CommandType.StoredProcedure; - - // Bind the OraLob Object - OracleParameter param = cmd.Parameters.Add("clobdata", - OracleDbType.Clob); - param.Direction = ParameterDirection.Output; - - // Execute command - try - { - cmd.ExecuteNonQuery(); - - // Obtain LOB data as a .NET Type. - // cmd.Parameters[0].value is an OracleClob object. - // OracleClob.Value property retuns CLOB data as a string. - string lob_data = (string) ((OracleClob)(cmd.Parameters[0].Value)).Value; - - // Print out the text - Console.WriteLine("Data is: " + lob_data); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Build a SQL that creates stored procedure - StringBuilder sql = new StringBuilder(); - sql.Append("create or replace procedure SelectStory ( "); - sql.Append("clob_data OUT CLOB) as "); - sql.Append("begin "); - sql.Append(" select story into clob_data from multimedia_tab where thekey = 1; "); - sql.Append("end SelectStory;"); - cmd.CommandText = sql.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample3 +{ + /// + /// Sample 3: Demonstrates how an OracleClob object is obtained + /// from an output parameter of a stored procedure + /// + class Sample3 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand("", con); + cmd.CommandText = "SelectStory"; + cmd.CommandType = CommandType.StoredProcedure; + + // Bind the OraLob Object + OracleParameter param = cmd.Parameters.Add("clobdata", + OracleDbType.Clob); + param.Direction = ParameterDirection.Output; + + // Execute command + try + { + cmd.ExecuteNonQuery(); + + // Obtain LOB data as a .NET Type. + // cmd.Parameters[0].value is an OracleClob object. + // OracleClob.Value property retuns CLOB data as a string. + string lob_data = (string) ((OracleClob)(cmd.Parameters[0].Value)).Value; + + // Print out the text + Console.WriteLine("Data is: " + lob_data); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Build a SQL that creates stored procedure + StringBuilder sql = new StringBuilder(); + sql.Append("create or replace procedure SelectStory ( "); + sql.Append("clob_data OUT CLOB) as "); + sql.Append("begin "); + sql.Append(" select story into clob_data from multimedia_tab where thekey = 1; "); + sql.Append("end SelectStory;"); + cmd.CommandText = sql.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From fc89173b83e3ab44775ea109bdcf0522fc0ca7b1 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:34:37 -0700 Subject: [PATCH 44/76] Update Sample2.cs --- samples/lob/Sample2.cs | 272 ++++++++++++++++++++--------------------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/samples/lob/Sample2.cs b/samples/lob/Sample2.cs index ac9d4028..58e40c93 100644 --- a/samples/lob/Sample2.cs +++ b/samples/lob/Sample2.cs @@ -15,139 +15,139 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample2 -{ - /// - /// Sample 2: Demonstrates how an OracleClob object is obtained - /// as an output parameter of an anonymous PL/SQL block - /// - class Sample2 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand( - "begin select story into :1 from multimedia_tab where thekey = 1; end;"); - cmd.Connection = con; - cmd.CommandType = CommandType.Text; - - // Bind a parameter - OracleParameter param = cmd.Parameters.Add("clobdata", - OracleDbType.Clob); - param.Direction = ParameterDirection.Output; - - // Execute command - try - { - cmd.ExecuteNonQuery(); - - // Obtain LOB data as a .NET Type. - // cmd.Parameters[0].Value is an object of OracleClob. - // OracleClob.Value property retuns CLOB data as a string. - string lob_data = (string) ((OracleClob)(cmd.Parameters[0].Value)).Value; - - // Print out the text - Console.WriteLine("Data is: " + lob_data); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("", con); - - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample2 +{ + /// + /// Sample 2: Demonstrates how an OracleClob object is obtained + /// as an output parameter of an anonymous PL/SQL block + /// + class Sample2 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand( + "begin select story into :1 from multimedia_tab where thekey = 1; end;"); + cmd.Connection = con; + cmd.CommandType = CommandType.Text; + + // Bind a parameter + OracleParameter param = cmd.Parameters.Add("clobdata", + OracleDbType.Clob); + param.Direction = ParameterDirection.Output; + + // Execute command + try + { + cmd.ExecuteNonQuery(); + + // Obtain LOB data as a .NET Type. + // cmd.Parameters[0].Value is an object of OracleClob. + // OracleClob.Value property retuns CLOB data as a string. + string lob_data = (string) ((OracleClob)(cmd.Parameters[0].Value)).Value; + + // Print out the text + Console.WriteLine("Data is: " + lob_data); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("", con); + + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 52e134b365db1d0cdb7b16b51d3d6e6e3c61be75 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:35:50 -0700 Subject: [PATCH 45/76] Update Sample3.cs --- samples/ref-cursor/Sample3.cs | 492 +++++++++++++++++----------------- 1 file changed, 246 insertions(+), 246 deletions(-) diff --git a/samples/ref-cursor/Sample3.cs b/samples/ref-cursor/Sample3.cs index efc3bb9f..700fee54 100644 --- a/samples/ref-cursor/Sample3.cs +++ b/samples/ref-cursor/Sample3.cs @@ -15,249 +15,249 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample3 -{ - /// - /// Sample 3: Demonstrates how multiple REF Cursors can be accessed - /// by a single OracleDataReader - /// - class Sample3 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); - cmd.CommandType = CommandType.StoredProcedure; - - // Bind - // select * from multimedia_tab - OracleParameter p1 = cmd.Parameters.Add("refcursor1", - OracleDbType.RefCursor); - p1.Direction = ParameterDirection.ReturnValue; - - // select * from emp - OracleParameter p2 = cmd.Parameters.Add("refcursor2", - OracleDbType.RefCursor); - p2.Direction = ParameterDirection.Output; - - // select * from dept - OracleParameter p3 = cmd.Parameters.Add("refcursor3", - OracleDbType.RefCursor); - p3.Direction = ParameterDirection.Output; - - // Execute command - OracleDataReader reader; - try - { - reader = cmd.ExecuteReader(); - - // Print out the field count of each REF Cursor - // for "select * from SCOTT.MULTIMEDIA_TAB", - // "select * from SCOTT.EMP", and "select * from DEPT"; - do - { - Console.WriteLine("Field count: " + reader.FieldCount); - } while (reader.NextResult()); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Header - blr = new StringBuilder(); - blr.Append("CREATE OR REPLACE PACKAGE TEST is "); - blr.Append("TYPE refcursor is ref cursor;"); - blr.Append("FUNCTION Ret1Cur return refCursor;"); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor;"); - - blr.Append("FUNCTION Get1Cur return refCursor;"); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); - blr.Append("clipid in NUMBER);"); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Body - blr = new StringBuilder(); - - blr.Append("create or replace package body TEST is "); - - blr.Append("FUNCTION Ret1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Ret1Cur; "); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("OPEN p_cursor1 for select * from emp; "); - blr.Append("END Get1CurOut; "); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("open p_cursor1 for select * from emp; "); - blr.Append("open p_cursor2 for select * from dept; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get3Cur; "); - - blr.Append("FUNCTION Get1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get1Cur; "); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); - blr.Append("clipid in NUMBER) is "); - blr.Append("BEGIN "); - blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); - blr.Append("END UpdateRefCur; "); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for "); - blr.Append("Select story from multimedia_tab where thekey = 1; "); - blr.Append("END GetStoryForClip1; "); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); - blr.Append("myStory out VARCHAR2) is "); - blr.Append("BEGIN "); - blr.Append("FETCH p_cursor into myStory; "); - blr.Append("END GetRefCurData; "); - - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample3 +{ + /// + /// Sample 3: Demonstrates how multiple REF Cursors can be accessed + /// by a single OracleDataReader + /// + class Sample3 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand("TEST.Get3Cur", con); + cmd.CommandType = CommandType.StoredProcedure; + + // Bind + // select * from multimedia_tab + OracleParameter p1 = cmd.Parameters.Add("refcursor1", + OracleDbType.RefCursor); + p1.Direction = ParameterDirection.ReturnValue; + + // select * from emp + OracleParameter p2 = cmd.Parameters.Add("refcursor2", + OracleDbType.RefCursor); + p2.Direction = ParameterDirection.Output; + + // select * from dept + OracleParameter p3 = cmd.Parameters.Add("refcursor3", + OracleDbType.RefCursor); + p3.Direction = ParameterDirection.Output; + + // Execute command + OracleDataReader reader; + try + { + reader = cmd.ExecuteReader(); + + // Print out the field count of each REF Cursor + // for "select * from SCOTT.MULTIMEDIA_TAB", + // "select * from SCOTT.EMP", and "select * from DEPT"; + do + { + Console.WriteLine("Field count: " + reader.FieldCount); + } while (reader.NextResult()); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Header + blr = new StringBuilder(); + blr.Append("CREATE OR REPLACE PACKAGE TEST is "); + blr.Append("TYPE refcursor is ref cursor;"); + blr.Append("FUNCTION Ret1Cur return refCursor;"); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor;"); + + blr.Append("FUNCTION Get1Cur return refCursor;"); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); + blr.Append("clipid in NUMBER);"); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Body + blr = new StringBuilder(); + + blr.Append("create or replace package body TEST is "); + + blr.Append("FUNCTION Ret1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Ret1Cur; "); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("OPEN p_cursor1 for select * from emp; "); + blr.Append("END Get1CurOut; "); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("open p_cursor1 for select * from emp; "); + blr.Append("open p_cursor2 for select * from dept; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get3Cur; "); + + blr.Append("FUNCTION Get1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get1Cur; "); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); + blr.Append("clipid in NUMBER) is "); + blr.Append("BEGIN "); + blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); + blr.Append("END UpdateRefCur; "); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for "); + blr.Append("Select story from multimedia_tab where thekey = 1; "); + blr.Append("END GetStoryForClip1; "); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); + blr.Append("myStory out VARCHAR2) is "); + blr.Append("BEGIN "); + blr.Append("FETCH p_cursor into myStory; "); + blr.Append("END GetRefCurData; "); + + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 097bd3a5f477a307b2a17a25d7c0604ea4cf4ed7 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Wed, 17 Jun 2020 16:35:58 -0700 Subject: [PATCH 46/76] Update Sample5.cs --- samples/ref-cursor/Sample5.cs | 470 +++++++++++++++++----------------- 1 file changed, 235 insertions(+), 235 deletions(-) diff --git a/samples/ref-cursor/Sample5.cs b/samples/ref-cursor/Sample5.cs index 09e44ee4..0b3b72cc 100644 --- a/samples/ref-cursor/Sample5.cs +++ b/samples/ref-cursor/Sample5.cs @@ -15,238 +15,238 @@ * See the License for the specific language governing permissions and * limitations under the License. * - *****************************************************************************/ - -using System; -using System.Data; -using System.Text; -using Oracle.ManagedDataAccess.Client; -using Oracle.ManagedDataAccess.Types; - -namespace Sample5 -{ - /// - /// Sample 5: Demonstrates how a DataSet can be populated from an - /// OracleRefCursor object. - /// - class Sample5 - { - /// - /// The main entry point for the application. - /// - static void Main(string[] args) - { - // Connect - string constr = "User Id=scott;Password=tiger;Data Source=oracle"; - OracleConnection con = Connect(constr); - - // Setup - Setup(con); - - // Set the command - OracleCommand cmd = new OracleCommand("TEST.Get1Cur", con); - cmd.CommandType = CommandType.StoredProcedure; - - // Bind - cmd.Parameters.Add("refcursor1", OracleDbType.RefCursor); - cmd.Parameters[0].Direction = ParameterDirection.ReturnValue; - - try - { - // Execute command; Have the parameters populated - cmd.ExecuteNonQuery(); - - // Create the OracleDataAdapter - OracleDataAdapter da = new OracleDataAdapter(cmd); - - // Populate a DataSet with refcursor1. - DataSet ds = new DataSet(); - da.Fill(ds, "refcursor1", (OracleRefCursor)(cmd.Parameters["refcursor1"].Value)); - - // Print out the field count the REF Cursor - Console.WriteLine("Field count: " + ds.Tables["refcursor1"].Columns.Count); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - finally - { - // Dispose OracleCommand object - cmd.Dispose(); - - // Close and Dispose OracleConnection object - con.Close(); - con.Dispose(); - } - } - - /// - /// Wrapper for Opening a new Connection - /// - /// - /// - public static OracleConnection Connect(string connectStr) - { - OracleConnection con = new OracleConnection(connectStr); - try - { - con.Open(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - return con; - } - - /// - /// Setup the necessary Tables & Test Data - /// - /// - public static void Setup(OracleConnection con) - { - StringBuilder blr; - OracleCommand cmd = new OracleCommand("",con); - - // Create multimedia table - blr = new StringBuilder(); - blr.Append("DROP TABLE multimedia_tab"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch - { - } - - blr = new StringBuilder(); - blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); - blr.Append("story CLOB, sound BLOB)"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - blr = new StringBuilder(); - blr.Append("INSERT INTO multimedia_tab values("); - blr.Append("1,"); - blr.Append("'This is a long story. Once upon a time ...',"); - blr.Append("'656667686970717273747576777879808182838485')"); - cmd.CommandText = blr.ToString(); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Header - blr = new StringBuilder(); - blr.Append("CREATE OR REPLACE PACKAGE TEST is "); - blr.Append("TYPE refcursor is ref cursor;"); - blr.Append("FUNCTION Ret1Cur return refCursor;"); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor;"); - - blr.Append("FUNCTION Get1Cur return refCursor;"); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); - blr.Append("clipid in NUMBER);"); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - - // Create Package Body - blr = new StringBuilder(); - - blr.Append("create or replace package body TEST is "); - - blr.Append("FUNCTION Ret1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Ret1Cur; "); - - blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("OPEN p_cursor1 for select * from emp; "); - blr.Append("END Get1CurOut; "); - - blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); - blr.Append("p_cursor2 out refCursor)"); - blr.Append("return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("open p_cursor1 for select * from emp; "); - blr.Append("open p_cursor2 for select * from dept; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get3Cur; "); - - blr.Append("FUNCTION Get1Cur return refCursor is "); - blr.Append("p_cursor refCursor; "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for select * from multimedia_tab; "); - blr.Append("return (p_cursor); "); - blr.Append("END Get1Cur; "); - - blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); - blr.Append("clipid in NUMBER) is "); - blr.Append("BEGIN "); - blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); - blr.Append("END UpdateRefCur; "); - - blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); - blr.Append("BEGIN "); - blr.Append("open p_cursor for "); - blr.Append("Select story from multimedia_tab where thekey = 1; "); - blr.Append("END GetStoryForClip1; "); - - blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); - blr.Append("myStory out VARCHAR2) is "); - blr.Append("BEGIN "); - blr.Append("FETCH p_cursor into myStory; "); - blr.Append("END GetRefCurData; "); - - blr.Append("end TEST;"); - - cmd.CommandText = blr.ToString(); - - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - Console.WriteLine("Error: {0}", e.Message); - } - } - } -} + *****************************************************************************/ + +using System; +using System.Data; +using System.Text; +using Oracle.ManagedDataAccess.Client; +using Oracle.ManagedDataAccess.Types; + +namespace Sample5 +{ + /// + /// Sample 5: Demonstrates how a DataSet can be populated from an + /// OracleRefCursor object. + /// + class Sample5 + { + /// + /// The main entry point for the application. + /// + static void Main(string[] args) + { + // Connect + string constr = "User Id=scott;Password=;Data Source=oracle"; + OracleConnection con = Connect(constr); + + // Setup + Setup(con); + + // Set the command + OracleCommand cmd = new OracleCommand("TEST.Get1Cur", con); + cmd.CommandType = CommandType.StoredProcedure; + + // Bind + cmd.Parameters.Add("refcursor1", OracleDbType.RefCursor); + cmd.Parameters[0].Direction = ParameterDirection.ReturnValue; + + try + { + // Execute command; Have the parameters populated + cmd.ExecuteNonQuery(); + + // Create the OracleDataAdapter + OracleDataAdapter da = new OracleDataAdapter(cmd); + + // Populate a DataSet with refcursor1. + DataSet ds = new DataSet(); + da.Fill(ds, "refcursor1", (OracleRefCursor)(cmd.Parameters["refcursor1"].Value)); + + // Print out the field count the REF Cursor + Console.WriteLine("Field count: " + ds.Tables["refcursor1"].Columns.Count); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + finally + { + // Dispose OracleCommand object + cmd.Dispose(); + + // Close and Dispose OracleConnection object + con.Close(); + con.Dispose(); + } + } + + /// + /// Wrapper for Opening a new Connection + /// + /// + /// + public static OracleConnection Connect(string connectStr) + { + OracleConnection con = new OracleConnection(connectStr); + try + { + con.Open(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + return con; + } + + /// + /// Setup the necessary Tables & Test Data + /// + /// + public static void Setup(OracleConnection con) + { + StringBuilder blr; + OracleCommand cmd = new OracleCommand("",con); + + // Create multimedia table + blr = new StringBuilder(); + blr.Append("DROP TABLE multimedia_tab"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch + { + } + + blr = new StringBuilder(); + blr.Append("CREATE TABLE multimedia_tab(thekey NUMBER(4) PRIMARY KEY,"); + blr.Append("story CLOB, sound BLOB)"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + blr = new StringBuilder(); + blr.Append("INSERT INTO multimedia_tab values("); + blr.Append("1,"); + blr.Append("'This is a long story. Once upon a time ...',"); + blr.Append("'656667686970717273747576777879808182838485')"); + cmd.CommandText = blr.ToString(); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Header + blr = new StringBuilder(); + blr.Append("CREATE OR REPLACE PACKAGE TEST is "); + blr.Append("TYPE refcursor is ref cursor;"); + blr.Append("FUNCTION Ret1Cur return refCursor;"); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor);"); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor,"); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor;"); + + blr.Append("FUNCTION Get1Cur return refCursor;"); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR,"); + blr.Append("clipid in NUMBER);"); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor);"); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,myStory out VARCHAR2);"); + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + + // Create Package Body + blr = new StringBuilder(); + + blr.Append("create or replace package body TEST is "); + + blr.Append("FUNCTION Ret1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Ret1Cur; "); + + blr.Append("PROCEDURE Get1CurOut(p_cursor1 out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("OPEN p_cursor1 for select * from emp; "); + blr.Append("END Get1CurOut; "); + + blr.Append("FUNCTION Get3Cur (p_cursor1 out refCursor, "); + blr.Append("p_cursor2 out refCursor)"); + blr.Append("return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("open p_cursor1 for select * from emp; "); + blr.Append("open p_cursor2 for select * from dept; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get3Cur; "); + + blr.Append("FUNCTION Get1Cur return refCursor is "); + blr.Append("p_cursor refCursor; "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for select * from multimedia_tab; "); + blr.Append("return (p_cursor); "); + blr.Append("END Get1Cur; "); + + blr.Append("PROCEDURE UpdateRefCur(new_story in VARCHAR, "); + blr.Append("clipid in NUMBER) is "); + blr.Append("BEGIN "); + blr.Append("Update multimedia_tab set story = new_story where thekey = clipid; "); + blr.Append("END UpdateRefCur; "); + + blr.Append("PROCEDURE GetStoryForClip1(p_cursor out refCursor) is "); + blr.Append("BEGIN "); + blr.Append("open p_cursor for "); + blr.Append("Select story from multimedia_tab where thekey = 1; "); + blr.Append("END GetStoryForClip1; "); + + blr.Append("PROCEDURE GetRefCurData (p_cursor out refCursor,"); + blr.Append("myStory out VARCHAR2) is "); + blr.Append("BEGIN "); + blr.Append("FETCH p_cursor into myStory; "); + blr.Append("END GetRefCurData; "); + + blr.Append("end TEST;"); + + cmd.CommandText = blr.ToString(); + + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception e) + { + Console.WriteLine("Error: {0}", e.Message); + } + } + } +} From 0bdfad044599b90e6f0c66be2ad233a32ba8912c Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Sun, 19 Jul 2020 14:20:10 -0700 Subject: [PATCH 47/76] Update keyless-entity-types-views.cs Added materialized view sample code --- .../keyless-entity-types-views.cs | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs b/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs index 28ab8040..2841284f 100644 --- a/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs +++ b/samples/dotnet-core/ef-core/keyless-entity-types-views/keyless-entity-types-views.cs @@ -34,11 +34,21 @@ private static void Main() #region Query var postCounts = db.BlogPostCounts.ToList(); + Console.WriteLine("View Results:"); foreach (var postCount in postCounts) { Console.WriteLine($"{postCount.BlogName} has {postCount.PostCount} posts."); - Console.WriteLine(); } + + Console.WriteLine(); + Console.WriteLine("Materialized View Results:"); + var mvPostCounts = db.MVBlogPostCounts.ToList(); + + foreach (var mvPostCount in mvPostCounts) + { + Console.WriteLine($"{mvPostCount.BlogName} has {mvPostCount.PostCount} posts."); + } + #endregion } } @@ -95,8 +105,17 @@ private static void SetupDatabase() "SELECT b.\"Name\", Count(p.\"PostId\") as \"PostCount\" " + "FROM \"Blogs\" b " + "JOIN \"Posts\" p on p.\"BlogId\" = b.\"BlogId\" " + - "GROUP BY b.\"Name\" " + - "WITH READ ONLY;"); + "GROUP BY b.\"Name\";"); + #endregion + + #region MaterializedView + db.Database.ExecuteSqlRaw( + "CREATE MATERIALIZED VIEW \"MView_BlogPostCounts\" " + + "BUILD IMMEDIATE REFRESH FORCE ON DEMAND AS " + + "SELECT b.\"Name\", Count(p.\"PostId\") as \"PostCount\" " + + "FROM \"Blogs\" b " + + "JOIN \"Posts\" p on p.\"BlogId\" = b.\"BlogId\" " + + "GROUP BY b.\"Name\";"); #endregion } } @@ -110,6 +129,7 @@ public class BloggingContext : DbContext #region DbSet public DbSet BlogPostCounts { get; set; } + public DbSet MVBlogPostCounts { get; set; } #endregion protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) @@ -129,6 +149,12 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) eb.HasNoKey(); eb.ToView("View_BlogPostCounts"); eb.Property(v => v.BlogName).HasColumnName("Name"); + }) + .Entity(eb => + { + eb.HasNoKey(); + eb.ToView("MView_BlogPostCounts"); + eb.Property(v => v.BlogName).HasColumnName("Name"); }); } #endregion @@ -158,5 +184,10 @@ public class BlogPostsCount public string BlogName { get; set; } public int PostCount { get; set; } } + public class MVBlogPostsCount + { + public string BlogName { get; set; } + public int PostCount { get; set; } + } #endregion } From e22400a353314dc020e65578713a724b63d9de1c Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Sun, 19 Jul 2020 14:35:00 -0700 Subject: [PATCH 48/76] MV grant info and scaffolding instructions added --- .../ef-core/keyless-entity-types-views/README.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md index f9660d90..3bb8107d 100644 --- a/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md +++ b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md @@ -1,8 +1,12 @@ -This C# sample code shows how to use Oracle Entity Framework Core with keyless entity types and views. This sample works with Oracle EF Core 3.1. +This C# sample code shows how to use Oracle Entity Framework Core with keyless entity types with relational and materialized views. It auto-generates the necessary schema objects. -Oracle Entity Framework Core is available for free download on [NuGet Gallery](https://www.nuget.org/packages/Oracle.EntityFrameworkCore/). +This sample uses Oracle EF Core 3.1 provider, which is available as a free download on [NuGet Gallery](https://www.nuget.org/packages/Oracle.EntityFrameworkCore/). -To use the sample code, enter the User Id, Password, and Data Source values for the Oracle connection string. +To use the sample code, enter the User Id, Password, and Data Source values for the Oracle database connection string. -Ensure the EF Core user has the database privileges to create the necessary schema objects to run the sample code. If you have granted the privileges in the [Oracle EF Core Getting Started sample](https://github.com/oracle/dotnet-db-samples/tree/master/samples/dotnet-core/ef-core/get-started) already, then you only have to grant following privilege to allow view creation: +Ensure the EF Core user has the database privileges to create the necessary schema objects to run the sample code. If you have granted the privileges in the [Oracle EF Core Getting Started sample](https://github.com/oracle/dotnet-db-samples/tree/master/samples/dotnet-core/ef-core/get-started) already, then you only need to grant view creation privileges: * GRANT CREATE VIEW TO "<Oracle User>" +* GRANT CREATE MATERIALIZED VIEW TO "<Oracle User>" + +To scaffold views, add the Microsoft.EntityFrameworkCore.Tools package from NuGet Gallery. Then, run this command from the Package Manager Console: +* Scaffold-DbContext "User Id=<Oracle User>;Password=<Password>;Data Source=<Data Source>;" Oracle.EntityFrameworkCore -OutputDir Models From 3c434742b749afa81b9a9a1d1b943fb69fc67307 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Fri, 24 Jul 2020 10:55:54 -0700 Subject: [PATCH 49/76] Update README.md --- .../dotnet-core/ef-core/keyless-entity-types-views/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md index 3bb8107d..bc5fc987 100644 --- a/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md +++ b/samples/dotnet-core/ef-core/keyless-entity-types-views/README.md @@ -10,3 +10,5 @@ Ensure the EF Core user has the database privileges to create the necessary sche To scaffold views, add the Microsoft.EntityFrameworkCore.Tools package from NuGet Gallery. Then, run this command from the Package Manager Console: * Scaffold-DbContext "User Id=<Oracle User>;Password=<Password>;Data Source=<Data Source>;" Oracle.EntityFrameworkCore -OutputDir Models + +Note: There are no EF Core migration APIs specifically for database view DDL. To perform view DDL, execute SQL, such as using the ExecuteSqlRaw method as the sample code does. From 89e752128569bc1343bf4230822dab5c185c3755 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 12 Oct 2020 00:20:30 -0700 Subject: [PATCH 50/76] Update README.md --- samples/dotnet-core/autonomous-db/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/dotnet-core/autonomous-db/README.md b/samples/dotnet-core/autonomous-db/README.md index b94952ed..e19a50f5 100644 --- a/samples/dotnet-core/autonomous-db/README.md +++ b/samples/dotnet-core/autonomous-db/README.md @@ -1,9 +1,9 @@ -This ODP.NET Core Autonomous DB code sample is intended to be used with the [Developing .NET Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/technetwork/topics/dotnet/tech-info/default-5032178.html). +This ODP.NET Core Autonomous Database (ADB) code sample is intended to be used with the [Developing .NET Core Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/database/technologies/appdev/dotnet/adbdotnetcore.html). -This sample demonstrates how to connect to Oracle Autonomous Database, Including Oracle Autonomous Transaction Processing and +This sample demonstrates how to connect to Oracle Autonomous Database, including Oracle Autonomous Transaction Processing and Autonomous Data Warehouse. Create a new .NET Core console project, add ODP.NET Core assembly ([Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/)) from NuGet Gallery, and paste the sample code. You can then enter your ADB connection and configuration information into the pasted sample code as described in the comments. -There are three samples, one each for ODP.NET Core, managed ODP.NET, and unmanaged ODP.NET. This directory contains the +This repository has ADB code samples for ODP.NET Core, managed ODP.NET, and unmanaged ODP.NET. This directory contains the ODP.NET Core sample. The other ODP.NET Autonomous DB samples are located [here](https://github.com/oracle/dotnet-db-samples/tree/master/samples/autonomous-db). From 3a29590ab81356656b1de6f7b90e5a29ad567332 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 12 Oct 2020 00:26:12 -0700 Subject: [PATCH 51/76] Update README.md --- samples/autonomous-db/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/samples/autonomous-db/README.md b/samples/autonomous-db/README.md index 8468c028..63cf3e95 100644 --- a/samples/autonomous-db/README.md +++ b/samples/autonomous-db/README.md @@ -1,8 +1,8 @@ -These ODP.NET Autonomous DB code samples are intended to be used with the [Developing .NET Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/technetwork/topics/dotnet/tech-info/default-5032178.html). +These ODP.NET Autonomous Database code samples are intended to be used with the [Developing .NET Framework Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/database/technologies/appdev/dotnet/adbdotnetfw.html). -This sample demonstrates how to connect to Oracle Autonomous Database, Including Oracle Autonomous Transaction Processing and Autonomous Data Warehouse. +This sample demonstrates how to connect to Oracle Autonomous Database, including Oracle Autonomous Transaction Processing and Autonomous Data Warehouse. -Create a new .NET Framework project and add either managed or unmanaged ODP.NET assembly. Managed ODP.NET ([Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess)) can be downloaded from NuGet Gallery. Unmanaged ODP.NET can be added after an [ODAC installation](https://www.oracle.com/database/technologies/dotnet-odacdev-downloads.html). Paste the sample code into the project. You can then enter your ADB connection and configuration information into the sample code as described in the comments. +Create a new .NET Framework project and add either managed or unmanaged ODP.NET assembly. Oracle recommends using managed ODP.NET for most .NET Framework apps. Managed ODP.NET ([Oracle.ManagedDataAccess](https://www.nuget.org/packages/Oracle.ManagedDataAccess)) can be downloaded from NuGet Gallery. Unmanaged ODP.NET can be added after an [ODAC installation](https://www.oracle.com/database/technologies/dotnet-odacdeploy-downloads.html). Paste the sample code into the project. You can then enter your ADB connection and configuration information into the sample code as described in the comments. This directory contains the managed and unmanaged ODP.NET samples. The ODP.NET Core sample is located [here](https://github.com/oracle/dotnet-db-samples/tree/master/samples/dotnet-core/autonomous-db). From d7ad57c667c27c064da63f1c57f661c11d7e0906 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:43:06 -0800 Subject: [PATCH 52/76] Update and rename samples/dotnet-core/asp.net-core/Program.cs to samples/dotnet-core/asp.net-core/2.x/Program.cs --- samples/dotnet-core/asp.net-core/{ => 2.x}/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename samples/dotnet-core/asp.net-core/{ => 2.x}/Program.cs (98%) diff --git a/samples/dotnet-core/asp.net-core/Program.cs b/samples/dotnet-core/asp.net-core/2.x/Program.cs similarity index 98% rename from samples/dotnet-core/asp.net-core/Program.cs rename to samples/dotnet-core/asp.net-core/2.x/Program.cs index 939052d4..d7846013 100644 --- a/samples/dotnet-core/asp.net-core/Program.cs +++ b/samples/dotnet-core/asp.net-core/2.x/Program.cs @@ -26,7 +26,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -namespace ODPCoreASPCore +namespace ODPCoreASPCore2 { public class Program { From de777c61f0a5eca36c9ab819a1007803855c29fe Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:43:35 -0800 Subject: [PATCH 53/76] Update and rename samples/dotnet-core/asp.net-core/Startup.cs to samples/dotnet-core/asp.net-core/2.x/Startup.cs --- samples/dotnet-core/asp.net-core/{ => 2.x}/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename samples/dotnet-core/asp.net-core/{ => 2.x}/Startup.cs (99%) diff --git a/samples/dotnet-core/asp.net-core/Startup.cs b/samples/dotnet-core/asp.net-core/2.x/Startup.cs similarity index 99% rename from samples/dotnet-core/asp.net-core/Startup.cs rename to samples/dotnet-core/asp.net-core/2.x/Startup.cs index 0417ed5f..d518028c 100644 --- a/samples/dotnet-core/asp.net-core/Startup.cs +++ b/samples/dotnet-core/asp.net-core/2.x/Startup.cs @@ -27,7 +27,7 @@ using Microsoft.Extensions.DependencyInjection; using Oracle.ManagedDataAccess.Client; -namespace ODPCoreASPCore +namespace ODPCoreASPCore2 { public class Startup { From 9eb1dd7b0d6fe8747996b5491a7fb5ffd50671ad Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:45:44 -0800 Subject: [PATCH 54/76] Update Program.cs --- samples/dotnet-core/asp.net-core/2.x/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dotnet-core/asp.net-core/2.x/Program.cs b/samples/dotnet-core/asp.net-core/2.x/Program.cs index d7846013..901df1ec 100644 --- a/samples/dotnet-core/asp.net-core/2.x/Program.cs +++ b/samples/dotnet-core/asp.net-core/2.x/Program.cs @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. */ +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ /****************************************************************************** * From 74b05a62cddae8f9b97dccd27d60a276ea855ed7 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:45:58 -0800 Subject: [PATCH 55/76] Update Program.cs From 62664ea1a81302a52d27c98fa847d38367eda256 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:46:32 -0800 Subject: [PATCH 56/76] Update Startup.cs --- samples/dotnet-core/asp.net-core/2.x/Startup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dotnet-core/asp.net-core/2.x/Startup.cs b/samples/dotnet-core/asp.net-core/2.x/Startup.cs index d518028c..5d616bfd 100644 --- a/samples/dotnet-core/asp.net-core/2.x/Startup.cs +++ b/samples/dotnet-core/asp.net-core/2.x/Startup.cs @@ -1,4 +1,4 @@ -/* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. */ +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ /****************************************************************************** * From 08df05b106437ab5003e2e53faf06b3a82bb3c3d Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:48:29 -0800 Subject: [PATCH 57/76] Create Program.cs --- .../dotnet-core/asp.net-core/3.x/Program.cs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 samples/dotnet-core/asp.net-core/3.x/Program.cs diff --git a/samples/dotnet-core/asp.net-core/3.x/Program.cs b/samples/dotnet-core/asp.net-core/3.x/Program.cs new file mode 100644 index 00000000..cf6efcf4 --- /dev/null +++ b/samples/dotnet-core/asp.net-core/3.x/Program.cs @@ -0,0 +1,95 @@ +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Oracle.ManagedDataAccess.Client; + +namespace ODPCoreASPCore3 +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapGet("/", async context => + { + //Demo: Basic ODP.NET Core application for ASP.NET Core 3.1 + // to connect, query, and return results to a web page + + //Set the user id and password + string conString = "User Id=hr;Password=;" + + + //Set Data Source value to an Oracle net service name in + // the tnsnames.ora file or use EZ Connect + "Data Source=:1521/;"; + + using (OracleConnection con = new OracleConnection(conString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + cmd.BindByName = true; + + //Use the command to display employee names from + // the EMPLOYEES table + cmd.CommandText = "select first_name, last_name from employees where department_id = :id"; + + // Assign id to the department number 50 + OracleParameter id = new OracleParameter("id", 50); + cmd.Parameters.Add(id); + + //Execute the command and use DataReader to display the data + OracleDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + await context.Response.WriteAsync("Employee Name: " + reader.GetString(0) + " " + reader.GetString(1) + "\n"); + } + + reader.Dispose(); + } + catch (Exception ex) + { + await context.Response.WriteAsync(ex.Message); + } + } + } + }); + }); + } + } +} + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ From af80cb80db0b623987423cec5c980132ee467ac6 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:49:16 -0800 Subject: [PATCH 58/76] Create Startup.cs --- .../dotnet-core/asp.net-core/3.x/Startup.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 samples/dotnet-core/asp.net-core/3.x/Startup.cs diff --git a/samples/dotnet-core/asp.net-core/3.x/Startup.cs b/samples/dotnet-core/asp.net-core/3.x/Startup.cs new file mode 100644 index 00000000..a6234e23 --- /dev/null +++ b/samples/dotnet-core/asp.net-core/3.x/Startup.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace ODPCoreASPCore3 +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ From 2d4a722f5caf5c3c1dca869175bbab6a952de059 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:54:14 -0800 Subject: [PATCH 59/76] Delete Program.cs --- .../dotnet-core/asp.net-core/3.x/Program.cs | 95 ------------------- 1 file changed, 95 deletions(-) delete mode 100644 samples/dotnet-core/asp.net-core/3.x/Program.cs diff --git a/samples/dotnet-core/asp.net-core/3.x/Program.cs b/samples/dotnet-core/asp.net-core/3.x/Program.cs deleted file mode 100644 index cf6efcf4..00000000 --- a/samples/dotnet-core/asp.net-core/3.x/Program.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Oracle.ManagedDataAccess.Client; - -namespace ODPCoreASPCore3 -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - endpoints.MapGet("/", async context => - { - //Demo: Basic ODP.NET Core application for ASP.NET Core 3.1 - // to connect, query, and return results to a web page - - //Set the user id and password - string conString = "User Id=hr;Password=;" + - - //Set Data Source value to an Oracle net service name in - // the tnsnames.ora file or use EZ Connect - "Data Source=:1521/;"; - - using (OracleConnection con = new OracleConnection(conString)) - { - using (OracleCommand cmd = con.CreateCommand()) - { - try - { - con.Open(); - cmd.BindByName = true; - - //Use the command to display employee names from - // the EMPLOYEES table - cmd.CommandText = "select first_name, last_name from employees where department_id = :id"; - - // Assign id to the department number 50 - OracleParameter id = new OracleParameter("id", 50); - cmd.Parameters.Add(id); - - //Execute the command and use DataReader to display the data - OracleDataReader reader = cmd.ExecuteReader(); - while (reader.Read()) - { - await context.Response.WriteAsync("Employee Name: " + reader.GetString(0) + " " + reader.GetString(1) + "\n"); - } - - reader.Dispose(); - } - catch (Exception ex) - { - await context.Response.WriteAsync(ex.Message); - } - } - } - }); - }); - } - } -} - -/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ - -/****************************************************************************** - * - * You may not use the identified files except in compliance with The MIT - * License (the "License.") - * - * You may obtain a copy of the License at - * https://github.com/oracle/Oracle.NET/blob/master/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - * - *****************************************************************************/ From a4b23bff659cc72f1e0ee5d075936690cfd2ebd6 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:54:39 -0800 Subject: [PATCH 60/76] Rename Startup.cs to Program.cs --- samples/dotnet-core/asp.net-core/3.x/{Startup.cs => Program.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/dotnet-core/asp.net-core/3.x/{Startup.cs => Program.cs} (100%) diff --git a/samples/dotnet-core/asp.net-core/3.x/Startup.cs b/samples/dotnet-core/asp.net-core/3.x/Program.cs similarity index 100% rename from samples/dotnet-core/asp.net-core/3.x/Startup.cs rename to samples/dotnet-core/asp.net-core/3.x/Program.cs From 7fa9d4119fdd5ef27a8655c9dc67a4d0ec29ba4f Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 15:58:32 -0800 Subject: [PATCH 61/76] Create Startup.cs --- .../dotnet-core/asp.net-core/3.x/Startup.cs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 samples/dotnet-core/asp.net-core/3.x/Startup.cs diff --git a/samples/dotnet-core/asp.net-core/3.x/Startup.cs b/samples/dotnet-core/asp.net-core/3.x/Startup.cs new file mode 100644 index 00000000..cf6efcf4 --- /dev/null +++ b/samples/dotnet-core/asp.net-core/3.x/Startup.cs @@ -0,0 +1,95 @@ +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Oracle.ManagedDataAccess.Client; + +namespace ODPCoreASPCore3 +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapGet("/", async context => + { + //Demo: Basic ODP.NET Core application for ASP.NET Core 3.1 + // to connect, query, and return results to a web page + + //Set the user id and password + string conString = "User Id=hr;Password=;" + + + //Set Data Source value to an Oracle net service name in + // the tnsnames.ora file or use EZ Connect + "Data Source=:1521/;"; + + using (OracleConnection con = new OracleConnection(conString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + cmd.BindByName = true; + + //Use the command to display employee names from + // the EMPLOYEES table + cmd.CommandText = "select first_name, last_name from employees where department_id = :id"; + + // Assign id to the department number 50 + OracleParameter id = new OracleParameter("id", 50); + cmd.Parameters.Add(id); + + //Execute the command and use DataReader to display the data + OracleDataReader reader = cmd.ExecuteReader(); + while (reader.Read()) + { + await context.Response.WriteAsync("Employee Name: " + reader.GetString(0) + " " + reader.GetString(1) + "\n"); + } + + reader.Dispose(); + } + catch (Exception ex) + { + await context.Response.WriteAsync(ex.Message); + } + } + } + }); + }); + } + } +} + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ From b6db563175d66f842be34bd76f52dbd60a914715 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:09:39 -0800 Subject: [PATCH 62/76] Rename samples/dotnet-core/autonomous-db/autonomous-odp-core.cs to samples/dotnet-core/autonomous-db/console/autonomous-odp-core.cs --- .../autonomous-db/{ => console}/autonomous-odp-core.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename samples/dotnet-core/autonomous-db/{ => console}/autonomous-odp-core.cs (100%) diff --git a/samples/dotnet-core/autonomous-db/autonomous-odp-core.cs b/samples/dotnet-core/autonomous-db/console/autonomous-odp-core.cs similarity index 100% rename from samples/dotnet-core/autonomous-db/autonomous-odp-core.cs rename to samples/dotnet-core/autonomous-db/console/autonomous-odp-core.cs From b81ed2a7e01a1207b9536fff78808011d4ac9e8f Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:16:29 -0800 Subject: [PATCH 63/76] Update README.md --- samples/dotnet-core/autonomous-db/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/samples/dotnet-core/autonomous-db/README.md b/samples/dotnet-core/autonomous-db/README.md index e19a50f5..70975b77 100644 --- a/samples/dotnet-core/autonomous-db/README.md +++ b/samples/dotnet-core/autonomous-db/README.md @@ -1,9 +1,10 @@ -This ODP.NET Core Autonomous Database (ADB) code sample is intended to be used with the [Developing .NET Core Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/database/technologies/appdev/dotnet/adbdotnetcore.html). +The ODP.NET Core Autonomous Database (ADB) code sample in the "console" subdirectory is intended to be used with the [Developing .NET Core Applications for Oracle Autonomous Database tutorial](https://www.oracle.com/database/technologies/appdev/dotnet/adbdotnetcore.html). -This sample demonstrates how to connect to Oracle Autonomous Database, including Oracle Autonomous Transaction Processing and -Autonomous Data Warehouse. +This sample demonstrates how to connect to Oracle Autonomous Database, including Oracle Autonomous Transaction Processing and Autonomous Data Warehouse. Create a new .NET Core console project, add ODP.NET Core assembly ([Oracle.ManagedDataAccess.Core](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/)) from NuGet Gallery, and paste the sample code. You can then enter your ADB connection and configuration information into the pasted sample code as described in the comments. This repository has ADB code samples for ODP.NET Core, managed ODP.NET, and unmanaged ODP.NET. This directory contains the ODP.NET Core sample. The other ODP.NET Autonomous DB samples are located [here](https://github.com/oracle/dotnet-db-samples/tree/master/samples/autonomous-db). + +The "asp.net-core" contains ADB samples using ASP.NET Core and ODP.NET Core. From c334a9df27060a6091ceb6c9db3ccfaf2db7bcde Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:17:06 -0800 Subject: [PATCH 64/76] Update README.md --- samples/dotnet-core/autonomous-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dotnet-core/autonomous-db/README.md b/samples/dotnet-core/autonomous-db/README.md index 70975b77..09fd1acb 100644 --- a/samples/dotnet-core/autonomous-db/README.md +++ b/samples/dotnet-core/autonomous-db/README.md @@ -7,4 +7,4 @@ Create a new .NET Core console project, add ODP.NET Core assembly ([Oracle.Manag This repository has ADB code samples for ODP.NET Core, managed ODP.NET, and unmanaged ODP.NET. This directory contains the ODP.NET Core sample. The other ODP.NET Autonomous DB samples are located [here](https://github.com/oracle/dotnet-db-samples/tree/master/samples/autonomous-db). -The "asp.net-core" contains ADB samples using ASP.NET Core and ODP.NET Core. +The "asp.net-core" subdirectory contains an ADB sample using ASP.NET Core and ODP.NET Core. From 3941739db8536abac614060f2d7afefc9d46007b Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:33:38 -0800 Subject: [PATCH 65/76] Update README.md --- samples/dotnet-core/autonomous-db/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/dotnet-core/autonomous-db/README.md b/samples/dotnet-core/autonomous-db/README.md index 09fd1acb..8ef7a507 100644 --- a/samples/dotnet-core/autonomous-db/README.md +++ b/samples/dotnet-core/autonomous-db/README.md @@ -7,4 +7,4 @@ Create a new .NET Core console project, add ODP.NET Core assembly ([Oracle.Manag This repository has ADB code samples for ODP.NET Core, managed ODP.NET, and unmanaged ODP.NET. This directory contains the ODP.NET Core sample. The other ODP.NET Autonomous DB samples are located [here](https://github.com/oracle/dotnet-db-samples/tree/master/samples/autonomous-db). -The "asp.net-core" subdirectory contains an ADB sample using ASP.NET Core and ODP.NET Core. +The "web" subdirectory contains an ADB sample using ASP.NET Core and ODP.NET Core. From 17dc256bcb53bd32e262be3068abe235d02097a1 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:34:59 -0800 Subject: [PATCH 66/76] Create Program.cs --- .../dotnet-core/autonomous-db/web/Program.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 samples/dotnet-core/autonomous-db/web/Program.cs diff --git a/samples/dotnet-core/autonomous-db/web/Program.cs b/samples/dotnet-core/autonomous-db/web/Program.cs new file mode 100644 index 00000000..461fc596 --- /dev/null +++ b/samples/dotnet-core/autonomous-db/web/Program.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace ADB_ODPCore_ASPCore3 +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ From 3e584271394560abe8bf92cb84c883f7efb14a4d Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Mon, 2 Nov 2020 16:43:24 -0800 Subject: [PATCH 67/76] Create Startup.cs --- .../dotnet-core/autonomous-db/web/Startup.cs | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 samples/dotnet-core/autonomous-db/web/Startup.cs diff --git a/samples/dotnet-core/autonomous-db/web/Startup.cs b/samples/dotnet-core/autonomous-db/web/Startup.cs new file mode 100644 index 00000000..b5b70613 --- /dev/null +++ b/samples/dotnet-core/autonomous-db/web/Startup.cs @@ -0,0 +1,91 @@ +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Oracle.ManagedDataAccess.Client; + +namespace ADB_ODPCore_ASPCore3 +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapGet("/", async context => + { + //Demo: ODP.NET Core application for ASP.NET Core 3.1 to connect, + // query, and return results from Oracle Autonomous Database + + //Set the user id and password + string conString = "User Id=admin;Password=;" + + + //Set Data Source value to an Oracle net service name in + // the tnsnames.ora file + "Data Source=;"; + + //Set the directory where the sqlnet.ora, tnsnames.ora, and + // wallet files are located + OracleConfiguration.TnsAdmin = @""; + OracleConfiguration.WalletLocation = OracleConfiguration.TnsAdmin; + + using (OracleConnection con = new OracleConnection(conString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + await context.Response.WriteAsync("Connected to Oracle Autonomous Database." + "\n"); + + //Retrieve database version info + cmd.CommandText = "SELECT BANNER FROM V$VERSION"; + OracleDataReader reader = cmd.ExecuteReader(); + reader.Read(); + await context.Response.WriteAsync("The version is " + reader.GetString(0)); + + reader.Dispose(); + } + catch (Exception ex) + { + await context.Response.WriteAsync(ex.Message); + } + } + } + }); + }); + } + } +} + +/* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ From 64df3fc4dc7e304efa90b19a71d9280e1a1aa117 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 19:58:18 -0800 Subject: [PATCH 68/76] Create cicqn-json.cs --- session-demos/2021/21c/cicqn-json.cs | 146 +++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 session-demos/2021/21c/cicqn-json.cs diff --git a/session-demos/2021/21c/cicqn-json.cs b/session-demos/2021/21c/cicqn-json.cs new file mode 100644 index 00000000..d55d7af0 --- /dev/null +++ b/session-demos/2021/21c/cicqn-json.cs @@ -0,0 +1,146 @@ +/* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved. */ + +/****************************************************************************** + * + * You may not use the identified files except in compliance with The MIT + * License (the "License.") + * + * You may obtain a copy of the License at + * https://github.com/oracle/Oracle.NET/blob/master/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + * + *****************************************************************************/ + +using System; +using System.Data; +using Oracle.ManagedDataAccess.Client; + +namespace ODP.NET_CICQN_JSON_21c +{ + //This app demonstrates how to use Client Initiated Continquous Query Notification (CICQN) and + // JSON (OSON) data type with Oracle Database 21c. Works with autonomous, cloud, or on-premises DB. + + //Setup steps: + //1) "GRANT CHANGE NOTIFICATION TO " to use CICQN + //2) Create the J_PURCHASEORDER table and insert a JSON document into it. See SQL script. + //3) Use ODP.NET 21c and Oracle Database 21c to run the console app code. + //4) Populate the Constants class below with your app-specific values and run. + + class Program + { + static class Constants + { + //Enter your user id, password, and DB info, such as net service name, + // Easy Connect Plus, or connect descriptor + public const string ConString = "User Id=;Password=;Data Source=;Connection Timeout=30;"; + + //Enter directories where your *.ora files and your wallet are located, if applicable + public const string TnsDir = @""; + public const string WalletDir = @""; + + //Set the query to execute and JSON column to retrieve + public const string Query = "select PO_DOCUMENT from J_PURCHASEORDER"; + public const string JsonColumn = "PO_DOCUMENT"; + } + + static void Main() + { + //Directory where your cloud or database credentials are located, if applicable + OracleConfiguration.TnsAdmin = Constants.TnsDir; + OracleConfiguration.WalletLocation = Constants.WalletDir; + + //Turn on Client Initiated Continuous Query Notification + OracleConfiguration.UseClientInitiatedCQN = true; + + using (OracleConnection con = new OracleConnection(Constants.ConString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + Console.WriteLine("Successfully connected to Oracle Database"); + Console.WriteLine(); + + //CQN setup + OracleDependency dep = new OracleDependency(cmd); + cmd.Notification.IsNotifiedOnce = false; + dep.OnChange += new OnChangeEventHandler(JSON_Notification); + + //Retrieve purchase order stored as JSON (OSON) type + //Store JSON data as string in disconnected DataSet + cmd.CommandText = Constants.Query; + OracleDataAdapter da = new OracleDataAdapter(cmd); + using (DataSet ds = new DataSet()) + { + da.Fill(ds); + foreach (DataTable table in ds.Tables) + { + foreach (DataRow row in table.Rows) + { + //Output the query result to the console + Console.WriteLine(row[Constants.JsonColumn].ToString()); + } + } + + //While result set is disconnected from database, modify the purchase + // order data through ODT or SQL*Plus, such as with the following SQL: + //UPDATE j_purchaseorder SET po_document = json_transform(po_document, SET '$.LastUpdated' = SYSDATE); + //Changing the data on database triggers the CICQN event handler. + //Each time the update statement runs, a new notification will be sent to the app. + + Console.ReadLine(); + } + da.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + } + public static void JSON_Notification(object src, OracleNotificationEventArgs args) + { + //Each time event handler launches, it retrieves the updated purchase order details + //Note that the LastUpdated entry has been changed. + Console.WriteLine(); + Console.WriteLine("Change detected."); + + using (OracleConnection con = new OracleConnection(Constants.ConString)) + { + using (OracleCommand cmd = con.CreateCommand()) + { + try + { + con.Open(); + cmd.CommandText = Constants.Query; + OracleDataAdapter da = new OracleDataAdapter(cmd); + using (DataSet ds = new DataSet()) + { + da.Fill(ds); + foreach (DataTable table in ds.Tables) + { + foreach (DataRow row in table.Rows) + { + Console.WriteLine(row[Constants.JsonColumn].ToString()); + } + } + } + da.Dispose(); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + } + } +} From c7321cc1515b0b0142c46d640447d9730fb1b4f4 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:01:39 -0800 Subject: [PATCH 69/76] Create setup.sql --- session-demos/2021/21c/setup.sql | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 session-demos/2021/21c/setup.sql diff --git a/session-demos/2021/21c/setup.sql b/session-demos/2021/21c/setup.sql new file mode 100644 index 00000000..0a9ec061 --- /dev/null +++ b/session-demos/2021/21c/setup.sql @@ -0,0 +1,17 @@ +CREATE TABLE j_purchaseorder + (id VARCHAR2 (32) NOT NULL PRIMARY KEY, + date_loaded TIMESTAMP (6) WITH TIME ZONE, + po_document JSON); + +INSERT INTO j_purchaseorder + VALUES (SYS_GUID(), + to_date('30-DEC-2014'), + '{"PONumber" : 1600, + "Reference" : "ABULL-20140421", + "Requestor" : "Alexis Bull", + "User" : "ABULL", + "CostCenter" : "A50", + "ShippingInstructions" : "Mail package", + "Special Instructions" : null, + "AllowPartialShipment" : true, + "LineItems" : "Hardware"}'); From 6639652f05571a952912d6ca132d5f92de97df6b Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:01:57 -0800 Subject: [PATCH 70/76] Update setup.sql --- session-demos/2021/21c/setup.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/session-demos/2021/21c/setup.sql b/session-demos/2021/21c/setup.sql index 0a9ec061..8356f114 100644 --- a/session-demos/2021/21c/setup.sql +++ b/session-demos/2021/21c/setup.sql @@ -8,7 +8,7 @@ INSERT INTO j_purchaseorder to_date('30-DEC-2014'), '{"PONumber" : 1600, "Reference" : "ABULL-20140421", - "Requestor" : "Alexis Bull", + "Requestor" : "Alexis Bull", "User" : "ABULL", "CostCenter" : "A50", "ShippingInstructions" : "Mail package", From 3e8b819bb4709746cd78ee1a36df2e9f23aad6fd Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:35:11 -0800 Subject: [PATCH 71/76] Create README.md --- session-demos/2021/21c/README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 session-demos/2021/21c/README.md diff --git a/session-demos/2021/21c/README.md b/session-demos/2021/21c/README.md new file mode 100644 index 00000000..36dadec4 --- /dev/null +++ b/session-demos/2021/21c/README.md @@ -0,0 +1,28 @@ +# ODP.NET Client Initiated Continuous Query Notification and JSON Data Type Code Sample +This C# sample console app uses ODP.NET Core 21c to demonstrate two new Oracle Database 21c features: +* Client Initiated Continuous Query Notification (CICQN) +* Native JSON binary data type (OSON) + +Learn more about ODP.NET CICQN and JSON data type in this blog post. + +These features require Oracle Database 21c and ODP.NET 21c or higher. You can download +[ODP.NET 21c from NuGet Gallery](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/3.21.1). +Oracle Database 21c can be deployed in minutes using a [free Oracle Autonomous Database](https://www.oracle.com/cloud/free/). + +Setup instructions: +1. The database administrator executes "GRANT CHANGE NOTIFICATION TO " so that the app can use CICQN. +2. Run the setup.sql file scripts to create the J_PURCHASEORDER table and insert a JSON document into the user's schema. +3. Populate the Constants class in the C# app with your app-specific values. + +The sample code retrieves the JSON data and shows the results on the console. While the app is idle, +another user can update the JSON data by running the following update statement in SQL Developer or Oracle +Developer Tools for Visual Studio. + +``` +UPDATE j_purchaseorder SET po_document = json_transform(po_document, SET '$.LastUpdated' = SYSDATE); +``` + +CICQN will then notify the application an update to the result occurred. The event handler will then re-query the database +for the new results. It will then display the results with the new LastUpdated JSON value. + +The update statement can be run repeatedly with the new JSON update returned every time. From ae4fe3b2aee80a0e03092a7762efd1bdae839377 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:37:18 -0800 Subject: [PATCH 72/76] Rename session-demos/2021/21c/cicqn-json.cs to session-demos/2021/cicqn-json/cicqn-json.cs --- session-demos/2021/{21c => cicqn-json}/cicqn-json.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename session-demos/2021/{21c => cicqn-json}/cicqn-json.cs (100%) diff --git a/session-demos/2021/21c/cicqn-json.cs b/session-demos/2021/cicqn-json/cicqn-json.cs similarity index 100% rename from session-demos/2021/21c/cicqn-json.cs rename to session-demos/2021/cicqn-json/cicqn-json.cs From 15180af0d40de09b8f32a75e12a1106c9cb561ad Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:37:51 -0800 Subject: [PATCH 73/76] Rename session-demos/2021/21c/setup.sql to session-demos/2021/cicqn-json/setup.sql --- session-demos/2021/{21c => cicqn-json}/setup.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename session-demos/2021/{21c => cicqn-json}/setup.sql (100%) diff --git a/session-demos/2021/21c/setup.sql b/session-demos/2021/cicqn-json/setup.sql similarity index 100% rename from session-demos/2021/21c/setup.sql rename to session-demos/2021/cicqn-json/setup.sql From 2b199e6d15398b9d9ed320beb00657b7c55c8b31 Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:38:37 -0800 Subject: [PATCH 74/76] Rename session-demos/2021/21c/README.md to session-demos/2021/cicqn-json/README.md --- session-demos/2021/{21c => cicqn-json}/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename session-demos/2021/{21c => cicqn-json}/README.md (100%) diff --git a/session-demos/2021/21c/README.md b/session-demos/2021/cicqn-json/README.md similarity index 100% rename from session-demos/2021/21c/README.md rename to session-demos/2021/cicqn-json/README.md From a8a6f6b39aa7747e0ee5228751a4e2e78c7d16bc Mon Sep 17 00:00:00 2001 From: Alex Keh Date: Thu, 11 Feb 2021 20:51:59 -0800 Subject: [PATCH 75/76] Update README.md --- session-demos/2021/cicqn-json/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/session-demos/2021/cicqn-json/README.md b/session-demos/2021/cicqn-json/README.md index 36dadec4..c818dcf8 100644 --- a/session-demos/2021/cicqn-json/README.md +++ b/session-demos/2021/cicqn-json/README.md @@ -3,14 +3,14 @@ This C# sample console app uses ODP.NET Core 21c to demonstrate two new Oracle D * Client Initiated Continuous Query Notification (CICQN) * Native JSON binary data type (OSON) -Learn more about ODP.NET CICQN and JSON data type in this blog post. +Learn more about [ODP.NET CICQN and JSON data type in this blog post](https://medium.com/@alex.keh/introducing-odp-net-21c-ef-core-5-json-and-more-ea0843e89dea). These features require Oracle Database 21c and ODP.NET 21c or higher. You can download [ODP.NET 21c from NuGet Gallery](https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/3.21.1). Oracle Database 21c can be deployed in minutes using a [free Oracle Autonomous Database](https://www.oracle.com/cloud/free/). Setup instructions: -1. The database administrator executes "GRANT CHANGE NOTIFICATION TO " so that the app can use CICQN. +1. The database administrator executes "GRANT CHANGE NOTIFICATION TO <USER>" so that the app can use CICQN. 2. Run the setup.sql file scripts to create the J_PURCHASEORDER table and insert a JSON document into the user's schema. 3. Populate the Constants class in the C# app with your app-specific values. From 5c16e227dd1ad7f031cd54b0b45356b9ef7648ae Mon Sep 17 00:00:00 2001 From: Christian Shay Date: Thu, 18 Feb 2021 09:24:15 -0800 Subject: [PATCH 76/76] thanks (#145) * Add files via upload * Create test * Delete readmeoverview.png * Add files via upload * Delete test --- .../odtvscodescreenshots/readmeoverview.png | Bin 0 -> 160367 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 session-demos/2019/odtvscodescreenshots/readmeoverview.png diff --git a/session-demos/2019/odtvscodescreenshots/readmeoverview.png b/session-demos/2019/odtvscodescreenshots/readmeoverview.png new file mode 100644 index 0000000000000000000000000000000000000000..e3137acc70d82e97de16b7aa2b0f1104e2e7906d GIT binary patch literal 160367 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 s=knKQ-c?QP?A3(Hlh^*8SoR literal 0 HcmV?d00001