C# 未填充Datatable

C# 未填充Datatable,c#,sql-server,C#,Sql Server,试图用SqlDatareader填充datatable(由于解析xml字符串的方式,我认为我不能使用DataAdapter)。仅仅通过在线查看数据表的示例,这应该是可行的,但事实并非如此。当我调试它时,当它通过do while循环运行时,表总是{}。怎么回事 string sqlEntry = ConfigurationManager.ConnectionStrings["sqlPass"].ConnectionString; SqlConnection conn = new SqlConnec

试图用SqlDatareader填充datatable(由于解析xml字符串的方式,我认为我不能使用DataAdapter)。仅仅通过在线查看数据表的示例,这应该是可行的,但事实并非如此。当我调试它时,当它通过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>

手提钻;安克尔!
1234A5A-1;安克尔!
试验;安克尔!
试验;安克尔!
2013/08/05;安克尔!
不安克尔!
2.安克尔!
W、 F;安克尔!
对安克尔!
;安克尔!
不安克尔!
不安克尔!
它坏了;安克尔!

您是否单击望远镜查看实际表格?从快速的一瞥来看,您似乎做的每件事都是正确的,如果调试没有出错,那么您几乎可以肯定能够很好地恢复数据。当然,在添加行之前,表中不会有数据。我知道这听起来很傻,但请确保在至少一次table.Rows.Add(row)

看看这段代码摘录:

conn.Open();

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

第二行强制再次关闭连接。只需交换两行,您就可以了。

确实,这应该很有效。你确定你看桌子的时间对吗?您是否已通过循环并确保它已进入?原始字符串是什么样子(“formXml”)?另外,为什么主循环嵌套在if(myReader.Read())中?还有更多我们没有看到的代码吗?如果没有,您可以将
If
do
替换为
while
。发布一个XML示例,这样做可能比拆分字符串和解析值更干净、更好。您在哪里打开了连接?让我澄清一下:单击望远镜。DataTable将始终在局部变量列表中将{}显示为其值。你必须点击望远镜才能看到表格中的数据……毕竟表格正在填充中,哈哈。好的,谢谢你的帮助,我仍然不知道这是具体的问题;如果连接关闭,他应该会在读取调用中看到错误,但你是对的,应该修复该错误,因此请进行一些升级。。。编辑:noooop,我刚刚查看了这个属性(对我来说是新的),它说:“为打开的SqlConnection更改当前数据库。”所以它打开了到服务器的连接,然后在服务器上切换数据库,所以连接是打开的,并且保持打开状态。不要修理!