0

データベースからコンテンツを取得し、Javascript を介して Ajax 処理のためにそれを返しています。かなり単純なもの。ここでの問題は、データをループする良い方法が見つからないように見えることと、MSDN のドキュメントの odbcreader メソッドがひどく貧弱であることです。

using (OdbcCommand com = new OdbcCommand("SELECT * FROM pie_data WHERE Pie_ID = ?",
 con)) {
  if (Request.Form["reference_id"] == "") {
    returnError();
  } else {
    com.Parameters.AddWithValue("", Request.Form["reference_id"]);
    com.ExecuteNonQuery();
    using (OdbcDataReader reader = com.ExecuteReader()) {
      string finalstring = "";
      while (reader.Read()) {
        if(reader.HasRows) {
          finalstring = reader.GetString(9) + ",";
          for (int i = 0; i <= 8; i = i + 1) {
            finalstring = finalstring + reader.GetValue(i).ToString() + ",";
          }
          finalstring = finalstring + "|";
          reader.NextResult();
        }
      }
      if (finalstring != "") {
        finalstring = finalstring.Remove(finalstring.Length -1, 1);
        Response.Write(finalstring);
      }
    }
    noredirect = 1;
  }
}

ただし、出力例は次のとおりです。

00001,0,Pie Johnson,piesaregreat@yum.com,,,10/7/2010 12:00:00 AM,Bakery,N/A,N/A,

ご覧のとおり、2 番目のデリミネータは、実際には表示されるべきなのに、まったく表示されていません。また、このクエリを heidisql で実行すると、この 1 つの結果だけでなく、かなりの数の行が返されます。Javascriptに渡すと、それを理解することができます。これは、以前にPHPを介して実際に行ったことがあるためです。

4

4 に答える 4

1

私は aDataTableと aを使用しますDataAdapter

String finalString;
var tblPieData = new DataTable();
using(var con = new OdbcConnection(connectionString))
using (OdbcDataAdapter da = new OdbcDataAdapter("SELECT * FROM pie_data WHERE Pie_ID = ?", con))
{
    da.SelectCommand.Parameters.AddWithValue("Pie_ID", reference_id);
    da.Fill(tblPieData);
    var rowFields = tblPieData.AsEnumerable()
                              .Select(r => string.Join(",", r.ItemArray));
    finalString = string.Join("|", rowFields);
}
于 2012-07-13T17:29:44.220 に答える
0

リーダーを使用したループ構造にはいくつかの問題があるように見えますが、ループ内で finalAnswer がリセットされ、.Read() と .NextResultの両方を使用して組み合わせた単一の結果しか得られないという問題は特にありません。

推奨される修正...テストされていないため、すべての標準的な警告が適用されます:):

Mark Averius のコメントと元の意図の OP 確認に従って編集:

using (OdbcDataReader reader = com.ExecuteReader()) {
  if (reader.HasRows())
  {
    string finalstring = "";
    while (reader.Read()) {
      finalstring = finalstring + reader.GetString(9) + ",";
      for (int i = 0; i <= 8; i++) {
        finalstring = finalstring + reader.GetValue(i).ToString() + ",";
      }
      finalstring = finalstring + "|";
    }
    if (finalstring != "") {
      finalstring = finalstring.Remove(finalstring.Length -1, 1);
      Response.Write(finalstring);
    }
  }

}

于 2012-07-13T17:29:45.527 に答える
0

この行:

finalstring = finalstring.Remove(finalstring.Length -1, 1);

パイプ区切り文字の最後のインスタンスを削除するため、レコードが 1 つしかない場合 (あるように見えます)、レコードは表示されません。

私が何かを見逃していない限り...

編集

実際、2 つのレコードを探している場合、ループを で開始してwhile(reader.Read())で終了しているため、おそらく 2 番目のレコードが失われていreader.NextResult();ます。これらは両方ともリーダーを進め、他のすべてのレコードを見逃す原因となります。

編集2

finalstringまた、反復ごとに上書きしています。おそらく、これに追加したいと思うでしょう (StringBuilder予想されるレコードの数がわからない場合は、効率のために、これを にするのが最も理にかなっています)。

于 2012-07-13T17:18:18.227 に答える
0

ループの繰り返しごとに finalstring の値を置き換えています。これにより、単一行の値のみが返されます。

finalstring = reader.GetString(9) + ",";

行の列を介して各反復の最後に最後の文字を削除するだけでなく(私が期待しているように、末尾のコンマではなくパイプです):

finalstring = finalstring.Remove(finalstring.Length -1, 1);

編集:

また、reader.Read() をループするだけでなく、reader.NextResult() を呼び出すことによって、他のすべてのレコードをスキップしているようにも見えます。

于 2012-07-13T17:21:07.587 に答える