我正在编写一个程序来从SQL数据库中提取数据并将其输入到Excel中。我已经完成了所有工作,除了我注意到我在Excel中返回的行与我在SQL中看到的行不匹配。填充DataTable对象时,最后一行会被一致地修剪。
信息: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;
}
****编辑****:谢谢蒂姆帮助我追踪问题..事实证明它不在我的DataTable中,而是在我的Excel Range对象中。从我上次使用这种将数据写入Excel的方法开始,Excel / SQL / C#中索引的工作原理之间必然存在差异。由于Excel在技术上将第1行视为列标题,因此我必须在Excel范围对象的行数中加1,以使其接受正确的总数:
Excel.Range range = wsheet.Range["A2", String.Format("{0}{1}", GetExcelColumnName(columns), rows+1)];
答案 0 :(得分:5)
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
,而不是列。
所以你可以这样做。以这种方式列出所有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];
}
}