强类型数据集无法填充,表映射问题?c#.net 2.0

3

你之前在我的其他问题中表现得非常出色 - 所以我又来求助了!

我有一个查询涉及三个表和一个强类型数据集,该数据集定义了从查询返回的所有列。当我尝试填充数据适配器时,什么都没有填充。我复制了另一个方法的代码,所以我认为它没问题 - 唯一的区别是这个查询涉及联接。如果有任何帮助,以下是代码:

查询语句:

select gsh.locid, locations.description, GSH.workorder, GSH.comstatus, GSH.teststatus, GSH.fireresult, GSH.lightresult, GSH.watercold, GSH.waterhot, GSH.responsedate, GSH.comments, GSH.testername from gsh_vhs_locations locs left outer join locations on locs.maximoloc = locations.location left outer join gsh_vhs_comms GSH on locs.LOCID = GSH.locid where gsh.insertdate > sysdate-7 order by locid, locations.description, GSH.workorder, GSH.comstatus, GSH.teststatus, GSH.fireresult, GSH.lightresult, GSH.watercold, GSH.waterhot, GSH.responsedate, GSH.comments, GSH.testername

代码:

ResponseSheet Tests = new ResponseSheet();
        DataSet ReturData = new DataSet();
        OracleDataAdapter da;
        try
        {
            using (OracleConnection conn = new OracleConnection(ConnString))
            {
                conn.Open();

                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn;
    cmd.CommandText = @"select gsh.locid, locations.description, GSH.workorder, GSH.comstatus,      GSH.teststatus, GSH.fireresult, GSH.lightresult, GSH.watercold, GSH.waterhot, GSH.responsedate,     GSH.comments, GSH.testername 
from gsh_vhs_locations locs
left outer join locations on locs.maximoloc = locations.location
left outer join gsh_vhs_comms GSH on locs.LOCID = GSH.locid 
where gsh.insertdate > sysdate-7
order by locid, locations.description, GSH.workorder, GSH.comstatus, GSH.teststatus, GSH.fireresult,        GSH.lightresult, GSH.watercold, GSH.waterhot, GSH.responsedate, GSH.comments, GSH.testername ";

                da = new OracleDataAdapter(cmd.CommandText, conn);

da.MissingMappingAction = MissingMappingAction.Error;
da.TableMappings.Add("Table", "ResponseSheet");
                da.Fill(ReturData, "ResponseSheet");

            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(TimeStamp() + ex.Message.ToString() + "Get Capture Report (TraceCode: 00019)");
        }


        return ReturData;
    }

如您所见,我已经打开了表映射的错误报告,但在运行时没有出现任何错误,只有一个空数据集(da = null)。
如果需要,您可以随便向我提供一些谷歌短语,非常感谢您的帮助!
Gareth

1
你已经验证查询确实返回了数据,是吗? - Dave
是的,我在Toad中运行它,并且获取了我所需的结果。不过,你说得很对,这让我去检查一下! - Gareth
1
为了确保一切正常,运行cmd.ExecuteNonQuery并检查返回值以确保正在读取行可能是个好主意。 - Adam Robinson
5个回答

1

尝试处理OnFillError事件。我不确定它是否有帮助,但值得一试。


1

你应该移除 conn.Open() 的调用,让 .Fill() 方法自动打开连接。现在你正在保持连接处于打开状态。我不确定这是否是主要问题,但你可能会得到更好的错误报告。

此外,你可以消除 OracleCommand 对象,因为你并没有真正使用它。适配器将创建一个新的 Command 对象。


好的,我在调试时有些冲动,结果把代码从各个地方复制过来了。现在整理好了 :) 谢谢 - Gareth

1

尝试不使用连接,看看是否得到预期结果 - 选择 locid from gsh_vhs_comms where insertdate > sysdate-7 如果填充方法与该查询一起工作,请尝试添加一个连接并查看是否会破坏它。 如果是,则可能不支持连接。 如果没有,则还有其他问题,并且专注于连接会让您产生误导。


1

你的强类型数据集中的列名是否与查询返回的列名匹配?


0

好的各位

我找到了问题所在。

非常抱歉,但由于某种原因,我的TNSnames没有为新的开发数据库设置好(当天下午才更改,错过了一个字母)

所以它一直被捕获,而我没有注意到。

我感到非常愚蠢,但无论如何,感谢大家的帮助。

Henk已经大大简化了我的代码,Beth让我注意到查询实际上存在问题(连接不正确,但仍然返回数据)。

再次感谢大家,

Gareth

编辑:此外,表映射有误(一夜好眠似乎是解决这个问题的关键!),因此对于将来的参考:

da.MissingMappingAction = MissingMappingAction.Passthrough; da.MissingSchemaAction = MissingSchemaAction.Add;

将所有相关的表映射添加到数据适配器中,现在可以正确填充了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接