我正在尝试使用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;
答案 0 :(得分:2)
答案 1 :(得分:1)
您可以尝试的一件事可能是运行ExecuteReader并遍历结果。
IDataReader reader = m_areaDataAdapter.SelectCommand.ExecuteReader();
while(reader.Read())
{
...
}
这可以帮助您查看问题是在您的命令中,还是在您的DataTable上。
我知道正确添加了参数,我知道给定查询存在数据
当你进行调试时,你应该质疑你的所有假设,包括这个假设。另请注意,使用SSMSE手动执行查询时,您的连接可能配置不同(例如ANSI NULLS,ANSI PADDING),因此会产生不同的结果。
修改强>
回应Nik的评论,这里有一些调试的建议。
运行类似的代码,但修改查询以使其没有任何参数(即开始/结束日期,区域,开始/结束行的硬连线值)。如果这不起作用,那么您的连接似乎可能与SSMSE的配置不同。如果确实有效,那么......
逐个向查询添加参数,直到失败。然后,您将能够识别导致其失败的参数。可能一分钱会下降,你会看到原因(例如参数名称拼写错误?),如果没有,请在此处发布代码。
答案 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中运行查询时,我得到了真正的异常,即我在其中一个字段的查询中输入了错误的字段名称。当我更正了我的查询时,一切都很顺利。