当前位置:   article > 正文

C#如何通过存储过程从数据库中获得数据_c# 调用存储过程查询数据据

c# 调用存储过程查询数据据

        存储过程就是在数据库中写好的函数,C#通过调用存储过程来获得数据,可以在一定程度上提高数据库的安全性(将一些重要的数据封装了起来),那么如何在C#中调用存储过程呢?


一、存储过程

环境如下:

1、数据库Itcast2014中包含表TblStudent,表中数据如下:

 

2、 存储过程的名称是usp_separatepage,功能是将表中的数据分页显示,通过给定每页的行数和查询的页码,显示当前页的行。

3、第一个参数是查询的行数,第二个参数是需要查询的页码,第三个参数是返回值,返回表中总共的行数,第三个参数是返回值,返回表中总共的页数。

4、存储过程具体代码如下:

  1. CREATE proc [dbo].[usp_separatepage]
  2. @itemperpage int=7, --每页多少条
  3. @currentpage int=1, --当前的页数
  4. @itemcount int output, --总共多少条
  5. @pagecount int output --总共多少页
  6. as
  7. begin
  8. select t.tsid,t.tsname,tsaddress,t.tsphone,t.tsage,t.tsbirthday,t.tscardid
  9. from (select *,rn=row_number() over(order by tsid asc) from TblStudent) as t
  10. where t.rn between (@currentpage-1)*@itemperpage+1 and @currentpage*@itemperpage --分页的语句
  11. set @itemcount=(select count(1) from TblStudent)
  12. set @pagecount=CEILING((@itemcount*1.00)/@itemperpage)
  13. end

二、第一种方法

环境如下:

1、创建一个控制台应用程序

2、在当前main方法所在类下写一个方法

3、第一种方法中使用的sql命令可以直接在数据库中使用,与其他的select语句同样的执行方法

4、给定参数时,返回值无须指定value,但是要指定direction

5、获得返回值的方法就是通过参数数组,给定下标获取。

6、方法如下:

  1. /// <summary>
  2. /// 执行带参数和返回值的存储过程的第一种方法,直接使用exec并指定参数运行
  3. /// </summary>
  4. /// <param name="page">选择要查看的页码</param>
  5. /// <returns></returns>
  6. private static DataTable GetData(int page)
  7. {
  8. DataTable dt = new DataTable();
  9. string conStr = "server=.;database=Itcast2014;integrated security=true;";
  10. //注意执行存储过程的语法,前面要加exec,后面的参数要指定,前面两个参数是输入的参数,后面两个是返回值
  11. string cmdTxt = "exec usp_separatepage @itemperpage,@currentpage,@itemcount=@ic output,@pagecount=@pc output";
  12. using (SqlDataAdapter adapter = new SqlDataAdapter(cmdTxt, conStr))
  13. {
  14. //指定需要的参数,第三个参数和第四个参数是返回值,无需指定value,但是要指定方向参数
  15. SqlParameter[] paras = new SqlParameter[]
  16. {
  17. new SqlParameter("@itemperpage",SqlDbType.Int) {Value=7 },
  18. new SqlParameter("@currentpage",SqlDbType.Int) {Value=page },
  19. new SqlParameter("@ic",SqlDbType.Int) {Direction=ParameterDirection.Output },
  20. new SqlParameter("@pc",SqlDbType.Int) {Direction=ParameterDirection.Output }
  21. };
  22. adapter.SelectCommand.Parameters.AddRange(paras);
  23. adapter.Fill(dt);
  24. //直接通过参数数组获得我们需要的返回值
  25. int rowcount = Convert.ToInt32(paras[2].Value);
  26. int pagecount = Convert.ToInt32(paras[3].Value);
  27. }
  28. return dt;
  29. }

 三、第二种方法

环境同第一种方法。

第二种方法与第一种方法有三点不同:

1、sql命令语句只给了一个存储过程的名称

2、在执行前,将命令类型设置成了存储过程

3、参数的名称需要和存储过程中的名称一致

  1. /// <summary>
  2. /// 执行带参数和返回值的存储过程的第二种方法,直接提交存储过程的名称
  3. /// </summary>
  4. /// <param name="page">选择要查看的页码</param>
  5. /// <returns></returns>
  6. private static DataTable GetData2(int page)
  7. {
  8. DataTable dt = new DataTable();
  9. string conStr = "server=.;database=Itcast2014;integrated security=true;";
  10. //命令参数直接给一个存储过程的名称
  11. string cmdTxt = "usp_separatepage";
  12. using (SqlDataAdapter adapter=new SqlDataAdapter(cmdTxt,conStr))
  13. {
  14. //*******************将命令类型设置成存储过程*********************
  15. adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
  16. //指定需要的参数,第三个参数和第四个参数是返回值,无需指定value,但是要指定方向参数,参数的名称要和存储过程中相同
  17. SqlParameter[] paras = new SqlParameter[]
  18. {
  19. new SqlParameter("@itemperpage",SqlDbType.Int) {Value=7 },
  20. new SqlParameter("@currentpage",SqlDbType.Int) {Value=page },
  21. new SqlParameter("@itemcount",SqlDbType.Int) {Direction=ParameterDirection.Output },
  22. new SqlParameter("@pagecount",SqlDbType.Int) {Direction=ParameterDirection.Output }
  23. };
  24. adapter.SelectCommand.Parameters.AddRange(paras);
  25. adapter.Fill(dt);
  26. //直接通过参数数组获得我们需要的返回值
  27. int rowcount = Convert.ToInt32(paras[2].Value);
  28. int pagecount = Convert.ToInt32(paras[3].Value);
  29. }
  30. return dt;
  31. }

四、main函数

main函数中主要是如何访问表格DataTable的每行数据。

  1. static void Main(string[] args)
  2. {
  3. DataTable table = GetData2(2);
  4. //遍历表格的所有行
  5. for (int i = 0; i < table.Rows.Count; i++)
  6. {
  7. //遍历表格的所有列
  8. for (int j = 0; j < table.Columns.Count; j++)
  9. {
  10. Console.Write(table.Rows[i][j] + "\t");
  11. }
  12. Console.WriteLine();
  13. }
  14. Console.ReadKey();
  15. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/418908?site
推荐阅读
相关标签
  

闽ICP备14008679号