强类型dataset中使用存储过程的问题!!!急急急!!

jack_nichao 2013-03-03 07:38:11
首先数据库中有一个经过验证正确的存储过程
代码如下
--参数说明: @date 是传入的时间 如果对某年的一个月份进行统计  则该月份的第一天日期一‘2013-03-01’这样形式传入即可
-- @costumeID 是客户的ID 对相应的客户进行月报表的详细统计 如果参数为null 则对这个月份的所有客户进行月报表的详细统计
CREATE proc p_Report_Month_Day
@date nvarchar(10),
@pruductID bigint=null,
@addressID bigint=null,
@providerID bigint =null,
@costumeID bigint=null ,
@employeeID bigint=null


as
set nocount on
SELECT ID, DATEADD(DAY,ID-1,@date) AS 日期,ISNULL(销售总价,0) AS 总价
FROM
(
SELECT ID=ROW_NUMBER() OVER (ORDER BY GETDATE()) FROM sysobjects
) A

LEFT JOIN
(
SELECT saleDate,sum(total) 销售总价
FROM T_sale
where
( @pruductID is null or productID=@pruductID)--品名
AND ( @addressID is null or addressID=@addressID)--产地
AND ( @providerID is null or providerID=@providerID)--供应商
AND ( @costumeID is null or costumeID=@costumeID)--客户
AND ( @employeeID is null or employeeID=@employeeID)--员工

GROUP BY saleDate

) B
ON CONVERT(VARCHAR(10),DATEADD(DAY,ID-1,@date),120)=saledate
WHERE DATEDIFF(MONTH,@date,DATEADD(DAY,ID-1,@date))=0


在数据库的新建查询中 调用存储过程
可以得到正确的结果
exec p_Report_Month_Day '2013-03-01',null,null,null,1,null

ID 日期 总价
1 2013-03-01 00:00:00.000 1600
2 2013-03-02 00:00:00.000 0
3 2013-03-03 00:00:00.000 0
4 2013-03-04 00:00:00.000 0
5 2013-03-05 00:00:00.000 0
6 2013-03-06 00:00:00.000 0
7 2013-03-07 00:00:00.000 0
8 2013-03-08 00:00:00.000 0
9 2013-03-09 00:00:00.000 0
10 2013-03-10 00:00:00.000 0
11 2013-03-11 00:00:00.000 6400
12 2013-03-12 00:00:00.000 0
13 2013-03-13 00:00:00.000 0
14 2013-03-14 00:00:00.000 0
15 2013-03-15 00:00:00.000 0
16 2013-03-16 00:00:00.000 0
17 2013-03-17 00:00:00.000 0
18 2013-03-18 00:00:00.000 0
19 2013-03-19 00:00:00.000 0
20 2013-03-20 00:00:00.000 0
21 2013-03-21 00:00:00.000 14400
22 2013-03-22 00:00:00.000 0
23 2013-03-23 00:00:00.000 0
24 2013-03-24 00:00:00.000 0
25 2013-03-25 00:00:00.000 0
26 2013-03-26 00:00:00.000 0
27 2013-03-27 00:00:00.000 0
28 2013-03-28 00:00:00.000 0
29 2013-03-29 00:00:00.000 0
30 2013-03-30 00:00:00.000 0
31 2013-03-31 00:00:00.000 0

可以肯定的是 结果是对的 而且功能也是我想要的!
但是在强类型dataset中使用这个存储过程的时候 出现了问题
首先提示这样的错误


于是我把存储过程中的ID字段去掉了 上面的这个问题也就解决了

在程序中我就简单的这样调用了
 T_saleTableAdapter sale = new T_saleTableAdapter();
JXCManagement.DAL.DataSetSale.T_saleDataTable data=null;
data= sale.Report_Month_Day("2013-03-01", null, null, null, 1, null);

但是又出现了一个新的问题,跟踪调试的时候 报错如下



看到这样的报错我蒙了 ,首先本身这个存储过程的一些参数我是有默认值的,在调用的时候允许使用null进行赋值的 这里居然报了这样的错误
其次,不用强类型的dataset的时候 ,单独调用也是正确的,为什么使用了强类型的dataset后就出错了,实在是不知所措,估计是dataset对存储过程中临时表的处理问题,!这只是我的猜测,由于手头任务时间紧张,就贴出来烦请各位大神帮忙解决一下,分享一下大神的解决方法!真的很着急,请大神们快现身吧!!!!!!! ]

...全文
237 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack_nichao 2013-03-04
  • 打赏
  • 举报
