C#でOracle

C#でOracleを扱う

Oracleの設定

C#でOracleに接続します。今回は .net frameworkではなく新しい .netの方です。なのでDataSetは使いません。

Oracleの無料版をインストール

Oracleのダウンロードページに行きます

Oracle download

今回は無料版をダウンロードします

Oracle express

サイズは1.9Gbyteあります。しばらく掛かります。コーヒーでもどうぞ

Oracle express

それを解凍します。

Oracle express

解凍したらそのフォルダーの中の「setup.exe」を起動して、インストールしてください

途中、sysとsystemのパスワードを聞かれるので自分で考えて入力して記憶してください

今回入れたExpress versionは、無料で使えます。またコンテナという入れ物があり、自分で作成することもできるのですが、最初から出来合いのコンテナが「XEPDB1」という名前でできていますので、これを使います。

最初にsqlplusというCUIのツールがあるので、これで初期設定していきます。コマンドプロンプトで特権付きでsqlplusを起動します

oracle最初の設定
C:\Users\f1225>sqlplus sys/password as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 火 4月 23 09:35:10 2024
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=XEPDB1;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
XEPDB1
SQL>

con_nameというのがコンテナー名でデフォルトのCDB$ROOTからXEPDB1に切り替えることができます。プラガブルデータベースというらしい

続いてコンテナーの中にテーブルスペースを確保します。

テーブルスペース確保
create tablespace mydb datafile 'c:\app\f1225\product\21c\oradata\xe\xepdb1\mydb.dbf' size 100M
autoextend on next 500K maxsize 1024m;

c:\appはoracleをインストールしたときにできています。その中のXEPDB1用の中にテーブルスペースを確保しました。

ユーザー作成
create user あなたのユーザー名 identified by "あなたのパスワード"
default tablespace mydb
temporary tablespace temp
profile default;

grant DBA to あなたのユーザー名;

ユーザーを作ったので一度入りなおしてみます

テーブル作成
SQL> exit
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0との接続が切断されました。
    
C:\Users\f1225>sqlplus あなたのユーザー名/あなたのパスワード@localhst:1521/XEPDB1

Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL> show con_name

CON_NAME
------------------------------
XEPDB1
SQL>
create table Shohin
(shohin_id char(4) not null,
shohin_mei varchar(100) not null,
shohin_bunrui varchar(32) not null,
hanbai_tanka integer,
shiire_tanka integer,
torokubi date,
primary key (shohin_id));

insert into shohin values ('0001','Tシャツ','衣服',1000,500,'2009-09-20');
insert into shohin values ('0002','穴あけパンチ','事務用品',500,320,'2009-09-11');
insert into shohin values ('0003','カッターシャツ','衣服',4000,2800,null);
insert into shohin values ('0004','包丁','キッチン用品',3000,2800,'2009-09-20');
insert into shohin values ('0005','圧力鍋','キッチン用品',6800,5000,'2009-01-15');
insert into shohin values ('0006','フォーク','キッチン用品',500,null,'2009-09-20');
insert into shohin values ('0007','おろしがね','キッチン用品',880,790,'2008-04-28');
insert into shohin values ('0008','ボールペン','事務用品',100,null,'2009-11-11');

コンテナーもあってます。テーブルを作ります。

shohin確認
select * from shohin;
......
SHOHIN_I
--------
SHOHIN_MEI
--------------------------------------------------------------------------------
SHOHIN_BUNRUI                                                    HANBAI_TANKA
---------------------------------------------------------------- ------------
SHIIRE_TANKA TOROKUBI
------------ --------
0008
ボールペン
事務用品                                                                  100
             09-11-11


8行が選択されました。

なんじゃこっりゃーーー

設定した文字の長さ分でてくるので、読みづらい。そこで調整します

shohin テーブル確認
SQL> set linesize 300
SQL> column shohin_bunrui format a20
SQL> column shohin_mei format a20
SQL> select * from shohin;

