Symfoware

Symfowareについての考察blog

C#からOracle 11g XEへODP.NETで接続

Oracle 11g XEをUbuntuへインストール。
テーブルを作成してみました。

Ubuntu Server 16.04にOracle Database Express Edition 11g Release 2をインストール
Oracle 11g XE ユーザー(スキーマ)とテーブルの作成


この環境へC#から接続してみようと思います。
OSはWindows Server 2016を使用しました。


.Net Provider



接続用のドライバを取得します。
こちらから「ODP.NET_Managed_ODAC122cR1.zip」をダウンロード。
http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html

803_01.png

803_02.png

解答したフォルダの「odp.net/managed/common」にある
「Oracle.ManagedDataAccess.dll」を使用すればデータベースに接続できます。

803_03.png

このdllをこれから作成するソースファイルと同じ階層に保存しておきます。




接続文字列



接続文字列に何を指定すればよいか?
こちらが参考になりました。
ODP.NET の接続文字列


ID:orauser
Password:Passw0rd
HOST:192.168.1.101
PORT:1521



この条件でOracle 11g XEに接続する場合の接続文字列はこうなります。


User ID=orauser;
Password=Passw0rd;
Data Source=
(DESCRIPTION = (ADDRESS_LIST = (ADDRESS=(PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = XE)));






サンプル



サンプルプログラムは以下のようになりました。

・Sample.cs


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Oracle.ManagedDataAccess.Client;
  5.     
  6. public class Sample {
  7.         
  8.     [STAThread]
  9.     public static void Main(string[] args) {
  10.         
  11.         OracleConnection con = new OracleConnection();
  12.         string dataSource = "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS=(PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = XE)))";
  13.         
  14.         con.ConnectionString = "User ID=orauser; Password=Passw0rd; Data Source=" + dataSource + ";";
  15.         con.Open();
  16.         
  17.         string sql = "SELECT * FROM sample";
  18.         OracleCommand cmd = new OracleCommand(sql, con);
  19.         
  20.         OracleDataReader reader = cmd.ExecuteReader();
  21.         while ( reader.Read() ) {
  22.             Console.WriteLine(string.Format("{0}:{1}", reader["id"], reader["val"]));
  23.         }
  24.         
  25.         reader.Close();
  26.         con.Close();
  27.         
  28.     }
  29. }





統合開発環境をインストールしていないので、こんなバッチファイルを作成してコンパイルしました。

・build.bat


@echo off
set csc="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"
set opt=/nologo
set recurse=/r:Oracle.ManagedDataAccess.dll

%csc% %opt% %recurse% Sample.cs





コンパイル&実行してみます。

803_04.png

動いてくれました。





DataAdapterを使用したサンプル



DataReaderではなくDataAdapterを使用したサンプルはこのようになりました。


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Oracle.ManagedDataAccess.Client;
  5.     
  6. public class Sample {
  7.         
  8.     [STAThread]
  9.     public static void Main(string[] args) {
  10.         
  11.         OracleConnection con = new OracleConnection();
  12.         string dataSource = "(DESCRIPTION = (ADDRESS_LIST = (ADDRESS=(PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = XE)))";
  13.         
  14.         con.ConnectionString = "User ID=orauser; Password=Passw0rd; Data Source=" + dataSource + ";";
  15.         con.Open();
  16.         
  17.         string sql = "SELECT * FROM sample";
  18.         OracleCommand cmd = new OracleCommand(sql, con);
  19.         
  20.         /*
  21.         OracleDataReader reader = cmd.ExecuteReader();
  22.         while ( reader.Read() ) {
  23.             Console.WriteLine(string.Format("{0}:{1}", reader["id"], reader["val"]));
  24.         }
  25.         
  26.         reader.Close();
  27.         */
  28.         
  29.         OracleDataAdapter adapter = new OracleDataAdapter(cmd);
  30.         DataSet ds = new DataSet();
  31.         adapter.Fill(ds);
  32.         
  33.         foreach(DataRow dr in ds.Tables[0].Rows) {
  34.             Console.WriteLine(string.Format("{0}:{1}", dr["id"], dr["val"]));
  35.         }
  36.         
  37.         con.Close();
  38.         
  39.     }
  40. }




実行結果はDataReaderを使用した場合と同様です。


【参考URL】

【C#】Oracleへの接続をクライアントインストール無しで行う
ODP.NET の接続文字列
[ ODP.NET ] Oracle へ接続し SQL を発行する (OracleConnection / OracleCommand)

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/08(水) 22:05:54|
  2. Oracle
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Oracle 11g XEへJava(JDBC)で接続

Oracle 11g XEをインストール。テーブルを作成しました。
Ubuntu Server 16.04にOracle Database Express Edition 11g Release 2をインストール
Oracle 11g XE ユーザー(スキーマ)とテーブルの作成

この環境にJavaからJDBC経由で接続してみます。

以前にも試してみたのですが、すっかり忘れています。
Oracle Database 10g Express Edition JDBCドライバを使用する



JDBCドライバの取得



こちらから取得しました。
JDBC および Universal Connection Pool (UCP)

802_01.png

Oracle 12cのドライバでも問題ないとは思うのですが、一応11gR2のものを選択しました。

802_02.png


「ojdbc6.jar」をダウンロード。
ビルドパスに含めておきます。

Eclipseではこうなりました。

802_03.png




検索サンプル



データベースへの接続と検索のサンプルはこんな感じになります。


  1. package com.fc2.blog68.symfoware;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class MainProcess {
  7.     public static void main(String... args) {
  8.         String url = "jdbc:oracle:thin:@192.168.1.101:1521:xe";
  9.         String user = "orauser";
  10.         String pass = "Passw0rd";
  11.         try (Connection con = DriverManager.getConnection(url, user, pass);
  12.                 Statement stmt = con.createStatement();
  13.                 ResultSet rs = stmt.executeQuery("select * from sample");) {
  14.             while (rs.next()) {
  15.                 System.out.println(rs.getInt("id"));
  16.                 System.out.println(rs.getString("val"));
  17.             }
  18.         } catch (Exception e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
  22. }




実行してみると、ちゃんと登録したが検索できました。


1
登録テスト






登録サンプル



データの登録を実行して検索してみます。


  1. package com.fc2.blog68.symfoware;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class MainProcess {
  7.     public static void main(String... args) {
  8.         String url = "jdbc:oracle:thin:@192.168.1.101:1521:xe";
  9.         String user = "orauser";
  10.         String pass = "Passw0rd";
  11.         try (Connection con = DriverManager.getConnection(url, user, pass);
  12.                 Statement stmt = con.createStatement();) {
  13.             
  14.             // 登録実行
  15.             stmt.execute("insert into sample (id, val) values (2, 'Javaから登録')");
  16.             
  17.             ResultSet rs = stmt.executeQuery("select * from sample");
  18.             while (rs.next()) {
  19.                 System.out.println(rs.getInt("id"));
  20.                 System.out.println(rs.getString("val"));
  21.             }
  22.         } catch (Exception e) {
  23.             e.printStackTrace();
  24.         }
  25.     }
  26. }




問題なさそうです。


2
Javaから登録
1
登録テスト



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/07(火) 23:46:45|
  2. Oracle
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Oracle 11g XE ユーザー(スキーマ)とテーブルの作成

Ubuntu 16.04にOracle 11g XEをインストールしました。
Ubuntu Server 16.04にOracle Database Express Edition 11g Release 2をインストール

テスト用のユーザーやテーブルを作成してみます。



スペースとユーザーの作成



Oracle、久しぶりに触るので完全に忘れています。
過去の記事を参考にしました。
Oracle xe universal 10g R2 ユーザー(スキーマ)とテーブルの作成


データを保存するディレクトリを作成。


$ sudo mkdir -p /usr/lib/oracle/xe/
$ sudo chmod 777 /usr/lib/oracle/xe/




sqlplusでデータベースに接続。


$ sqlplus sys/Passw0rd@xe as sysdba




テーブルスペースとテンポラリスペースを作成します。


###スペース作成
CREATE TABLESPACE TEST
DATAFILE '/usr/lib/oracle/xe/TEST.dbf' SIZE 100M
SEGMENT SPACE MANAGEMENT AUTO;

###テンポラリスペース作成
CREATE TEMPORARY TABLESPACE TESTTEMP
TEMPFILE '/usr/lib/oracle/xe/TESTTEMP.dbf' SIZE 100M
AUTOEXTEND ON;



801_01.png


引き続き、ユーザー(今回はorauser)を作成しました。


###ユーザー作成
CREATE USER orauser
identified by Passw0rd
default tablespace TEST
temporary tablespace TESTTEMP;

###権限付与
grant connect to orauser;
grant resource to orauser;



801_02.png


作成したユーザーで接続できるか試してみます。


$ sqlplus orauser/Passw0rd@xe



801_03.png

いい感じです。




テーブルの作成



せっかくなのでテーブルも作成してみます。


CREATE TABLE sample (
id int not null,
val varchar(100) not null
);



801_04.png


登録と検索をテスト。


INSERT INTO sample (id, val) VALUES (1, '登録テスト');
SELECT * FROM sample;



801_05.png

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/07(火) 23:23:06|
  2. Oracle
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Ubuntu Server 16.04にOracle Database Express Edition 11g Release 2をインストール

rpmパッケージで提供されているので、CentOSなどにインストールするのが楽なのですが、
Ubuntu 16.04 へ Oracle 11g Express Edition を入れてみた
こちらを参考に、Ubuntu Server 16.04へOracle Express Edition 11g(Oracle 11g XE)をインストールしてみます。



必要なパッケージのインストール



インストール時に必要なパッケージをインストールします。


$ sudo apt install alien libaio1 unixodbc unzip bc



ポイントは「bc」コマンドをインストールすること。
これをインストールしていないと、Oracleインストール時

/u01/app/oracle/product/11.2.0/xe/config/scripts/init.ora
というファイルのmemory_targetの設定値が空白となります。


memory_target=



これが影響して


ERROR at line 1:
ORA-01078: failure in processing system parameters
LRM-00116: syntax error at 'sessions' following '='



というエラーをログファイルに出力し、データベースの起動に知っパします。
結構はまった。




インストーラーの取得



こちらからインストーラーを取得します。
Oracle Database Express Edition 11g Release 2

800_01.png

サインインを求められます。
アカウントがない場合は、「プロファイルの作成」からアカウントを作成しダウンロードを実行。

800_02.png


「oracle-xe-11.2.0-1.0.x86_64.rpm.zip」が取得できました。
サーバーの適当なディレクトリにコピーします。




rpmからdebに変換



以前はdebパッケージも提供されていたのですが、
DebianにOracle xe universal 10g R2 をインストール
現在はrpmパッケージのみの提供となっているようです。

rpmパッケージからdebに変換します。


まず、zipファイルを解凍。


$ unzip oracle-xe-11.2.0-1.0.x86_64.rpm.zip
Archive: oracle-xe-11.2.0-1.0.x86_64.rpm.zip
creating: Disk1/
creating: Disk1/upgrade/
inflating: Disk1/upgrade/gen_inst.sql
creating: Disk1/response/
inflating: Disk1/response/xe.rsp
inflating: Disk1/oracle-xe-11.2.0-1.0.x86_64.rpm




Disk1というディレクトリが作成され、oracle-xe-11.2.0-1.0.x86_64.rpmが出力されます。

Disk1へ移動。
alienコマンドでrpmからdebへ変換します。
※結構時間がかかります。(5分程度)


$ cd Disk1
$ sudo alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm
oracle-xe_11.2.0-2_amd64.deb generated




出力されたdebファイル、そのままは使えません。
作業フォルダ「tmp_deb」を作成しコピー。
内容を修正していきます。


$ mkdir ./tmp_deb
$ cp ./oracle-xe_11.2.0-2_amd64.deb ./tmp_deb/
$ cd ./tmp_deb




debファイルの中身を抽出。


$ ar x ./oracle-xe_11.2.0-2_amd64.deb




抽出した内容を表示。


$ ls
control.tar.gz data.tar.xz debian-binary oracle-xe_11.2.0-2_amd64.deb




まず、作業用に「tmp_data」ディレクトリを作成してdata.tar.xzを解凍。
内容を微調整します。


$ mkdir ./tmp_data
$ cd ./tmp_data
$ tar axvf ../data.tar.xz ./




「oracle-xe」を編集。


$ vi ./etc/init.d/oracle-xe




赤字の部分を追記します。


#!/bin/bash
### BEGIN INIT INFO
# Provides:             OracleXE
# Required-Start:     $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Oracle 11g Express Edition
### END INIT INFO

#
#
# chkconfig: 2345 80 05
# description: This is a program that is responsible for taking care of
# configuring the Oracle Database 11g Express Edition and its associated
# services.





53行目 awk のパスを変更


#if [ -z "$AWK" ]; then AWK=/bin/awk; fi
if [ -z "$AWK" ]; then AWK=/usr/bin/awk; fi




/var/lock/subsys/ を /var/lock/へ書き換えます。
viのコマンドで「:%s/subsys\///gc」を実行。

800_03.png

6箇所置換されるはずです。
これでoracle-xeの編集は完了です。



引き続き、control.tar.gzの内容を微調整します。
「tmp_control」ディレクトリを作成して、control.tar.gzを解凍。


$ cd ../
$ mkdir ./tmp_control
$ cd ./tmp_control
$ tar axvf ../control.tar.gz ./




「postinst」を編集します。


$ vi ./postinst




114行目。/sbin/chkconfigの箇所を変更。


#/sbin/chkconfig --add oracle-xe
update-rc.d oracle-xe defaults 80 01



800_04.png

800_05.png


これでファイルの編集作業は完了です。
data.tar.xzとcontrol.tar.gzを削除。
ファイル編集後のディレクトリを改めてtar.gzで固めます。


$ rm ../data.tar.xz ../control.tar.gz
$ tar acvf ../control.tar.gz ./
$ cd ../tmp_data
$ tar acvf ../data.tar.gz ./




tmp_dataに移動


$ cd ../



内容はこうなっているはずです。


$ ls
control.tar.gz debian-binary                 tmp_control
data.tar.gz     oracle-xe_11.2.0-2_amd64.deb tmp_data




debパッケージ内のdata.tar.xzを削除。
作成したdata.tar.gz control.tar.gzを追加します。(control.tar.gzは上書きとなる)


$ ar d ./oracle-xe_11.2.0-2_amd64.deb data.tar.xz
$ ar r ./oracle-xe_11.2.0-2_amd64.deb data.tar.gz control.tar.gz




これでrpmからdebへの変換は終了です。




インストール



dpkgコマンドで作成したdebをインストールします。


$ sudo dpkg -i ./oracle-xe_11.2.0-2_amd64.deb
...
Executing post-install steps...
You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.
...




「'/etc/init.d/oracle-xe configure'を実行しろ」とのことなので実行します。
スクリプト実行中、各種ポート番号やパスワードを尋ねられます。

ポート番号はデフォルト
パスワードは「Passw0rd」
OS起動時、データベースも起動するよう指定しました。


$ sudo /etc/init.d/oracle-xe configure

Oracle Database 11g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 11g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press <Enter> to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:(そのままエンター)

Specify a port that will be used for the database listener [1521]:(そのままエンター)

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:(そのままエンター)
Password can't be null. Enter password:(パスワードを入力)
Confirm the password:(パスワードを再入力)

Do you want Oracle Database 11g Express Edition to be started on boot (y/n) [y]:(そのままエンター)

Starting Oracle Net Listener...Done
Configuring database...Done
Starting Oracle Database 11g Express Edition instance...Done
Installation completed successfully.




sqlplusコマンドが使えるよう、.profileに追記します。


$ vi ~/.profile




末尾に1行追加。


source /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh




即時反映。


$ source ~/.profile




sqlplusでデータベースに接続できるか試してみます。

構文は「sqlplus sys/[パスワード]@xe as sysdba」


$ sqlplus sys/Passw0rd@xe as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on 火 11月 7 22:50:09 2017
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL>





うまく起動できているようです。
lsnrctlコマンドでXEインスタンスが起動ていることも確認できました。


$ lsnrctl services

LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 07-11月-2017 22:52:34

Copyright (c) 1991, 2011, Oracle. All rights reserved.

(DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE)))に接続中
サービスのサマリー...
サービス"PLSExtProc"には、1件のインスタンスがあります。
インスタンス"PLSExtProc"、状態UNKNOWNには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
     "DEDICATED" 確立:0 拒否:0
         LOCAL SERVER
サービス"XE"には、1件のインスタンスがあります。
インスタンス"XE"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
     "DEDICATED" 確立:1 拒否:0 状態:ready
         LOCAL SERVER
サービス"XEXDB"には、1件のインスタンスがあります。
インスタンス"XE"、状態READYには、このサービスに対する1件のハンドラがあります...
    ハンドラ:
     "D000" 確立:0 拒否:0 現行:0 最大:1022 状態:ready
         DISPATCHER <machine: ubuntu, pid: 19026>
         (ADDRESS=(PROTOCOL=tcp)(HOST=ubuntu)(PORT=40012))
コマンドは正常に終了しました。





【参考URL】

Ubuntu 16.04 へ Oracle 11g Express Edition を入れてみた

Oracle 11g XE を Ubuntu 11.10 にインストールする

テーマ:サーバ - ジャンル:コンピュータ

  1. 2017/11/07(火) 23:05:35|
  2. Oracle
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集

Oracle NoSQL DatabaseへJavaでデータの登録、検索、削除

Oracle NoSQL Databaseをインストールしてみました。
Debian squeezeにOracle NoSQL Databaseをインストールする


別の端末から、データの登録や検索を行うプログラムを作成してみます。


設定の変更



データベースの設定を行うとき「localhost」と指定していましたが、
どうやら別の端末から接続する時は、これでは都合が悪いようです。

一旦、データフォルダを削除し、以下の内容で設定をやり直しました。


# /opt/kv-1.1.100/bin/kvctl runadmin -port 5000 -host localhost
kv-> configure mystore
kv-> plan -execute -name "Deploy DC" deploy-datacenter "Boston" "Savvis"
1
kv-> plan -execute -name "Deploy n01" deploy-sn 1 192.168.1.4 5000 "comment"
2
kv-> plan -execute -name "Deploy admin" deploy-admin 1 5001
3
kv-> addpool BostonPool
kv-> show topology
dc=[dc1] name=Boston
sn=[sn1] dc=dc1 192.168.1.4:5000 status=RUNNING

kv-> joinpool BostonPool 1
AllStorageNodes: sn1
BostonPool: sn1

kv-> plan -execute -name "Deploy the store" deploy-store BostonPool 1 300
4




「192.168.1.4」がテスト端末のIPアドレスです。
DNSが正しく設定されている場合は、端末名のほうがよいと思います。






依存しているjarファイル



データベースへの接続に必要なjarファイルは、lib/kvclient-1.1.100.jarのみでした。
これをコピーして、ビルドパスに含めておきます。






サンプル



簡単な登録、検索、削除を行うサンプルはこんな感じになりました。


package sample;

import oracle.kv.KVStore;
import oracle.kv.KVStoreConfig;
import oracle.kv.KVStoreFactory;
import oracle.kv.Key;
import oracle.kv.Value;
import oracle.kv.ValueVersion;


public class MainProccess {
    
    public static void main(String[] args) throws Exception {
        KVStore store = null;
        String storeName = "mystore";
        String hostName = "192.168.1.4";
        String hostPort = "5000";
        
        //キーストアを作成
        store = KVStoreFactory.getStore(new KVStoreConfig(storeName, hostName + ":" + hostPort));
        
        //登録するキーとデータ
        String keyString = "TestKey";
        String valueString = "日本語のテストデータ";
        
        //データの登録
        store.put(Key.createKey(keyString), Value.createValue(valueString.getBytes()));
        
        //データの取得
        ValueVersion valueVersion = store.get(Key.createKey(keyString));

        System.out.println(keyString + " " + new String(valueVersion.getValue().getValue()));
        
        //データの削除
        store.delete(Key.createKey(keyString));
        
        valueVersion = store.get(Key.createKey(keyString));
        if (valueVersion == null) {
            System.out.println("valueVersion is null.");
        } else {
            System.out.println(keyString + " " + new String(valueVersion.getValue().getValue()));
        }
        
        store.close();        
    }
}





実行結果。

TestKey 日本語のテストデータ
valueVersion is null.






テーマ:データベース - ジャンル:コンピュータ

  1. 2011/10/30(日) 00:00:52|
  2. Oracle
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