• ADO.NET--升阶--使用带参数SQL&存储过程&连接池


    用一个学员管理系统的添加学员功能来做一下知识点使用。

    第一步:编写存储过程

    里面用了事务--Transaction,它单条SQL语句本来就是默认事务,这里只是想显示如何结合使用。

     1 --数据库端存储过程编写
     2 if exists(select * from sysobjects where name='usp_AddStudent')
     3         drop procedure usp_AddStudent
     4 go
     5 create procedure usp_AddStudent
     6     
     7         @StudentName nvarchar(20),@Gender char(2),@BirthDate datetime,@StudentIdNo char(18),
     8         @Age int,@CardNo nvarchar(20),@PhoneNumber nvarchar(50),@Photo text,@HomeAddress nvarchar(20),
     9         @ClassId int,@StudentId int output --使用输出参数
    10 as
    11         declare @errorNum int
    12         begin transaction
    13             begin
    14             insert into Students
    15             (StudentName,Gender,Birthday,StudentIdNo,Age,CardNo,PhoneNumber,Photo,HomeAddress,ClassId)
    16             values            (@StudentName,@Gender,@BirthDate,@StudentIdNo,@Age,@CardNo,@PhoneNumber,@Photo,@HomeAddress,@ClassId)
    17              set @errorNum=@errorNum+@@error
    18              if(@errorNum>0)
    19                 rollback transaction
    20             else 
    21                 begin
    22                     commit transaction
    23                     set @StudentId=@@Identity --获取自增列的值,即学号
    24                 end
    25          end
    26 go
    View Code

     第二步:编写SQLHelper

     1 public static int UpdateBySP(string procedure,SqlParameter[] parameter)
     2         {
     3             SqlConnection conn = new SqlConnection(connString);
     4             SqlCommand cmd = new SqlCommand();
     5             try
     6             {
     7                 conn.Open();
     8                 cmd.Connection = conn;
     9                 cmd.CommandType = CommandType.StoredProcedure;//声明需要调用存储过程
    10                 cmd.CommandText = procedure;                  //指明所使用的存储过程
    11                 cmd.Parameters.AddRange(parameter);
    12                 int result = cmd.ExecuteNonQuery();
    13                 return result;
    14             }
    15             catch (SqlException ex)
    16             {
    17                 throw new Exception("数据库异常:" + ex);
    18             }
    19             catch (Exception ex)
    20             {
    21                 throw ex;
    22             }
    23             finally
    24             {
    25                 conn.Close();
    26             }
    27         }
    28     }
    View Code

    第三步:根据数据库Student表设计Models-Student类

     1 public class Student
     2     {
     3         public int StudentId { get; set; }
     4         public string StudentName { get; set; }
     5         public string Gender { get; set; }
     6         public DateTime Birthday { get; set; }
     7         public string StudentIdNo { get; set; }
     8         public int Age { get; set; }
     9         public string CardNo { get; set; }
    10         public string PhoneNumber { get; set; }
    11         public string Photo { get; set; }
    12         public string HomeAddress { get; set; }
    13         public int ClassId { get; set; }
    14 
    15         public string ClassName { get; set; }
    16 
    17     }
    View Code

    第四步:编写DAL-StudentsService

     1  public int AddStudent(Student objStu)
     2         {
     3             SqlParameter stuIdParameter = new SqlParameter("StudentId", objStu.StudentId);
     4             stuIdParameter.Direction = ParameterDirection.Output;//指定为输出参数
     5             SqlParameter[] parameter = new SqlParameter[]
     6                 {
     7                     new SqlParameter ("@StudentName",objStu.StudentName),
     8                     new SqlParameter ("@Gender",objStu.Gender),
     9                     new SqlParameter ("@BirthDate",objStu.Birthday),
    10                     new SqlParameter ("@StudentIdNo",objStu.StudentIdNo),
    11                     new SqlParameter ("@Age",objStu.Age),
    12                     new SqlParameter ("@CardNo",objStu.CardNo),
    13                     new SqlParameter ("@PhoneNumber",objStu.PhoneNumber),
    14                     new SqlParameter ("@Photo",objStu.Photo),
    15                     new SqlParameter ("@HomeAddress",objStu.HomeAddress),
    16                     new SqlParameter ("@ClassId",objStu.ClassId),
    17                     stuIdParameter
    18                 };
    19             try
    20             {
    21                 int res = SQLHepler.UpdateBySP("usp_AddStudent", parameter);
    22                 if (res > 0)
    23                     return Convert.ToInt32(stuIdParameter.Value);
    24                 else
    25                     return 0;
    26             }
    27             catch (Exception ex)
    28             {
    29 
    30                 throw ex;
    31             }        
    32         }
    33     }
    View Code

    第五步:编写UI-添加事件

     1   static void Main(string[] args)
     2         {
     3             Console.WriteLine("键入Y开始添加学员:");
     4             string key = Console.ReadLine();
     5             if (key.Equals("Y"))
     6             {
     7                 Student objStu = new Student()
     8                 {
     9                     StudentName = "阿于",
    10                     Gender="",
    11                     Birthday=Convert.ToDateTime("1994-04-13"),
    12                     StudentIdNo="321284199404131234",
    13                     Age =24,
    14                     PhoneNumber="12345678910",
    15                     Photo="123",
    16                     HomeAddress="未知",
    17                     CardNo="12345678",
    18                     ClassId=1
    19                 };
    20                 int res = new StudentService().AddStudent(objStu);
    21                 if(res>0)
    22                     Console.WriteLine("添加成功,学员学号:"+res);
    23                 else
    24                     Console.WriteLine("添加失败!");
    25             }
    26             Console.ReadLine();
    27         }      
    View Code

    看结果:

    这里有个问题:

    Student里一个属性:Photo为null的时候,去插入会报错:没有Photo参数传入。

    这里说明:调用带参数的存储过程,不能传递一个为null的参数给存储过程,其实我们在实际开发的时候也要尽量避免null值的传递。

    如果是想要允许null值给存储过程,可以在存储过程里给指定参数赋一个默认值,比如这里:@Photo text=‘123’,经测试这样是不会再报错的。

    记录一下连接池的概念与使用

    所谓数据库连接池,其实就是我们提前在数据库端建立好几个特定的连接,等待用户的使用;

    程序访问时我们直接把已建好的“连接”拿过来直接使用;

    等执行完数据议问后,需要把这个连接在放回到连接池中;

    等待用户再访问时,可以不断反复使用,这样可以有效的提高数据议问效率。

    数据库连接池的创建非常简单,只要学会连接池的字符串编写方法就可以了。 

    连接池字符串编写:

    代码解释:

    Pooling=true;表示启用连接池。

    Max Pool Size=10;表示连接池里面最大允许的连接数(可以自定)。

    Min Pool Size=5;表示连接池里面最小的连接数。

    在第一次议问数据库的时候会马上创建 5 个连接,以后根据并发的需要自动增加连接数,但最多不超过规定的10 个连接,如果超过 10 个并发请求的时候,则在连接池之外创建连接对象,在连接池以外创建的连接对象关闭后,会释放连接资源。

  • 相关阅读:
    前端工程部署
    xcode使用入门
    effective java
    java测试用例的编写
    记录一次随意操作数据库,插入新数据,导致与程序添加新数据时,引起的主键值重复问题。More than one row with the given identifier was found: 1690
    Spring.Net中的依赖注入(DI)
    记一次使用js中的this关键字在ajax中使用,因传入的this对象不同而引起的问题。
    代理模式
    异常: 指定的转换无效
    log4net.config配置启用的几种方式
  • 原文地址:https://www.cnblogs.com/EasonDongH/p/8033934.html
Copyright © 2020-2023  润新知