SQLDataAdapter没有返回最后一行数据

本文关键字:一行 数据 返回 最后 SQLDataAdapter | 更新日期: 2023-09-27 18:07:08

我正在编写一个程序,从SQL数据库中提取数据并将其输入Excel。我有它所有的工作,除了我注意到我在Excel中返回的行不匹配我在SQL中看到的。当填充DataTable对象时,最后一行始终被修剪。

Info: Visual Studio 2015, SQL Server 11.0.5058.

我已经找到了这个问题,我是如何在下面的方法中检索SQL数据。在执行此方法后,我进行了一次检查,以输出返回了多少行,结果始终比我应该拥有的少一行(查询是相同的)。我认为这是一个索引问题,但我看不出如何,考虑到下面方法的简单性。我不明白为什么最后一行在放入数据表时被修剪掉了。

private static DataTable PullData(string connstr, string query)
    {
        // Creating connection to SQL server
        SqlConnection conn = new SqlConnection(connstr);
        SqlCommand cmd = new SqlCommand(query, conn);
        conn.Open();
        DataTable dataTable = new DataTable();
        // create data adapter
        using (SqlDataAdapter da = new SqlDataAdapter(query, conn))
        {
            da.SelectCommand.CommandTimeout = 3600;
            // query database and return the result to your datatable
            da.Fill(dataTable);
            da.Dispose();
        }
        conn.Close();
        return dataTable;
    }

****EDIT****:谢谢Tim帮我找到这个问题。事实证明,它不是在我的数据表,但在我的Excel范围对象。在Excel/SQL/c#中,索引的工作方式与我上次使用这种方法将数据写入Excel的方式一定有所不同。由于从技术上讲,Excel将第1行视为列标题,因此我必须将Excel Range对象的行数添加1,以便它接受正确的总数:

Excel.Range range = wsheet.Range["A2", String.Format("{0}{1}", GetExcelColumnName(columns), rows+1)];

SQLDataAdapter没有返回最后一行数据

SQL Studio中的相同查询返回所有请求的数据。例如:如果一个表在SQL中返回10行,那么它应该返回11行方法(因为列名成为第一行(第0行))。

为什么你认为列名在第一行?您可以通过dataTable.Columns:

获得名称
foreach(DataColumn col in dataTable.Columns)
{
    Console.WriteLine("Column:{0} Type:{1}", col.ColumnName, col.DataType);
}

不会返回DataTable对象的总行数包括datatable.rows.count

中的列名。

不,dataTable.Rows只返回包含记录的DataRow s,不返回列。

所以你可以用这种方式列出所有DataRows的所有字段:

for(int i = 0; i < dataTable.Rows.Count; i++)
{
    DataRow row = dataTable.Rows[i];
    foreach (DataColumn col in dataTable.Columns)
    {
        Console.WriteLine("Row#:{0} Column:{1} Type:{2} Value:{3}",
            i + 1,
            col.ColumnName, 
            col.DataType,
            row[col]);
    }
}

上面的foreach块可以用来填充二维数组?我使用以下代码将所有数据转储到Excel中:object[,] data = new object[dt.rows.count, dt.columns.count];

是的,这是可能的。相应地修改循环:

object[,] data = new object[dataTable.Rows.Count, dataTable.Columns.Count];
for (int rowIndex = 0; rowIndex < dataTable.Rows.Count; rowIndex++)
{
    for (int colIndex = 0; colIndex < dataTable.Columns.Count; colIndex++)
    {
        data[rowIndex, colIndex] = dataTable.Rows[rowIndex][colIndex];
    }
}