C# 从 DataSet 中获取数据

C# retrieving data from DataSet

我从一个简单的 DataTable 开始,我在其中写入了一个 XML 文件。下次程序运行时,我想检查一下 XML 文件是否存在,然后读取它。

看起来写 xml 没问题,而且我相信读它也没问题,但是我从中读取后似乎无法获取 DataSet 中的任何数据..

ds.WriteXml(@"C:\Computers\config.xml");
if (File.Exists(@"C:\Computers\config.xml"))
{
    ds.ReadXml(@"C:\Computers\config.xml");
    //comboBox.Items.Add(ds.Tables[0].Rows[0][0].ToString()); doesn't work
    comboBox.Items.Add(ds.Tables[0].Rows.Count);  //this counts 3 rows
}

我收到这个错误。

An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll

Additional information: Cannot find column 1.

看看我的 XML 文件

 <?xml version="1.0" standalone="yes"?>
<NewDataSet>
    <Table1>
        <Name>Test1</Name>
        <Version>1.1.1.1</Version>
        <Code />
        <Location>C:\Computers\test.txt</Location>
    </Table1>
    <Table1>
        <Name>test2</Name>
        <Version />
        <Code />
        <Location />
    </Table1>
    <Table1>
        <Name>test3</Name>
        <Version />
        <Code />
        <Location />
    </Table1>
</NewDataSet>        
      

我只是想从每一行中获取“名称”字段,我做错了什么?

我把你的XML放到C:\computer 和运行代码

DataSet ds =new DataSet();

if (File.Exists(@"C:\Computers\config.xml"))
{
            ds.ReadXml(@"C:\Computers\config.xml");

            //comboBox.Items.Add(ds.Tables[0].Rows[0][0].ToString()); doesn't work
            comboBox.Items.Add(ds.Tables[0].Rows.Count);  //this counts 3 rows
}

comboBox.Items.Add(ds.Tables[0].Rows[0][0].ToString() 是 Tesy1 ds.Tables[0].Rows.Count 是 3

所以,我认为问题不在这里。

问题出在你写

的时候
ds.WriteXml(@"C:\Computers\config.xml");

在第一行它会写一个新文件,因此当你读取时里面没有数据。所以现在你应该删除第一行然后检查它应该 运行 没问题

if (File.Exists(@"C:\Computers\config.xml"))
{
    ds.ReadXml(@"C:\Computers\config.xml");
    comboBox.Items.Add(ds.Tables[0].Rows[0][0].ToString()); //doesn't work
    comboBox.Items.Add(ds.Tables[0].Rows.Count);  //this counts 3 rows
}

是否可能是 DataTable 的结构不正确?

            public DataTable predefinedPatch = new DataTable();

            predefinedPatch.Columns.Add("Name");
            predefinedPatch.Columns.Add("Version");
            predefinedPatch.Columns.Add("Code");
            predefinedPatch.Columns.Add("Location");
            //
            predefinedPatch.Rows.Add("test1", "", "", "");
            predefinedPatch.Rows.Add("test2", "", "", "");
            predefinedPatch.Rows.Add("test3", "", "", "");