我从数据库获取内容并通过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实际做过这个。
答案 0 :(得分:1)
我会使用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);
}
答案 1 :(得分:0)
这一行:
finalstring = finalstring.Remove(finalstring.Length -1, 1);
将删除管道分隔符的最后一个实例,因此如果只有一条记录(看起来像是),则不应该看到一条。
除非我遗漏了某些东西......
修改强>
实际上,如果您要查找两条记录,则可能会错过第二条记录,因为您使用while(reader.Read())
开始循环并以reader.NextResult();
结束。这些都会使读者前进,导致你错过其他所有记录。
编辑2
您还在每次迭代时覆盖finalstring
;你可能想要附加到这个(如果你不知道预期有多少记录,那么为了效率而使StringBuilder
最有意义。)
答案 2 :(得分:0)
您正在循环的每次迭代中替换finalstring的值。这将仅返回单个行的值:
finalstring = reader.GetString(9) + ",";
以及通过行中的列(管道,而不是我期望你想要的尾随逗号)删除每次迭代结束时的最后一个字符:
finalstring = finalstring.Remove(finalstring.Length -1, 1);
编辑:
看起来你跳过reader.Read()以及调用reader.NextResult()
看起来你正在跳过其他所有记录。答案 3 :(得分: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);
}
}
}