SQLDataAdapter 不返回最后一行数据
SQLDataAdapter not returning last row of data
我正在编写一个程序来从 SQL 数据库中提取数据并将其输入到 Excel。我一切正常,除了我注意到我在 Excel 中返回的行与我在 SQL 中看到的不匹配。填充 DataTable object.
时,最后一行始终被修剪
信息:Visual Studio 2015,SQL 服务器 11.0.5058。
我已将问题追查到如何使用以下方法检索 SQL 数据。在通过此方法输出返回的行数后,我进行了检查,结果始终比我应该拥有的少一列(查询是相同的)。我认为这是一个索引问题,但鉴于以下方法的简单性,我看不出如何解决。我不明白为什么最后一行在放入数据时被修剪掉 table。
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;
}
****编辑****:感谢 Tim 帮助我查明问题。结果发现它不在我的 DataTable 中,而是在我的 Excel 范围 object 中。 Excel/SQL/C# 中的索引工作方式与我上次使用这种将数据写入 Excel 的方法肯定有所不同。由于 Excel 在技术上将第 1 行视为列 header,因此我必须将 Excel 范围 object 的行数加 1 以使其接受正确的总数:
Excel.Range range = wsheet.Range["A2", String.Format("{0}{1}", GetExcelColumnName(columns), rows+1)];
an identical query in SQL Studio returns all the requested data. I.E.:
If a table returns 10 rows in SQL, it should return 11 rows to this
method (because column names becomes the first row (row 0)).
为什么你认为列名在第一行?您可以通过 dataTable.Columns
:
获取名称
foreach(DataColumn col in dataTable.Columns)
{
Console.WriteLine("Column:{0} Type:{1}", col.ColumnName, col.DataType);
}
wouldn't the DataTable
object return a total number of rows that
includes the column names in datatable.rows.count
不,dataTable.Rows
only returns the DataRow
s 包含记录,而不是列。
所以你可以 f.e。以这种方式列出所有 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]);
}
}
Could the above foreach block be used to populate a two dimensional
array? I'm using the below to dump all of the data into 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];
}
}
我正在编写一个程序来从 SQL 数据库中提取数据并将其输入到 Excel。我一切正常,除了我注意到我在 Excel 中返回的行与我在 SQL 中看到的不匹配。填充 DataTable object.
时,最后一行始终被修剪信息:Visual Studio 2015,SQL 服务器 11.0.5058。
我已将问题追查到如何使用以下方法检索 SQL 数据。在通过此方法输出返回的行数后,我进行了检查,结果始终比我应该拥有的少一列(查询是相同的)。我认为这是一个索引问题,但鉴于以下方法的简单性,我看不出如何解决。我不明白为什么最后一行在放入数据时被修剪掉 table。
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;
}
****编辑****:感谢 Tim 帮助我查明问题。结果发现它不在我的 DataTable 中,而是在我的 Excel 范围 object 中。 Excel/SQL/C# 中的索引工作方式与我上次使用这种将数据写入 Excel 的方法肯定有所不同。由于 Excel 在技术上将第 1 行视为列 header,因此我必须将 Excel 范围 object 的行数加 1 以使其接受正确的总数:
Excel.Range range = wsheet.Range["A2", String.Format("{0}{1}", GetExcelColumnName(columns), rows+1)];
an identical query in SQL Studio returns all the requested data. I.E.: If a table returns 10 rows in SQL, it should return 11 rows to this method (because column names becomes the first row (row 0)).
为什么你认为列名在第一行?您可以通过 dataTable.Columns
:
foreach(DataColumn col in dataTable.Columns)
{
Console.WriteLine("Column:{0} Type:{1}", col.ColumnName, col.DataType);
}
wouldn't the
DataTable
object return a total number of rows that includes the column names in datatable.rows.count
不,dataTable.Rows
only returns the DataRow
s 包含记录,而不是列。
所以你可以 f.e。以这种方式列出所有 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]);
}
}
Could the above foreach block be used to populate a two dimensional array? I'm using the below to dump all of the data into 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];
}
}