簡體   English   中英

通過C#返回二維數組

[英]Returning 2-dimensional array via C#

我從數據庫中獲取內容,並通過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,

如您所見,第二個分隔符實際上根本沒有出現。 同樣,此查詢在heidisql中運行時,返回的行數很多,而不僅僅是這一結果。 一旦將其傳遞給Javascript,我就可以弄清楚了,因為我對此有更多的經驗,並且實際上我是通過PHP來完成的。

我將使用一個DataTable和一個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);
}

這行:

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

將要刪除管道定界符的最后一個實例,因此,如果只有一個記錄(似乎有一個記錄),則不應看到該記錄。

除非我錯過了什么...

編輯

實際上,如果您要查找兩條記錄,則可能會丟失第二條記錄,因為您使用while(reader.Read())開始循環, while(reader.Read())結束reader.NextResult(); 這些都會使閱讀器前進,從而使您錯過所有其他記錄。

編輯2

您還將在每次迭代中覆蓋finalstring 您可能想要附加到此(如果您不希望有多少條記錄,將其構建為StringBuilder可能最有效率)。

您將在循環的每次迭代中替換finalstring的值。 這將導致僅返回單個行的值:

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

以及在每次迭代結束時通過行中的列刪除最后一個字符(管道,而不是我期望的尾隨逗號):

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

編輯:

看起來您通過遍歷reader.Read()以及調用reader.NextResult()都跳過了所有其他記錄。

您與讀者循環結構顯得有一些問題,而不是其中最重要的是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);
    }
  }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM