C#调用存储过程

这次项目的数量级在1000万,所以需要对数据的操作进行优化,存储过程可以大大减少数据通信量,其他的优化倒不知道在哪里有优化的地方

首先要在sqlserver里面新建存储过程


右键新建即可

使用的命令是 create proc [your proc name]

create proc [dbo].[DOInsert]
	@in_out varchar(25),
	@number int,
	@per varchar(10),
	@time datetime,
	@isweekday varchar(5),
	@table varchar(20)
as 
begin
	declare @sql nvarchar(255)
	set @sql = 'insert into '+ @table + '(DtoO,Number,Per,CalTime,IsWeekday) values(@in_out,@number,@per,@time,@isweekday)'
	execute sp_executesql @sql,N'@in_out varchar(25),
	@number int,
	@per varchar(10),
	@time datetime,
	@isweekday varchar(5)',
	@in_out = @in_out,@number = @number , @per = @per , @time = @time , @isweekday = @isweekday;
end

如果不懂T-Sql语句的话,建议先学习下T-sql语句,其实语法很简单

create下面的变量是从C#里面传过来的变量,如果没有的话,就不需要定义。注意这里的变量名称要和C#里面的名称相同

接下来在C#里面调用过程

个人比较喜欢的C#里操作数据库的类有SqlCommand和SqlDataAdapter

<span style="white-space:pre">		</span>mSqlConnection.Open();
                SqlCommand sqlCmd = new SqlCommand("dbo.ODInsert", mSqlConnection);
                sqlCmd.CommandType = CommandType.StoredProcedure;//设置调用的类型为存储过程 
                IDictionaryEnumerator en = hashInRecord.GetEnumerator();
                while (en.MoveNext())
                {
                    SqlParameter[] para = new SqlParameter[6];
                    para[0] = new SqlParameter("@in_out", SqlDbType.VarChar, 25);
                    para[1] = new SqlParameter("@number", SqlDbType.Int);
                    para[2] = new SqlParameter("@per", SqlDbType.VarChar, 10);
                    para[3] = new SqlParameter("@time", SqlDbType.DateTime);
                    para[4] = new SqlParameter("@table",SqlDbType.VarChar,20);
                    para[5] = new SqlParameter("@isweekday",SqlDbType.VarChar,5);

                    Record tmp = (Record)en.Value;
                    para[0].Value = tmp.getNode();
                    para[1].Value = tmp.getNumber();
                    para[2].Value = tmp.getPercent();
                    para[3].Value = tmp.getTime();
                    para[4].Value = ODTable;
                    para[5].Value = (tmp.getTime().DayOfWeek == DayOfWeek.Saturday || tmp.getTime().DayOfWeek == DayOfWeek.Sunday) ? "no" : "yes";

                    foreach (SqlParameter tmppara in para) {
                        sqlCmd.Parameters.Add(tmppara);
                    }
                    sqlCmd.ExecuteNonQuery();
首先要定义Parameters,然后加到sqlCmd里面

如果用SqlDataAdapter的话

<span style="white-space:pre">			adapter.SelectCommand.CommandType = CommandType.StoredProcedure;</span>    //这是最重要的
<span style="white-space:pre">			</span>adapter.SelectCommand.Parameters.Add("@in", SqlDbType.VarChar, 10).Value = inName;
                    adapter.SelectCommand.Parameters.Add("@out", SqlDbType.VarChar, 10).Value = outName;
                    adapter.SelectCommand.Parameters.Add("@start",SqlDbType.DateTime).Value = start;
                    adapter.SelectCommand.Parameters.Add("@end", SqlDbType.DateTime).Value = end;
                    SqlParameter result = new SqlParameter("@Return Value", SqlDbType.Int);
                    result.Direction = ParameterDirection.ReturnValue;
                    adapter.SelectCommand.Parameters.Add(result);

                    adapter.Fill(new DataSet());

其中SqlDataAdapter一般带返回结果,所以一般在Fill()方法里面执行。如果要保存结果集的话,就要在外部新建一个dataset,如果只是执行的话就new一个dataset临时用就行了

在这个方法里面用到了Paramters的direction,一般都默认为Input,Return Value为在存储过程里面return的变量

之后想接收这个值的话,在执行完存储过程后,取出这个变量的值即可

<span style="white-space:pre">	</span>int number = Convert.ToInt32(result.Value.ToString());
对于select语句返回的结果集还没有尝试过,不知道adapter.Fill()有没有效果,一般这个方法用在sql语句的操作里面。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值