在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 = '待验证的邮箱列表';
之后,创建一个存储过程,用于处理过期为验证的邮箱,它必须同时完成两个步骤: 根据以上规则,我们创建一个简单的存贮过程用于完成我们的目的:
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); } } } |
请发表评论