質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

4回答

3388閲覧

OracleCommandでテーブル名を""で囲ったまま実行したい

cs_681hak

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/08/11 12:00

前提・実現したいこと

C#でOracleCommandを使用し、Oracleのデータベースからデータを取得するプログラムを組んでいる者です。初心者なりに頑張ってコードの記述方法や仕組みはわかってきているところですが、現在Oracleのデータベースからデータを取得する段階で困っていることがあります。

発生している問題・エラーメッセージ

Oracleのデータベースに登録されているテーブル名、カラム名がダブルクォーテーションで囲まれており、String型のSQL文を登録したOracleCommandを実行する時テーブル名が無いとエラーを返されています。調査したところこの場合はSQL文でもテーブル名、カラム名をダブルクォーテーションで囲む必要があるとわかっているのですが、このOracleCommandでダブルクォーテーションを使用したテーブル名・カラム名を指定することが可能かどうかわからない状態です。
(イメージ:"Select * from "テーブル名" ~")
なおやり方について、予めstring型の変数にSQL文を用意しておき、new OracleCommand()の宣言時にこの変数を設定しておくという形を使用しています。

試したこと

・エスケープ処理をする/分割する
\でエスケープしたりシングルクォーテーションで"を囲い分解したりしましたが、どの方法でもバックスラッシュが消えず処理できませんでした。またこのバックスラッシュはReplace()でも消せないことがわかっています。

補足情報(FW/ツールのバージョンなど)

使用環境:
コード作成:VisualStudio 2019
データベース:Oracle

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/08/11 12:08

そのコードを提示しよう
takasima20

2021/08/11 12:17

Oracleのテーブル名や項目名は大文字/小文字の区別はないけど、どうしても使い分けたい場合などに出ブルクオーテーションで囲ってアクセスするようです。(なので綴りはきっちり同じにします) 実際のコードが無いから分からんけど、単に全体をシングルクオーテーションで囲むんじゃだめなの?
退会済みユーザー

退会済みユーザー

2021/08/12 01:17 編集

ここのコメントは回答欄に移しました
退会済みユーザー

退会済みユーザー

2021/08/13 02:42

質問者さん、無言ですが、回答が出ているのでそれらに対するフィードバックを書こう。役に立った、立たなかったぐらいはすぐ返せるのでは? 役に立たなかったならどこがダメだったのかを書くとより期待する回答に近いものが出てくるかも。とにかく無言は NG です。
guest

回答4

0

デバッガの表示で勘違いされているのだと思います。

C#

1string test = "abc\"def\"ghi\nあああ"; 2string test2 = @"abc""def""ghi";

とした場合、ウォッチに追加するとエスケープ文字がある状態で表示されます。
改行などの表現できないものを視認するためにこのようになっているのだと思います。

下のように"test,nq"とするとエスケープ文字は表示されず変数に格納されているそのままのものが表示されます。
また、「,nq」としなくても虫眼鏡マークを押してテキストビジュアライザーで表示すれば
エスケープ文字のない状態で表示されます。
イメージ説明
イメージ説明

投稿2021/08/14 15:40

編集2021/08/14 15:43
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Oracle は試せる環境が無く未検証・未確認ですが・・・

SQL Server の場合は

Select * from [テーブル名]

MySQL の場合は

Select * from `テーブル名`

のようにするところを、Oracle の場合は

Select * from "テーブル名"

とする。その文字列を ADO.NET の Command に渡すにはどうしたらいいかという話ですか?

つまり、以下の記事、

OracleCommandクラス
https://docs.oracle.com/cd/E16338_01/win.112/b66456/OracleCommandClass.htm

のサンプルコード、

string cmdQuery = "select ename, empno from emp"; // Create the OracleCommand OracleCommand cmd = new OracleCommand(cmdQuery);

にある cmdQuery に Select * from "テーブル名" という文字列を渡したいというような話であれば、以下のようにしてみたらどうなりますか?

string cmdQuery = "Select * from \"テーブル名\""; // Create the OracleCommand OracleCommand cmd = new OracleCommand(cmdQuery);

" は文字列の中では " とする、即ち \ を付与してエスケープする必要があります。詳しくは以下のドキュメントを読んでください。

文字列のエスケープ シーケンス
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/strings/#string-escape-sequences

注:上のコードで \ はバックスラッシュ U+005C です。U+00A5 ではありません。

イメージ説明

ここ Teratail では使用しているフォントの関係で場所によって見え方が違うので注意してください。例えば:

イメージ説明

投稿2021/08/12 01:11

編集2021/08/12 01:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cs_681hak

2021/08/14 10:58

返信が遅れて申し訳ありません。 SurferOnWww様の仰る通りの方法で処理をしたいと考えておりました。文字コードU+005Cの使用については試しており、Visual Studio上で試しましたがブレークポイントを置いて確認したところバックスラッシュが入っていました。 Oracleのテーブルなどを確認できるソフトがあるため、そちらでダブルクォーテーションをテーブル名やカラム名から外す方法で無理やり処理を通す、またはOracleCommandを使用した処理に頼らない手法を探してみたいと思います。 回答ありがとうございました。
matukeso

2021/08/14 11:26

インテリセンスのポップアップ表示とかウオッチウインドウだと\ついて見えますが、 テキストビジュアライザでみると\マーク消えません?
退会済みユーザー

退会済みユーザー

2021/08/14 11:44

> Visual Studio上で試しましたがブレークポイントを置いて確認したところバックスラッシュが入っていました。 何をどうやって見てそう思ったのか分かりませんが、上の回答のコードのようにすれば Oracle に渡される SELECT クエリの文字列に「バックスラッシュが入っていました」ということはあり得ません。見方の問題です。イイカゲンすぎますよ。
guest

0

逐語的文字列で指定してみてはどうでしょう。

C#

1string SQL = @"Select * from ""テーブル名"" ~"

投稿2021/08/11 12:34

編集2021/08/12 00:38
sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/08/11 12:42

C#だとエスケープは「\"」じゃないですか?
sazi

2021/08/11 14:13 編集

エスケープではなく、逐語的文字列です。 VBと同様に"だけは特殊で同じだったはずですが、確認はしてませんので、駄目かもしれませんが。
YAmaGNZ

2021/08/11 22:08

逐語的文字列であれば@"SELECT * FROM ""table"" ~"じゃないですか?
sazi

2021/08/12 00:31 編集

試せてないので、ご指摘が正しいかもしれません。
cs_681hak

2021/08/14 10:47

返信が遅れてしまい申し訳ありません。 回答にて示して頂いた方法は試しており、エスケープした場合バックスラッシュが加わったままstring型の変数へ代入されるようでした。 Oracleのテーブルなどを全て確認できるものがあるので、それを使ってテーブル名とカラム名を全てダブルクォーテーションなしに書き換えるかOracleCommandを使わない方法で処理を組んでみたいと思います。 回答ありがとうございました。
sazi

2021/08/14 15:14 編集

> エスケープした場合バックスラッシュが加わったままstring型の変数へ代入されるようでした。 逐語的文字列で"の重ね書きしてもバックスラッシュに置換されるという事ですか? 他の方の回答のコメントにもありますけど、本当に試してますか?
guest

0

C#は使ったことがありません。

Oracle SQLではテーブル名や列名など(Oracle Object)にマルチバイト文字や空白などを含める時にダブルクォーティング(ダブルクォートで囲む)することでsqlplusで実行できます。

ダブルクォーティングされたOracle Objectが動作できないミドルウェアもあるので、日本オラクルの有償研修ではsqlplusなど一部のソフトウェアで実行する以外の用途ではダブルクォーティングしなければならないようなネーミングはするな、って教えています。

投稿2021/08/11 12:14

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cs_681hak

2021/08/14 11:01

返信が遅れて申し訳ありません。 事実ダブルクォーテーションが入っているとコードを書く時にテーブルが見つかりませんというエラーが出て困ったため、私も自分でテーブルを作成するときはダブルクォーテーションが必要な名称を使わないように気を付けます。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問