Datatable没有被填充。

3

尝试使用SqlDatareader填充datatable(由于我解析xml字符串的方式,我认为无法使用DataAdapter)。仅通过查看在线datatables示例,应该可以工作,但事实并非如此。当我调试它时,当它通过do while循环运行时,表始终为{}。怎么回事?

string sqlEntry = ConfigurationManager.ConnectionStrings["sqlPass"].ConnectionString;
SqlConnection conn = new SqlConnection(sqlEntry);

try
{
    conn.Open();
    conn.ChangeDatabase(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);

    string sqlQuery = "SELECT * from equipInspection";
    SqlCommand sqlComm = new SqlCommand(sqlQuery, conn);

    SqlDataReader myReader;
    myReader = sqlComm.ExecuteReader();

    DataTable table = new DataTable();

    table.Columns.Add("Equipment", typeof(String));
    table.Columns.Add("SerialNo",typeof(String));
    table.Columns.Add("Contractor",typeof(String));
    table.Columns.Add("Date", typeof(String));
    table.Columns.Add("Deficiencies", typeof(String));

    if (myReader.Read())
    {
        do
        {
            string stringtosplit = myReader["formXML"].ToString();
            string[] xmlInfo = stringtosplit.Split(new string[] { ";ANKR!" }, StringSplitOptions.None);

            DataRow row = table.NewRow();
            row["Equipment"] = xmlInfo[0];
            row["SerialNo"] = xmlInfo[1];
            row["Contractor"] = myReader["Name"].ToString();
            row["Date"] = myReader["Date"].ToString();
            row["Deficiencies"] = xmlInfo[12];
            table.Rows.Add(row);
        } while (myReader.Read());

这是一个XML格式的样例,可能涉及它的结构或我的解析方式。
    <!--Equipment inspection form by Test-->
<EquipmentInspection Date="2013/08/07" Time="12:05 AM" Location="Somewhere" ContractorName="Joe" Operator="Jane" Position="Boss" Contact="2132213421">
  <Field ID="txtEquipment" Type="Textbox">Jackhammer;ANKR!</Field>
  <Field ID="txtSerial" Type="Textbox">1234A5A-1;ANKR!</Field>
  <Field ID="txtManufacturer" Type="Textbox">Test;ANKR!</Field>
  <Field ID="txtUsage" Type="Textbox">Test;ANKR!</Field>
  <Field ID="txtService" Type="Textbox">2013/08/05;ANKR!</Field>
  <Field ID="rblRecentInspect" Type="RadioButtonList">No;ANKR!</Field>
  <cblShift>2, ;ANKR!</cblShift>
  <cblDaysInspected>W, F, ;ANKR!</cblDaysInspected>
  <Field ID="rblDamage" Type="RadioButtonList">Yes;ANKR!</Field>
  <Field ID="txtDamage" Type="Textbox">;ANKR!</Field>
  <Field ID="txtRepairs" Type="RadioButtonList">No;ANKR!</Field>
  <Field ID="rblDef" Type="RadioButtonList">No;ANKR!</Field>
  <Field ID="txtDef" Type="Textbox">it broke;ANKR!</Field>
</EquipmentInspection>

2
确实应该可以工作。你确定你在正确的时间查看表格吗?你是否已经逐步执行循环并确保它进入了循环体? - lc.
原始字符串是什么样子("formXml")..? - granadaCoder
此外,为什么你把主循环嵌套在if(myReader.Read())中?代码里还有其他东西吗?如果没有,你可以用while替换ifdo - voithos
发布XML的示例,您可能可以比拆分字符串并解析值更清晰地完成此操作。 - Icarus
1
你在哪里打开连接的? - O.O
显示剩余5条评论
2个回答

3
你是否点击放大镜来查看实际的表格?快速浏览后,你似乎做得不错,如果调试没有出错,那么几乎可以确定已经成功获取数据。当然,在添加行之前表格是不会有数据的。我知道这听起来很傻,但请确保在至少进行一次table.Rows.Add(row);迭代后再单击放大镜...

让我清楚一点:点击放大镜。DataTable 总是在局部列表中显示 {} 作为其值。你必须点击放大镜才能查看表格中的数据... - Mike D.
表格已经被填充好了,哈哈。好的,谢谢你的帮助。 - ryan l

0

看一下你代码中的这个摘录:

conn.Open();

conn.ChangeDatabase(ConfigurationManager.ConnectionStrings["DB"].ConnectionString);

第二行代码强制关闭了连接。只需交换这两行代码的位置,问题就可以解决了。

我仍然不知道具体问题是什么;如果连接关闭,他应该在读取调用时看到一个错误,但你说得对,那个问题应该被解决,所以有一些赞...编辑:不不不,我刚刚看了一下那个属性(对我来说是新的),它说:“更改打开的 SqlConnection 的当前数据库。”因此它打开了与服务器的连接,然后在服务器上切换数据库,所以连接是打开的并保持打开状态。不要修复! - Mike D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接