C#调用存储过程

jk203mn 2011-08-22 04:43:58
大家帮忙看下,我写这个不报错。。。存储过程在sql中运行正常,但在程序里面就不行。。。
谢谢!
下面是代码

SqlCommand sqlcmd = new SqlCommand("proc_avg_params", con);

sqlcmd.CommandType=CommandType.StoredProcedure;

SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@beginTime",SqlDbType.DateTime),
new SqlParameter("@endTime",SqlDbType.DateTime)
};

param[0].Direction = ParameterDirection.Input;
param[0].Value = beginTime;
param[1].Direction = ParameterDirection.Input;
param[1].Value = endTime;

sqlcmd.Parameters.Add(param[0]);
sqlcmd.Parameters.Add(param[1]);

SqlDataAdapter sda = new SqlDataAdapter(sqlcmd);

DataSet ds = new DataSet();

sda.SelectCommand.CommandTimeout = 720;

ds.Clear();

sda.Fill(ds);
...全文
704 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jk203mn 2011-08-23
  • 打赏
  • 举报
回复
问题解决了。。。
错误原因:sda.Fill(ds,"这块要把临时表名称加里面")。。。
我就郁闷了不是说临时表不能在这里面用吗?sda.Fill(ds,"这块要把临时表名称加里面")。。。
求解。。。
快乐大法师 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jk203mn 的回复:]
引用 19 楼 tsapi 的回复:
程序没错

C# code
this.GridView1.DataSource=ds.Tables[0].DefaultView;
就行了



关键是dataset的count值返回的是0。。。就是说dataset中没有任何元素。。。
[/Quote]

....还没解决啊 早上随便写的

create proc proc_test
@starttime datetime,
@endtime datetime
as
select * from OverTime where Date between @starttime and @endtime
go







SqlConnection con = new SqlConnection("Data Source=FCSDL-DT-002\\SQLEXPRESS;Initial Catalog=Attence;Integrated Security=True");

con.Open();

DataSet ds = new DataSet();
SqlCommand cmd = new SqlCommand("proc_test", con);

cmd.CommandType = CommandType.StoredProcedure;


//cmd.Parameters.Add("@Name", SqlDbType.NVarChar);
//cmd.Parameters["@Name"].Value = "灰太郎";

SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@starttime",SqlDbType.DateTime),
new SqlParameter("@endtime",SqlDbType.DateTime)
};

param[0].Direction = ParameterDirection.Input;
param[0].Value = Convert.ToDateTime("2011.5.12");
param[1].Direction = ParameterDirection.Input;
param[1].Value = Convert.ToDateTime("2011.6.28"); ;

//cmd.Parameters.Add(param);

cmd.Parameters.AddRange(param);

SqlDataAdapter da = new SqlDataAdapter(cmd);

da.SelectCommand.CommandTimeout = 720;

ds.Clear();

da.Fill(ds);

DataTable dt = new DataTable();
dt = ds.Tables[0];

con.Close();


dataGridView1.DataSource = dt;
jk203mn 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 tsapi 的回复:]
程序没错

C# code
this.GridView1.DataSource=ds.Tables[0].DefaultView;
就行了
[/Quote]


关键是dataset的count值返回的是0。。。就是说dataset中没有任何元素。。。
Daqing 2011-08-23
  • 打赏
  • 举报
回复
程序没错
this.GridView1.DataSource=ds.Tables[0].DefaultView;
就行了
快乐大法师 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jk203mn 的回复:]
引用 15 楼 kkxxllasasas 的回复:
引用 14 楼 jk203mn 的回复:
我可能把问题没说清楚。。。在sql中运行可以出结果。在程序中ds老返回0,
我把上面的方法都试了。。。还不行。。。


和你说了 传参不对 AddRange
sqlcmd.Parameters.AddRange(param[0]);
sqlcmd.Parameters.AddRange(p……
[/Quote]

哦 不好意思 就是告诉你 用AddRange 不用Add
jk203mn 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kkxxllasasas 的回复:]
引用 14 楼 jk203mn 的回复:
我可能把问题没说清楚。。。在sql中运行可以出结果。在程序中ds老返回0,
我把上面的方法都试了。。。还不行。。。


和你说了 传参不对 AddRange
sqlcmd.Parameters.AddRange(param[0]);
sqlcmd.Parameters.AddRange(param[1]);
这样写
[/Quote]