SHOHIN_I SHOHIN_MEI           SHOHIN_BUNRUI        HANBAI_TANKA SHIIRE_TANKA TOROKUBI
-------- -------------------- -------------------- ------------ ------------ --------
0001     Tシャツ              衣服                         1000          500 09-09-20
0002     穴あけパンチ         事務用品                      500          320 09-09-11
0003     カッターシャツ       衣服                         4000         2800
0004     包丁                 キッチン用品                 3000         2800 09-09-20
0005     圧力鍋               キッチン用品                 6800         5000 09-01-15
0006     フォーク             キッチン用品                  500              09-09-20
0007     おろしがね           キッチン用品                  880          790 08-04-28
0008     ボールペン           事務用品                      100              09-11-11

8行が選択されました。

SQL>

ようやくデータが入りました。

テーブル一覧
select table_name,owner from dba_tables where owner='大文字のユーザー名';

ちなみに、テーブルはdba_tables表に入っているので、大文字のユーザー名で絞って出せばテーブル一覧が出ます

c#のプロジェクトを作ります

新規にC#のプロジェクト作成

Visual Studioを立ち上げて、新しいプロジェクトを作成していきます。

新規プロジェクトを作成します。

プロジェクト作成

.NETのformアプリケーションを選択します。似たものがいっぱいあるので間違わないようにしてください。.net frameworkではない方です。

プロジェクトの名前を設定します。csCoreOracletest1としました。

ではFormを作っていきましょう。FormにはListViewとボタンを貼り付けます

Form 作成

さて、Oracleに接続するにはライブラリーを追加しないといけません。

Visual Studioでは、必要なイブラリーはNuGetから取得するようになっています。

NuGetライブラリー

最初取得済みのリストがでるので参照に切り替えて「Oracle」を検索して、Oracle.ManagedDataAccess.Coreを選択

Oracle.ManagedDataManager.Coreライブラリー

プロジェクトにチェックを入れて「インストール」します。実は最初Oracle.ManagedDataAccessを使ったのですが、インストールできて実行もできたのですが、インストール時にエラーがでていたので、変えました

これでOracleへの接続が使えるようになるので、コーディングしていきます

Form1.cs
    using Oracle.ManagedDataAccess.Client;

    namespace csCoreOracleTest1
    {
        public partial class Form1 : Form
        {
            public String sql = "Select shohin_id,shohin_mei,shohin_bunrui," +
                "hanbai_tanka, case when shiire_tanka is null then 0 else shiire_tanka end, " +
                "case when torokubi is null then to_date('1970-01-01','YYYY-MM-DD') else torokubi end " +
                "from shohin";
            public String ConnectionString =
                "Data Source=" +
                    "(DESCRIPTION=" +
                    "(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))" +
                    "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XEPDB1))); " +
                    "User Id=eternal; Password=kagosima";
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void btnRead_Click(object sender, EventArgs e)
            {
                listView1.Items.Clear();
                listView1.View = View.Details;
    
                listView1.Columns.Add("id");
                listView1.Columns.Add("商品名");
                listView1.Columns.Add("分類");
                listView1.Columns.Add("単価");
                listView1.Columns.Add("仕入");
                listView1.Columns.Add("登録日");
                listView1.Columns[0].Width = 100;
                listView1.Columns[1].Width = 150;
                listView1.Columns[2].Width = 100;
                listView1.Columns[3].Width = 100;
                listView1.Columns[4].Width = 100;
                listView1.Columns[5].Width = 100;
    
                try
                {
                    using (OracleConnection conn = new OracleConnection(ConnectionString))
                    {
                        conn.Open();
                        using (OracleCommand cmd = new OracleCommand(sql, conn))
                        {
                            using (OracleDataReader reader = cmd.ExecuteReader())
                            {
                                while (reader.Read())
                                {
                                    ListViewItem item = new ListViewItem();
                                    item.Text = reader.GetString(0).ToString();
                                    item.SubItems.Add(reader.GetString(1).ToString());
                                    item.SubItems.Add(reader.GetString(2).ToString());
                                    item.SubItems.Add(reader.GetInt32(3).ToString());
                                    item.SubItems.Add(reader.GetInt32(4).ToString());
                                    item.SubItems.Add(reader.GetDateTime(5).Date.ToString("yyyy/MM/dd"));
                                    listView1.Items.Add(item);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }    
    

Oracleは1521ポートへの接続です。コンテナーをXEPDB1にしています。今回はListViewでやりましたので、各列の設定をして、reader.Read()で1行読んでは貼り付けで読むことができました。