SqlDataAdapter.Fill(DataTable)返回No Rows

时间:2011-02-07 18:23:14

标签: c# asp.net sql-server ado.net

我正在尝试使用SqlDataAdapter来填充DataTable,我将其用作DataGrid的数据源。查询很好,至少当我在SSMSE中手动运行它时。当我执行填充操作时,表获取正确的列,但没有行。最令人沮丧的部分是代码在不同的页面上是相同的(具有不同的查询)。我无法发布查询,但我的初始化代码如下所示:

SqlCommand areaDAC = new SqlCommand (areaQuery, connection);
areaDAC.Parameters.Add (new SqlParameter ("@param", System.Data.SqlDbType.NVarChar, 50));
m_areaDataAdapter = new SqlDataAdapter (areaDAC);

然后使用它:

m_areaDataAdapter.SelectCommand.Parameters["@param"].Value = "Filter Val";
DataTable table = new DataTable ();
m_areaDataAdapter.Fill (table);

此时,表具有正确的列数且没有行。我知道正确添加了参数,我知道给定查询存在数据。

更新(由评论中的Nik提供):

SELECT * FROM 
   (SELECT 
       ROW_NUMBER() OVER(ORDER BY DateAndTime DESC) AS rowNum, 
       areaName, stationName, lineName, DateAndTime, 
       Element, Description 
    FROM 
       sdrReportArea, sdrReportStation, sdrReportTLine, 
       SDRSequenceEvents, SDRSequenceStates 
    WHERE 
       sdrReportArea.areaID = sdrReportStation.stationID 
       AND sdrReportStation.stationID = sdrReportTLine.stationID 
       AND sdrReportTLine.lineID = SDRSequenceEvents.LineID 
       AND SDRSequenceEvents.StateID = SDRSequenceStates.StateID 
       AND DateAndTime >= @startDate AND DateAndTime <= @endDate 
       AND areaName = @area) AS TempTbl 
WHERE 
    rowNum BETWEEN @startRow AND @endRow;

6 个答案:

答案 0 :(得分:2)

  1. 尝试删除where子句中的日期类型参数并再次测试。
  2. 我遇到了类似数据集的问题,其中“Over”不起作用(IMO),所以我想它在这里也行不通。如果可能,请使用SP。

答案 1 :(得分:1)

您可以尝试的一件事可能是运行ExecuteReader并遍历结果。

IDataReader reader = m_areaDataAdapter.SelectCommand.ExecuteReader();
while(reader.Read())
{
    ...
}

这可以帮助您查看问题是在您的命令中,还是在您的DataTable上。

  

我知道正确添加了参数,我知道给定查询存在数据

当你进行调试时,你应该质疑你的所有假设,包括这个假设。另请注意,使用SSMSE手动执行查询时,您的连接可能配置不同(例如ANSI NULLS,ANSI PADDING),因此会产生不同的结果。

修改

回应Nik的评论,这里有一些调试的建议。

  1. 运行类似的代码,但修改查询以使其没有任何参数(即开始/结束日期,区域,开始/结束行的硬连线值)。如果这不起作用,那么您的连接似乎可能与SSMSE的配置不同。如果确实有效,那么......

  2. 逐个向查询添加参数,直到失败。然后,您将能够识别导致其失败的参数。可能一分钱会下降,你会看到原因(例如参数名称拼写错误?),如果没有,请在此处发布代码。

答案 2 :(得分:1)

我在OracleDataAdapter遇到了类似的问题。我试图做一个简单的

select * from table

它没有用。我最终设置了

DbCommand.CommandTimeout

属性,它开始工作。不过,我仍然感到困惑,因为我以前从未设置过这些属性。

答案 3 :(得分:0)

您是否通过执行ADO.NET调用的Web服务访问查询?如果服务器的时区不同,则@StartDate和@EndDate的值可能与您的预期不符。

答案 4 :(得分:0)

您在多个WHERE条款的加入之间可能存在问题。您必须根据数据库表和数据找出无论哪个表加入特定ID都是正确的。

答案 5 :(得分:0)

我有一个类似的问题,虽然我不知道它是否解决了OP的问题,但可以帮助某人:

我有一个问题,我没有返回任何行和Cannot find table 0异常,使用类似的代码来使用适配器填充数据集(它自动在数据集中创建一个表)。

相关的代码片段(为简单起见,未显示OracleCommand,连接打开):

DataSet ds = new DataSet();
OracleDataAdapter oraAdp = new OracleDataAdapter();

oraAdp.Fill(ds);
return ds.Tables[0];

我知道我通过OracleCommand发送的查询应该完成填充并获得结果 - 或者我认为。当我在Oracle SQL Developer中运行查询时,我得到了真正的异常,即我在其中一个字段的查询中输入了错误的字段名称。当我更正了我的查询时,一切都很顺利。