ds.Tables [“ TableName”]引发了异常“ System.Data.DataTableCollection.this [string] .get返回null”。

时间:2019-09-11 08:34:04

标签: winforms dataset

我正在将DataGridView导出到CSV文件,但遇到此问题: 当我尝试使用表名(ds.Tables [“ tableName”])时,它抛出了异常"System.NullReferenceException: 'Object reference not set to an instance of an object.' System.Data.DataTableCollection.this[string].get returned null. " 但是它正在使用表的索引:ds.Tables [0]。 就我而言,我只有表格的名称。

我已经尝试使用ds.Tables [“ dbo.tableName”]和ds.Tables [(row.Cells [“ table_name”]。Value.ToString())]

这是我的代码:

        {
            using (SqlConnection sqlConnection = new SqlConnection(connectionString))
            {
                foreach (DataGridViewRow row in TableNamesGrid.Rows)
                {
                    bool isSelected = Convert.ToBoolean(row.Cells["CheckBox"].Value);
                    if (isSelected)
                    {
                        StringBuilder stringBuilder = new StringBuilder();
                        SqlDataAdapter sqlData = new SqlDataAdapter("SELECT * FROM " + row.Cells[1].Value, sqlConnection);
                        DataSet ds = new DataSet();
                        sqlData.Fill(ds);
                        foreach (DataRow dataRow in ds.Tables[(row.Cells["table_name"].Value.ToString())].Rows)
                        {
                            for (int i = 0; i <= ds.Tables[(row.Cells["table_name"].Value.ToString())].Rows.Count; i++)
                            {
                                stringBuilder.Append(dataRow[i].ToString() + ",");
                            }
                            stringBuilder.Append("\r\n");
                        }
                        StreamWriter file = new StreamWriter(@"D:\Projects\AlatiWF\data.csv");
                        file.WriteLine(stringBuilder.ToString());
                        file.Close();
                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

SqlDataAdapter不够灵巧,无法确定您的查询仅访问单个表,因此它将始终返回这样的表:“ Table0”,“ Table1”,“ Table2”等。

Table [0]之所以起作用,是因为它正在访问名为“ Table0”的表。您可以在调用sqlData.Fill(ds)之后为表指定合理的名称,例如:

ds.Tables[0].TableName = "SensibleTableName";

答案 1 :(得分:0)

直接填充数据表,而无需数据集。

DataTable dt = new DataTable();
sqlData.Fill(dt);
foreach (DataRow dataRow in dt.Rows)
                    {