回复
引用 9 楼 Susiria 的回复:
我不太清楚你的架构,我这里是sql server示例数据库AdventureWorks,用的uspGetManagerEmployees存储过程,方法是 直接把这个存储过程从“服务器资源管理器”的“数据连接”里,拖动到Dataset.xsd,这样会生成Fill(DataSet1.uspGetManagerEmployeesDataTable, int employee_……
非常感谢你的回答,原来你是直接为一个存储过程新建一个强类型dataset的 我之前是在基本表的强类型DataSet中 新建一个方法 然后调用我自己新建的存储过程的 出现我上面提示的错误的 刚才试了一些你说的方法 是正确的 可以得到正确的数据!!再次感谢你的热心帮助!!
Susiria 2013-03-04
  • 打赏
  • 举报
回复
我不太清楚你的架构,我这里是sql server示例数据库AdventureWorks,用的uspGetManagerEmployees存储过程,方法是 直接把这个存储过程从“服务器资源管理器”的“数据连接”里,拖动到Dataset.xsd,这样会生成Fill(DataSet1.uspGetManagerEmployeesDataTable, int employee_id)方法。对于你的架构,理应生成T_saleTableAdapter.Fill(ds.T_saleDataTable, "2013-03-01", null, null, null, 1, null)才对
jack_nichao 2013-03-04
  • 打赏
  • 举报
回复
引用 7 楼 Susiria 的回复:
引用 6 楼 jack_nichao 的回复:引用 3 楼 Susiria 的回复:楼主试一下先设置DataSet.EnforceConstraints = false,然后再获取数据 恕小弟愚昧,我也是新手,请问DataSet.EnforceConstraints这个在哪里设置 怎么设置,我刚才试了一下强类型DataSet的实例 但是没有这样的属性 麻烦指导一下小弟……
大神 ,这样做好像还是不对,首先 T_saleTableAdapter.Fill(ds.T_saleDataTable, "2013-03-01", null, null, null, 1, null);这样的操作的就报错 没有这样的调用形式,只有T_saleTableAdapter.Fill(T_saleDataTable)这样的调用, 然后我也试了一下用强类型dataset对象直接方法
 T_saleTableAdapter sale = new T_saleTableAdapter();
                JXCManagement.DAL.DataSetSale ds = new JXCManagement.DAL.DataSetSale();             
                ds.EnforceConstraints = false;   
                sale.Report_Month_Day("2013-03-01", null, null, null, 1, null);
还是报告同样的错误!求指教~~~
Susiria 2013-03-04
  • 打赏
  • 举报
回复
引用 6 楼 jack_nichao 的回复:
引用 3 楼 Susiria 的回复:楼主试一下先设置DataSet.EnforceConstraints = false,然后再获取数据 恕小弟愚昧,我也是新手,请问DataSet.EnforceConstraints这个在哪里设置 怎么设置,我刚才试了一下强类型DataSet的实例 但是没有这样的属性 麻烦指导一下小弟。。谢谢
T_saleTableAdapter sale = new T_saleTableAdapter(); JXCManagement.DAL.DataSetSale ds = new JXCManagement.DAL.DataSetSale(); ds.EnforceConstraints = false; T_saleTableAdapter.Fill(ds.T_saleDataTable, "2013-03-01", null, null, null, 1, null);
jack_nichao 2013-03-03
  • 打赏
  • 举报
回复
引用 3 楼 Susiria 的回复:
楼主试一下先设置DataSet.EnforceConstraints = false,然后再获取数据
恕小弟愚昧,我也是新手,请问DataSet.EnforceConstraints这个在哪里设置 怎么设置,我刚才试了一下强类型DataSet的实例 但是没有这样的属性 麻烦指导一下小弟。。谢谢
jack_nichao 2013-03-03
  • 打赏
  • 举报
回复
引用 2 楼 qldsrx 的回复:
请使用普通的DataSet,或者直接使用DataTable,不要对非原表数据使用强类型的DataSet,一些数据类型可能在你查询中发生了变化,比如做了算数运算后,精度改变了。微软的强类型DataSet功能非常弱,动不动就报错,还不支持可空类型的列,因此用它必定是自找烦恼。 你也可以考虑使用实体类集合,很多优秀的实体类辅助工具可以提高它的操作效率。
一语惊醒梦中人啊 非常感谢 还是使用普通的DataSet更能解决问题!
空格键 2013-03-03
  • 打赏
  • 举报
回复
Susiria 2013-03-03
  • 打赏
  • 举报
回复
楼主试一下先设置DataSet.EnforceConstraints = false,然后再获取数据
qldsrx 2013-03-03
  • 打赏
  • 举报
回复
请使用普通的DataSet,或者直接使用DataTable,不要对非原表数据使用强类型的DataSet,一些数据类型可能在你查询中发生了变化,比如做了算数运算后,精度改变了。微软的强类型DataSet功能非常弱,动不动就报错,还不支持可空类型的列,因此用它必定是自找烦恼。 你也可以考虑使用实体类集合,很多优秀的实体类辅助工具可以提高它的操作效率。
jack_nichao 2013-03-03
  • 打赏
  • 举报
回复
各位大神啊。。。快点现身吧~~

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