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(36NOT NULL COMMENT '用户ID',
  `username` 
VARCHAR(45NOT NULL COMMENT '用户名',
  `password` 
VARCHAR(45NOT NULL COMMENT '密码',
  `gender` 
SMALLINT UNSIGNED NOT NULL COMMENT '性别',
  `birth_year` 
INTEGER UNSIGNED NOT NULL COMMENT '出生年份',
  `email` 
VARCHAR(45DEFAULT NULL COMMENT '邮箱',
  `face_img_extend` 
VARCHAR(45DEFAULT 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_idCHAR(36NOT NULL COMMENT '用户GUID',
  `close_date` 
DATETIME NOT NULL COMMENT '允许验证的时间期限,如当前时间晚于这个时间,记录无效',
  `random_code` 
CHAR(5NOT 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

        # 
01Update 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); 

        # 
02Delete 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);
    }
}

}
原文地址:https://www.cnblogs.com/wfyfngu/p/1284094.html