- PR -

テーブルのデータを取得する

投稿者投稿内容
yyy
会議室デビュー日: 2008/11/21
投稿数: 12
投稿日時: 2008-11-26 14:54
もともと、
NpgsqlCommand command = CreateNewCommand(sql.ToString())
で、コネクションとコマンドを結んで発行していたのですが、
別クラスで、このコードを利用したいので、
コードの一番上のusingに、
using AAANetCommon.DB.Npgsql;
using Npgsql;
using NpgsqlTypes;
と、関係ありそうなコードを書いたものの、
CreateNewCommand
が使えません。

定義には、

/// <summary>
/// 新しいNpgsqlCommandを作成し返します。
/// </summary>
/// <param name="sql">SQL</param>
/// <returns>NpgsqlCommand</returns>
protected NpgsqlCommand CreateNewCommand(string sql) {
NpgsqlCommand command = CreateNewCommand();
command.CommandText = sql;
return command;
}

と書いてあるのですが、
ここからなにかコネクションにつながるものはあるのでしょうか?


本当に不躾な身で申し訳ございませんが、よろしくお願いいたします。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-11-26 15:03
引用:
NpgsqlCommand command = CreateNewCommand();

とあるので
引数が1つも無い
CreateNewCommand() メソッド
がどこかに定義してありませんか?
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2008-11-26 15:07
引用:

yyyさんの書き込み (2008-11-26 14:54) より:
もともと、
NpgsqlCommand command = CreateNewCommand(sql.ToString())
で、コネクションとコマンドを結んで発行していたのですが、
別クラスで、このコードを利用したいので、
コードの一番上のusingに、
using AAANetCommon.DB.Npgsql;
using Npgsql;
using NpgsqlTypes;
と、関係ありそうなコードを書いたものの、
CreateNewCommand
が使えません。

定義には、

/// <summary>
/// 新しいNpgsqlCommandを作成し返します。
/// </summary>
/// <param name="sql">SQL</param>
/// <returns>NpgsqlCommand</returns>
protected NpgsqlCommand CreateNewCommand(string sql) {
NpgsqlCommand command = CreateNewCommand();
command.CommandText = sql;
return command;
}

と書いてあるのですが、
ここからなにかコネクションにつながるものはあるのでしょうか?


本当に不躾な身で申し訳ございませんが、よろしくお願いいたします。



提示されたコードの範囲ではNpgsqlConnectionにつながる記述は確認できません。
もしかしたら、
コード:
NpgsqlCommand command = CreateNewCommand();


のCreateNewCommandメソッドの中で行っているのかもしれませんが。

ところで、「使えません」とはどういった状況でしょうか。
コンパイルエラーが発生しているのならば、そのエラー内容を提示していただければ、もう少し詳しく分かるかもしれません。
_________________
まさるblog
yyy
会議室デビュー日: 2008/11/21
投稿数: 12
投稿日時: 2008-11-26 15:13
みなさん、ご返答ありがとうございます。
CreateNewCommand() の定義は、


/// <summary>
/// Npgsqlを基にしたテーブル単位のデータ管理。
/// </summary>
public abstract class NpgsqlDataAccessor : DataAccessor {
/// <summary>
/// コンストラクタ。
/// </summary>
/// <param name="connectionManager">データベース接続管理</param>
protected NpgsqlDataAccessor(NpgsqlConnectionManager connectionManager) : base(connectionManager) {
}

/// <summary>
/// 新しいNpgsqlCommandを作成し返します。
/// </summary>
/// <returns>NpgsqlCommand</returns>
protected NpgsqlCommand CreateNewCommand() {
NpgsqlCommand command = new NpgsqlCommand();
NpgsqlConnectionManager connectionManager = (NpgsqlConnectionManager) base.connectionManager;
command.Connection = connectionManager.Connection;
if (connectionManager.Transaction != null) {
command.Transaction = connectionManager.Transaction;
}
return command;
}

です。

エラーには、

名前 'CreateNewCommand' は現在のコンテキスト内に存在しません。

と書かれています。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-11-26 15:19
CreateNewCommand() に書いてある通り
さきほど
command.Connection = connectionManager;
としてエラーになったところを
command.Connection = connectionManager.Connection;
にすれば動くんじゃないでしょうか。

でもその CreateNewCommand() では
トランザクションも設定しているようですが。

[ メッセージ編集済み 編集者: King 編集日時 2008-11-26 15:20 ]
yyy
会議室デビュー日: 2008/11/21
投稿数: 12
投稿日時: 2008-11-26 15:25
Kingさんのご教授通り、

NpgsqlCommand command = connectionManager.Connection;
と書いたところ、

型 'Npgsql.NpgsqlConnection' を型 'Npgsql.NpgsqlCommand' に暗黙的に変換できません。

と言われました。

なかむら
ベテラン
会議室デビュー日: 2008/11/11
投稿数: 67
お住まい・勤務地: 福岡
投稿日時: 2008-11-26 15:28
コード:
NpgsqlCommand command = connectionManager.Connection;


ではなく
コード:
NpgsqlCommand command = new NpgsqlCommand();
command.Connection = connectionManager.Connection;


では?

_________________
Nakamura Blog
まさる
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 59
お住まい・勤務地: 越後の中ほど
投稿日時: 2008-11-26 15:32
まず、Kingさんが指摘した通りのコードになってないので、もう一度確認してください。

その上で、今回のコードはNpgsqlDataAccessorクラスの派生クラスに書くべきではないかと推測されます(あくまで"推測"です)が、そのあたりはいかがですか?

こう考えた理由は、CreateNewCommandメソッドがNpgsqlDataAccessorクラスに定義してあるため、その派生クラスからでないと呼び出せないからです。

以上を踏まえ、クラス設計も含めて今一度確認してみてください。
_________________
まさるblog

スキルアップ/キャリアアップ(JOB@IT)