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,

如您所见,第二个分隔符根本没有出现,而它确实应该出现。此外,当在 heidisql 中运行时,此查询返回大量行,而不仅仅是这一结果。一旦我将它传递给 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

这一行:

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

将删除您的管道分隔符的最后一个实例,因此如果只有一条记录(似乎有),您不应该看到一条。

除非我错过了什么……

编辑

实际上,如果您要查找两条记录,您可能会丢失第二条记录,因为您的循环while(reader.Read())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 回答
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 回答