大哥这么写编译都通不过。。。。
sqlcmd.Parameters.AddRange(param)--这样就行
阿妈的乖女儿 2011-08-23
  • 打赏
  • 举报
回复
这是张临时表的,不需要加表名的。
存储过程里面的字段需要在dal层中定义,并且封装哦
还有感觉你的SQLparamter 写的有点麻烦了。
SqlParameter[] param = new SqlParameter[]
{
new SqlParameter("@beginTime", beginTime),
new SqlParameter("@endTime",endTime)
};

sqlcmd.Parameters.AddRange(param);
这样就可以咯,,你在填充数据之前你就将 ds.Clear();清空,这样好像不对,你先去掉再看看。。呵呵,祝你成功



[Quote=引用 7 楼 sdl2005lyx 的回复:]
看上去没什么问题,楼主一步步跟踪一下,重点关注sqlcmd.Parameters值是什么。。。

还有,sda.Fill(ds,"表名");这句加上表名
[/Quote]
快乐大法师 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jk203mn 的回复:]
我可能把问题没说清楚。。。在sql中运行可以出结果。在程序中ds老返回0,
我把上面的方法都试了。。。还不行。。。
[/Quote]

和你说了 传参不对 AddRange
sqlcmd.Parameters.AddRange(param[0]);
sqlcmd.Parameters.AddRange(param[1]);
这样写

jk203mn 2011-08-23
  • 打赏
  • 举报
回复
我可能把问题没说清楚。。。在sql中运行可以出结果。在程序中ds老返回0,
我把上面的方法都试了。。。还不行。。。
快乐大法师 2011-08-23
  • 打赏
  • 举报
回复
哈哈 问题就在这 cmd.Parameters.AddRange();
注意 是AddRange 方法 不是Add
sdl2005lyx 2011-08-22
  • 打赏
  • 举报
回复
"我这是张临时表,在这里面不能用吧?",楼主,用个临时表名。
qzp000000 2011-08-22
  • 打赏
  • 举报
回复

加一个GridView控件看看
sda.Fill(ds);
this.GridView1.DataSource=ds.Tables[0];
this.GridView1.DataBind();

如果不能显示的话,把存储过程贴出来看看
jk203mn 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sdl2005lyx 的回复:]
看上去没什么问题,楼主一步步跟踪一下,重点关注sqlcmd.Parameters值是什么。。。

还有,sda.Fill(ds,"表名");这句加上表名
[/Quote]


我这是张临时表,在这里面不能用吧?
jk203mn 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lollipop6105 的回复:]
引用 2 楼 kkxxllasasas 的回复:

sqlcmd.Parameters.Add(param[0]);
sqlcmd.Parameters.Add(param[1]);

这么写试试
sqlcmd.Parameters.Add(param);

你是往里面传数组的、干嘛一个一个的传、、就用这个方法就行了、、
[/Quote]


这样写会报错。。。
jk203mn 2011-08-22
  • 打赏
  • 举报
回复
我打断点试过了,各项参数都正常,关键是它不报错,报错的话还可以找出点原因,不报错我都不知道错在哪儿了。。。
sdl2005lyx 2011-08-22
  • 打赏
  • 举报
回复
看上去没什么问题,楼主一步步跟踪一下,重点关注sqlcmd.Parameters值是什么。。。

还有,sda.Fill(ds,"表名");这句加上表名
ycproc 2011-08-22
  • 打赏
  • 举报
回复
自己断点调试啊

别只知道看错 不知道跟踪
MicroX.S.r 2011-08-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kkxxllasasas 的回复:]

sqlcmd.Parameters.Add(param[0]);
sqlcmd.Parameters.Add(param[1]);

这么写试试
sqlcmd.Parameters.Add(param);
[/Quote]
你是往里面传数组的、干嘛一个一个的传、、就用这个方法就行了、、
qzp000000 2011-08-22
  • 打赏
  • 举报
回复
不会吧,我也是初学,按照你的思路做了一遍,没问题!!!!??
ajaxtop 2011-08-22
  • 打赏
  • 举报
回复
没有说清楚,程序里面就不行是什么情况

至少打个断点看下,哪一步有问题

sda.SelectCommand.CommandTimeout = 720;

ds.Clear();

去掉在试下
sqlcmd.Parameters.Add(param[0]);
sqlcmd.Parameters.Add(param[1]);

可以改成2#试下

加载更多回复(2)

110,577

社区成员

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

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

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