这次项目的数量级在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语句的操作里面。