C#&Oracle-マージナルノート-1

画像

昔々、とても昔...

同社はOracleデータベースのライセンスを購入しました。 それから私はこの会社に就職しました。 したがって、.Netを「大衆に」宣伝し始めました。 Oracleデータベースは多くの組織では使用されていませんが、使用されています。
C#を使用してOracleデータベースとやり取りする方法は?



私は事前に予約します。私はオラクルの第一人者ではありません。 また、パターンの美しい使い方の第一人者ではありませんが、私は試してみて、パイがどこにあるのかを知っています私は哲学的に質問に近づき、それが何であるか、私は欲しいものを知っていますが、私はそれを必要な方法で使用します。

しかし、哲学を残しましょう。 タスクを引き受けましょう。
まず最初に、「水曜日」を準備する必要があります。
1. Oracleクライアントをインストールします。これがないと、データベースとの対話を実行できません。
2.ニーズに合わせてTNSをカスタマイズします。
3. Visual Studioでプロジェクトを作成します。
4. System.Data.OracleClient.dllアセンブリへの参照を追加します。これを使用して、データベースを「操作」します。

私たちは地面を準備し、おそらく軍事委員会データベースを作成します。 最も単純な場合、これには1つのテーブルで十分です。
create table CONSCRIPT_INFO (
ID NUMBER not null ,
FIRST_NAME VARCHAR2(128),
LAST_NAME VARCHAR2(128),
AGES NUMBER,
GROWTH FLOAT ,
BIOGRAPHY CLOB ,
constraint PK_CONSCRIPT_INFO primary key (ID)
);



識別子、名、姓、年齢、身長、伝記。 体重は興味がありません。

私の意見では、最も興味深いものを追加するための手順を定義し、それから理由を説明します。
PROCEDURE ADD_CONSCRIPT
(FirstNameIn IN VARCHAR2, LastNameIn IN VARCHAR2,
AgesIn IN NUMBER, GrowthIn IN FLOAT , BiographyIn IN CLOB )
IS
BEGIN
INSERT INTO CONSCRIPT_INFO
(
ID,
FIRST_NAME,
LAST_NAME,
AGES,
GROWTH,
BIOGRAPHY
)
VALUES
(
CONSCRIPT_INFO_SEQ.NEXTVAL,
FirstNameIn,
LastNameIn,
AgesIn,
GrowthIn,
BiographyIn
);
END ;


取り外し:

PROCEDURE DELETE_CONSCRIPT
(ConscriptIDIn IN NUMBER)
IS
BEGIN

DELETE
FROM CONSCRIPT_INFO
WHERE ID = ConscriptIDIn;

END ;


データの受信:

PROCEDURE GET_CONSCRIPTS
(ConscriptsOut OUT sys_refcursor)
IS
BEGIN

OPEN ConscriptsOut FOR
SELECT *
FROM CONSCRIPT_INFO;

END ;


次に、新しいユーザー(CLOB型のオブジェクト)を追加する手順で興味深いことを説明します。 このタイプは、最大4000バイトの文字列を処理できるVarcharとは異なり、最大4ギガバイトのサイズの文字列データを格納できます。 つまり サイズが5000のVARCHARフィールドを作成しようとすると、深刻な「バマー」が発生します。 しかし、C#のCLOB型を使用した人は、これが非常に「チェリャビンスク」であることを知っています。 しかし、私は注文について自分より先に進みます。

Oracleを使用する場合、接続を明示的に閉じないと、SELECT`aが指数関数的に増加した後にカーソルの数が増えます。 この問題は「正面から」解決されます。

接続を作成して開く


using (OracleConnection connection = new OracleConnection())
{
...
}


これにより、IDisposableがすべての大まかな作業を行います。
OracleConnectionコンストラクターに注目すると、「空」とデータベースへの接続を説明する文字列を使用する2つのオプションがあることがわかります。
行は次のようになります。
データソース= out_database_name;パスワード= our_password;ユーザーID = our_username
説明は、ここでは、この行は不要だと思います。

次のステップは、接続を開くことです。
connection.Open();


チームビルディング


これで、チームを実行する準備が整いました。 コマンドを使用した後、それを「解放」する必要もあります。原則から逸脱せず、同じ素晴らしい使用構文を使用します。

using (OracleConnection connection = new OracleConnection())
{
using (OracleCommand command = new OracleCommand())
{
command.Connection = connection;
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "GET_CONSCRIPTS" ;
}
}


この「断片」のコードが何をするのかを考えてみましょう。最初にチームが作成され、接続が割り当てられ、その中でチームが作業します。 次に、コマンドのタイプが示され、合計3つのタイプが強調表示されます。
1. StoredProcedure-ストアドプロシージャの名前。
2. TableDirect-テーブルの名前。
3.テキスト-SQLテキストコマンド。 (デフォルト)。

次のパラメーターはテキストで、直接ストアドプロシージャまたはコマンドの名前です。 この場合、 「GET_CONSCRIPTS」というストアドプロシージャが使用されます。

さあ、先に進みましょう
渡されたパラメーターを使用する


すぐに予約します。CommandType.Textでパラメーターを使用することもできます。これを行う方法を以下に示します。

それまでの間、オプションに戻ります。

OracleParameter ConscriptsOut = new OracleParameter()
{
ParameterName = "ConscriptsOut" ,
Direction = System.Data.ParameterDirection.Output,
OracleType = OracleType.Cursor
};

command.Parameters.Add(ConscriptsOut);


ここで何が起こっているのか:パラメーターを作成し、「exit」で動作することを示し、パラメーターのタイプを示しました(使用されているタイプと標準の.Netタイプとの互換性に関する詳細情報はMSDNで見つけることができます)。 パラメーターが「入力」で機能する場合、 値-Valueを指定する必要があります。 パラメータをチームに添付して...

コマンド実行


command.ExecuteNonQuery();


コマンドは完了しました...これで、たとえば次のようにデータを「レーキ」できます。

DataTable table = new DataTable();
table.Load(command.Parameters[ "ConscriptsOut" ].Value as OracleDataReader);


返されるパラメータは、OracleDataReaderのように読み取ることができるカーソルです。 パラメータの分解方法は「宿題」のままです;)。

道路上


結論として、パラメーターをテキストに渡す方法について説明したいのですが、次のように表示します。

using (OracleConnection connection = new OracleConnection())
{
using (OracleCommand command = new OracleCommand())
{
command.Connection = connection;
command.CommandType = System.Data.CommandType.Text;
command.CommandText = @"SELECT *
FROM CONSCRIPT_INFO
WHERE AGES < :max_ages;"
;

OracleParameter maxAges = new OracleParameter()
{
ParameterName = "max_ages" ,
Direction = ParameterDirection.Input,
OracleType = OracleType.Number,
Value = 27
};

command.Parameters.Add(maxAges);

OracleDataReader reader = command.ExecuteReader();

...
}
}


ご覧のとおり、トリックは- 記号を使用することです。

次の記事では、CLOBの操作について説明し、自分に合ったコードを提供します。

Source: https://habr.com/ru/post/J73842/


All Articles