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 文本:
`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 表中删除过期为验证的游戏地址
根据以上规则,我们创建一个简单的存贮过程用于完成我们的目的:
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>
public void RemoveNoCheckedEmails() {
// 注意:这里的存储过程只能是名称,参数加入到 MySqlParameter 列表中传回数据库服务器。
DBUtility.ExecuteNonQuery(CommandType.StoredProcedure, "removeNoCheckedMail",
new MySqlParameter("?currentTime", DateTime.Now)
);
}
DBUtility.ExecuteNonQuery 方法代码如下:
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);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?