[英]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.