DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ODBC接続について

環境/言語:[windowsXP,C#,.net framework2.0]
分類:[.NET]

今、Oracleデータベースを使用していたのをMDB(Odbc接続)に変更をしようとしているのですが、
「パラメータが少なすぎます。1 を指定してください。」
とエラーが出て、なかなか先に進みません。
ソースは↓のようにしています。
--------Oracle--------
OracleConnection connection = new OracleConnection("User ID=xx;Password=xx;Data Source=xx");
connection.Open();
OracleParameter[] parameters = new OracleParameter[1];
parameters[0] = new OracleParameter("DATA_FLAG", "1");
parameters[0].Direction = ParameterDirection.Input;
OracleCommand command = new OracleCommand();
command.Connection = connection;
command.CommandText = "select * from TEST where DATA_FLAG = :DATA_FLAG";
command.CommandType = CommandType.Text;
foreach (IDataParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
OracleDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["0"]);
}
-----------------------------
上記のものを↓のように変更しました。
----------Odbc---------------
OdbcConnection connection = new OdbcConnection(@"Driver={Microsoft Access Driver (*.mdb)};DBQ=xx\test.mdb");
connection.Open();
OdbcParameter[] parameters = new OdbcParameter[1];
parameters[0] = new OdbcParameter("DATA_FLAG", "1");
parameters[0].Direction = ParameterDirection.Input;
OdbcCommand command = new OdbcCommand();
command.Connection = connection;
command.CommandText = "select * from TEST where DATA_FLAG = :DATA_FLAG";
command.CommandType = CommandType.Text;
foreach (IDataParameter parameter in parameters)
{
command.Parameters.Add(parameter);
}
OdbcDataReader reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine(reader["0"]);
}
-------------------------------------
何が原因なのでしょうか?
パラメータ(where条件)を外すと上手くいくので、:DATA_FLAG←この指定の仕方が間違っていると思ってはいるのですが、
どうすればいいのか?分かりません。
誰か分かる方よろしくお願いします。
  • 題名: Re[1]: ODBC接続について
  • 著者: trapemiyia
  • 日時: 2007/11/19 11:26:26
  • ID: 21016
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No21015に返信(亜紀さんの記事)
> 今、Oracleデータベースを使用していたのをMDB(Odbc接続)に変更をしようとしているのですが、
> 「パラメータが少なすぎます。1 を指定してください。」
> とエラーが出て、なかなか先に進みません。
> ソースは↓のようにしています。
> --------Oracle--------
> OracleConnection connection = new OracleConnection("User ID=xx;Password=xx;Data Source=xx");
> connection.Open();
> OracleParameter[] parameters = new OracleParameter[1];
> parameters[0] = new OracleParameter("DATA_FLAG", "1");
> parameters[0].Direction = ParameterDirection.Input;
> OracleCommand command = new OracleCommand();
> command.Connection = connection;
> command.CommandText = "select * from TEST where DATA_FLAG = :DATA_FLAG";
> command.CommandType = CommandType.Text;
> foreach (IDataParameter parameter in parameters)
> {
> command.Parameters.Add(parameter);
> }
> OracleDataReader reader = command.ExecuteReader();
> while (reader.Read())
> {
> Console.WriteLine(reader["0"]);
> }
> -----------------------------
> 上記のものを↓のように変更しました。
> ----------Odbc---------------
> OdbcConnection connection = new OdbcConnection(@"Driver={Microsoft Access Driver (*.mdb)};DBQ=xx\test.mdb");
> connection.Open();
> OdbcParameter[] parameters = new OdbcParameter[1];
> parameters[0] = new OdbcParameter("DATA_FLAG", "1");
> parameters[0].Direction = ParameterDirection.Input;
> OdbcCommand command = new OdbcCommand();
> command.Connection = connection;
> command.CommandText = "select * from TEST where DATA_FLAG = :DATA_FLAG";
> command.CommandType = CommandType.Text;
> foreach (IDataParameter parameter in parameters)
> {
> command.Parameters.Add(parameter);
> }
> OdbcDataReader reader = command.ExecuteReader();
> while (reader.Read())
> {
> Console.WriteLine(reader["0"]);
> }
> -------------------------------------
> 何が原因なのでしょうか?
> パラメータ(where条件)を外すと上手くいくので、:DATA_FLAG←この指定の仕方が間違っていると思ってはいるのですが、
> どうすればいいのか?分かりません。
> 誰か分かる方よろしくお願いします。
>
DATA_FLAG = :DATA_FLAG を DATA_FLAG = ? に変えてみてください。ODBCでは無名
パラメータになります。

#先の発言は書いてる途中でエンターキーに触れてしまいました。すみませぬm(_ _)m ハンドル名も違ってるし・・・orz
trapemiyaさんありがとうございました。
うまくいきました。
もう一つ質問したいのですが、
OdbcParameterの箇所で、
parameters[0] = new OdbcParameter("DATA_FLAG", "1");
としているのですが、
このDATA_FLAGは?の指定だと意味を持たないという事になるのでしょうか?
何を指定しても上手くいくので・・・。
単純にOracleをOdbcにしたので、こういう指定の仕方はしないのですか?
いろいろな箇所からデータベース接続のロジックを見て、見よう見まねでやったので、まだまだ能力が乏しくてすみません。
よろしくお願いします。
> OdbcParameterの箇所で、
> parameters[0] = new OdbcParameter("DATA_FLAG", "1");
> としているのですが、
> このDATA_FLAGは?の指定だと意味を持たないという事になるのでしょうか?

ODBCは名前付きパラメータ(ここではDATA_FLAG)を使用してもエラーにはなりませんが、無名パラメータ(?)として扱われます。
無名パラメータはパラメータが表れる順序だけでどのパラメータかを判断しますので、その順序でパラメータオブジェクトを作成する必要があります。

> 何を指定しても上手くいくので・・・。
> 単純にOracleをOdbcにしたので、こういう指定の仕方はしないのですか?

人間が見てわかりやすいので、名前付きパラメータを使用しても間違いではないと思います。どのようなポリシーでコーディングされるかだと思います。
trapemiyaさん何度もありがとうございます。
という事はODBCは名前で結びつけるという事は不可能という事でしょうか?
他にやり方が存在するという事なのでしょうか?
聞いてばかりですがよろしくお願いします。
(順序で結びつけるというのは少し不便な感じがするので・・・)
> という事はODBCは名前で結びつけるという事は不可能という事でしょうか?
> 他にやり方が存在するという事なのでしょうか?
> 聞いてばかりですがよろしくお願いします。
> (順序で結びつけるというのは少し不便な感じがするので・・・)

不可能です。順序のみで結びつきます。いろいろなところに記述がありますが、例えば以下のページの「OleDb プロバイダと Odbc プロバイダにおけるパラメータの使用」をご覧下さい。

SqlDataSource コントロールにおけるパラメータの使用
http://msdn2.microsoft.com/ja-jp/library/z72eefad(VS.80).aspx
  • 題名: Re[6]: ODBC接続について
  • 著者: 亜紀
  • 日時: 2007/11/20 10:00:58
  • ID: 21027
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
trapemiyaさんいろいろとありがとうございました。
まだまだ分からない事がたくさんありますが今後もよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板