通过C#返回二维数组

时间:2012-07-13 17:11:47

标签: c# javascript matrix odbc multidimensional-array

我从数据库获取内容并通过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 个答案:

答案 0 :(得分:1)

我会使用DataTableDataAdapter

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);
    }
  }

}