1

postgresql db とそれにアクセスするための C# アプリケーションがあります。NpgsqlDataAdapter.Fill コマンドから DataSet に返す値で奇妙なエラーが発生しています。

私はこのコードを持っています:

NpgsqlCommand n = new NpgsqlCommand();
n.Connection = connector; // a class member NpgsqlConnection

DataSet ds = new DataSet();
DataTable dt = new DataTable();

// DBTablesRef are just constants declared for
// the db table names and columns

ArrayList cols = new ArrayList();
cols.Add(DBTablesRef.all); //all is just *

ArrayList idCol = new ArrayList();
idCol.Add(DBTablesRef.revIssID);

ArrayList idVal = new ArrayList();
idVal.Add(idNum); // a function parameter

// Select builder and Where builder are just small
// functions that return an sql statement based
// on the parameters.  n is passed to the where
// builder because the builder uses named  
// parameters and sets them in the NpgsqlCommand
// passed in
String select = SelectBuilder(DBTablesRef.revTableName, cols) +
WhereBuilder(n,idCol, idVal);

n.CommandText = select;

try
{
    NpgsqlDataAdapter da = new NpgsqlDataAdapter(n);

    ds.Reset();

    // filling DataSet with result from  NpgsqlDataAdapter
    da.Fill(ds);

    // C# DataSet takes multiple tables, but only the first is used here
    dt = ds.Tables[0];
}
catch (Exception e)
{
    Console.WriteLine(e.ToString());
}

したがって、私の問題は次のとおりです。上記のコードは、私が望んでいるように完全に機能します。ただし、すべての選択 (*) を実行する代わりに、クエリから返される個々の列に名前を付けようとすると、要求した情報が取得されますが、データ テーブル内の個別のエントリに分割されるのではなく、文字列が取得されます次のようなデータ テーブルの最初のインデックスで:

"(0,5,false,ボブ・スミス,7)"

そして、データは正しいです。0、5、ブール値、テキストなどが期待されますが、(明らかに) 1 つの大きな文字列として返されないことをお勧めします。

* を選択すると期待どおりにデータテーブルが得られるのに、特定の列を選択すると、求めている値の文字列である 1 つのエントリを含むデータテーブルが得られる理由は誰でも知っていますか?

4

1 に答える 1

1

わかりました、それは SelectBuilder 関数にありました。選択ステートメントに複数の列がリストされている場合、列を () で囲んでいたため、明らかにこれにより、postgreSQL または Npgsql のいずれかが文字列形式でリストを返す必要があると解釈します。

于 2010-03-23T20:09:06.220 に答える