C# + MySql 存贮过程开发示例

MySql 发展至今,已经不是当初那个只依靠免费和速度取胜的开源数据库服务器了,它提供的一系列 GUI 工具,以及加入商业数据库的一些特性,依然免费并且开源,让我们实在无法拒绝它的魅力。

 

很多人在谈及 MySql 可能会条件反射般地联想到 php,就像很多人在谈及 asp 或 asp.net 就会联系到 SqlServer 一样。其实,ADO.NET 配合 MySql,其实也是一对不错的鸳鸯哦。

 

以 MySql Server 5.0 为例,首先到 MySql 网站下载 GUI 工具,包括 Administrator 和 Query Browser 这两个常用的 GUI 工具,它们的作用相当于 SqlServer 下的 企业管理器 和 查询分析器。当然,GUI 工具并非必须,我们完全可以在控制台下实现相同的目的(如果你愿意那样做的话)。

 

打开 MySql Administrator,以管理员权限登录到 MySql Server,新建一个数据库,名定名为 db_test。再分别创建一个 user 表和一个 mail_check 表,字段请参考如下 SQL 文本:

 

CREATE   TABLE  `db_test`.` user ` (
  `id` 
CHAR ( 36 NOT   NULL  COMMENT  ' 用户ID ' ,
  `username` 
VARCHAR ( 45 NOT   NULL  COMMENT  ' 用户名 ' ,
  `password` 
VARCHAR ( 45 NOT   NULL  COMMENT  ' 密码 ' ,
  `gender` 
SMALLINT  UNSIGNED  NOT   NULL  COMMENT  ' 性别 ' ,
  `birth_year` 
INTEGER  UNSIGNED  NOT   NULL  COMMENT  ' 出生年份 ' ,
  `email` 
VARCHAR ( 45 DEFAULT   NULL  COMMENT  ' 邮箱 ' ,
  `face_img_extend` 
VARCHAR ( 45 DEFAULT   NULL  COMMENT  ' 头像扩展名 ' ,
  `email_checked` BOOLEAN 
NOT   NULL   DEFAULT  false COMMENT  ' 邮箱是否得通过验证 ' ,
  `allow_upload` BOOLEAN 
NOT   NULL   DEFAULT  false COMMENT  ' 是否允许上传文件 ' ,
  `allow_comment` BOOLEAN 
NOT   NULL   DEFAULT  true COMMENT  ' 是否允许评论 ' ,
  `reg_date` 
DATETIME   NOT   NULL  COMMENT  ' 注册日期 ' ,
  
PRIMARY   KEY  (`id`),                                                                                                                                                           
  
UNIQUE   INDEX  `Index_username`(`username`)
)
ENGINE 
=  InnoDB
CHARACTER   SET  utf8 COLLATE utf8_general_ci
COMMENT 
=   ' 注册用户信息表 '

CREATE   TABLE  `db_test`.`mail_check` (
  `
user_id CHAR ( 36 NOT   NULL  COMMENT  ' 用户GUID ' ,
  `close_date` 
DATETIME   NOT   NULL  COMMENT  ' 允许验证的时间期限,如当前时间晚于这个时间,记录无效 ' ,
  `random_code` 
CHAR ( 5 NOT   NULL   DEFAULT   00000  COMMENT  ' 5位数随机验证码 ' ,
  
PRIMARY   KEY  (` user_id `)
)
ENGINE 
=  InnoDB
CHARACTER   SET  utf8 COLLATE utf8_general_ci
COMMENT 
=   ' 待验证的邮箱列表 ' ;

 

 

之后,创建一个存储过程,用于处理过期为验证的邮箱,它必须同时完成两个步骤:
1) 将 user 表中具有指定 id 的行的 email 字段设置为 null
2) 将 user 表中具有指定 id 的行的 email_checked 字段设置为 0(false)
3) 将 user 表中具有指定 id  的行的 allow_upload 字段的值设置为 0(fase)
4) 从 mail_check 表中删除过期为验证的游戏地址

根据以上规则,我们创建一个简单的存贮过程用于完成我们的目的:

 

CREATE   PROCEDURE  `removeNoCheckedMail`( in  currentTime  datetime )
BEGIN  

        # 
open  a  transaction  session
        START 
TRANSACTION

        # 
01 Update   user   table
        
UPDATE  ` user ` u  SET
        u.email 
=   null
        
AND  u.email_checked  =   0
        
AND  u.allow_upload  =   0
        
WHERE  u.id  IN
        (
SELECT  m. user_id   FROM  mail_check m  WHERE  close_date  >  currentTime); 

        # 
02 Delete   from  mail_check
        
DELETE   FROM  mail_check  WHERE  close_date  >  currentTime; 

        # 
commit  the session
        
COMMIT

END  

 

之后,我们需要在后台编码调用这个存贮过程,代码如下:

 

///   <summary>
///  处理所有过期未通过验证的邮箱
///   </summary>
public   void  RemoveNoCheckedEmails() {
    
//  注意:这里的存储过程只能是名称,参数加入到 MySqlParameter 列表中传回数据库服务器。
    DBUtility.ExecuteNonQuery(CommandType.StoredProcedure,  " removeNoCheckedMail " ,
        
new  MySqlParameter( " ?currentTime " , DateTime.Now)
    );

 

DBUtility.ExecuteNonQuery 方法代码如下:

 

public   sealed   class  DBUtility { 

public   static   string  ConnectionString  =
    
" server=localhost;user id=root; password=123456; database=db_test; pooling=true; charset=utf8 "

public   static   int  ExecuteNonQuery(MySqlTransaction trans, CommandType cmdType,  string  cmdText,  params  MySqlParameter[] commandParameters) {
            MySqlCommand cmd 
=   new  MySqlCommand();
            PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters);
            
int  val  =  cmd.ExecuteNonQuery();
            cmd.Parameters.Clear();
            
return  val;
        }

private   static   void  PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType,  string  cmdText, MySqlParameter[] cmdParms) { 

    
if  (conn.State  !=  ConnectionState.Open)
        conn.Open(); 

    cmd.Connection 
=  conn;
    cmd.CommandText 
=  cmdText; 

    
if  (trans  !=   null )
        cmd.Transaction 
=  trans; 

    cmd.CommandType 
=  cmdType; 

    
if  (cmdParms  !=   null ) {
        
foreach  (MySqlParameter parm  in  cmdParms)
            cmd.Parameters.Add(parm);
    }
}

}

你可能感兴趣的:(mysql)