当前位置: 首页 > 编程日记 > 正文

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/archive/2008/09/04/1284094.html

相关文章:

[C#]判断是否是合法的IP4,IP6地址

判断一个字符串如果没有端口的话&#xff0c;利用IPAddress.TryParse很好判断&#xff0c;那么有端口怎么判断呢&#xff0c;正则表达式&#xff1f;还是其他方式&#xff1f; 关键代码&#xff1a; /// <summary>/// 判断是否是合法的IP4,IP6地址/// </summary>//…

Centos 7使用vsftpd搭建FTP服务器

FTP&#xff0c;即&#xff1a;文件传输协议&#xff08;File Transfer Protocol&#xff09;&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21端口号&#xff0c;其中端口20&#xff08;数据端口&#xff09;用于进行数据传输&#xff0c;端口21&#xff08;命令…

Android中的网络(字节跳动)

文章目录RESTful API对REST的解释资源与URI什么是URIHTTP URL的组成Http 接口JSONHttp资源XMLJSONAndroid中对JSON的处理方法一&#xff1a;org.json.JSONObject方法二&#xff1a;GSON(toJson,fromJson)RetrofitRESTful API 对REST的解释 REST描述的是在网络中客户端和服务端…

编写和调试Shader程序(1)

编写和调试Shader程序&#xff08;1&#xff09;DirectX EffectEditJohnsonFeng常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手&#xff0c;本文先介绍DirectX的EffectEdit。EffectEdit是DirectX9.0…

(24):(行为型模式) Visitor 访问者模式

[所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

二十二、新人成才之路《做人七项原则 做一个节俭惜福的人》

人的福报有先天福报和后天福报。先天福报是从出生时&#xff0c;就注定的。你是个有福的人&#xff0c; 还是个福气少的人。比如出身富贵之家的孩子&#xff0c;可能天生福报较大。出身贫穷人家的孩子&#xff0c; 天生福报可能就较小。也有贫苦孩子通过奋斗努力&#xff0c;最…

代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法

(1)选中文件右键->team->update (2)选中文件右键->replace with->latest from HEAD (3)选中文件右键->team->synchronize with repository 注&#xff1a;第三种方法会以可视化的方式让用户对比本地工作目录和远程配置库中文件的区别 可以用当中的copy方法来…

SPOJ AMR10I Dividing Stones --DFS

题意&#xff1a;给n个石头&#xff0c;分成一些部分&#xff08;最多n部分&#xff0c;随便分&#xff09;&#xff0c;问分完后每部分的数量的乘积有多少种情况。 分析&#xff1a;可以看出&#xff0c;其实每个乘积都可以分解为素数的乘积&#xff0c;比如乘积为4&#xff0…

Cookie注入是怎样产生的

Cookie注入是怎样产生的 现在很多网站都加了防注入系统代码&#xff0c;你输入注入语句将无法注入~~感觉这样的防注入系统不错&#xff0c;但防注入系统没有注意到 Cookies 的问题&#xff01;所以就有了Cookies注入~~我们来研究一下怎样情况下才会有Cookies注入!如果你学过ASP…

阿里最强热修复:Sophix 超高速集成与踩坑

超高速集成 public class SophixStubApplication extends SophixApplication {private final String TAG "Sophix";// 此处SophixEntry应指定真正的Application&#xff0c;并且保证RealApplicationStub类名不被混淆。KeepSophixEntry(GowildApplication.class)stat…

安卓开发|自定义监听器的三个步骤

首先&#xff0c;要有一个实现View.OnClickListener接口的类这个类要重写onClick(View v)这个方法&#xff0c;里面加入想要触发的事件将监听器绑定在要监听的组件上&#xff0c;例如 holder.verticalLinear.setOnClickListener(MyAdapter.this);setOnClickListener的参数即为…

自己用C#写一个采集器、蜘蛛(zz)

效果图&#xff1a; 代码如下&#xff1a; usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Net;usingSystem.Web;usingSystem.IO;usingSystem.Collections;usingSystem.Text.RegularExpressions;namespacechinaz { classProgram { …

DataPipeline |《Apache Kafka实战》作者胡夕:Apache Kafka监控与调优

胡夕&#xff0c;《Apache Kafka实战》作者&#xff0c;北航计算机硕士毕业&#xff0c;现任某互金公司计算平台总监&#xff0c;曾就职于IBM、搜狗、微博等公司。国内活跃的Kafka代码贡献者。 前言虽然目前Apache Kafka已经全面进化成一个流处理平台&#xff0c;但大多数的用户…

windows程序移植linux

1&#xff0c;路径名统一用正斜杠“/”。&#xff08;windows下正反斜杠都识别&#xff0c;linux只认正斜杠。&#xff09; 2&#xff0c;统一使用UTF-8格式编码。 vim中无法保存汉字时&#xff0c;可输入下列命令&#xff1a; &#xff1a;set fileencodingprc &#xff1a;se…

完美解决方案 | 完全卸载任何版本office残余文件

采用微软官方给的卸载文件&#xff0c;注意需要能够科学上网 然后再用拼夕夕的安装包重装就能装上&#xff0c;不会提示以下 折腾好久&#xff0c;这次亲测有效 参考文章

Struts2的拦截器只允许有权限用户访问action

1、定义拦截器,继承MethodFilterInterceptor package com.life.stuts.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;/*** 如果不是login的adction&#xff0c;使…

ZABBIX(八) Zabbix 通知媒介

一、zabbix报警媒介介绍zabbix触发器到了要发送通知的情况下&#xff0c;需要一个中间介质来接收并传递消息给运维。以前使用的是nagios&#xff0c;通常用脚本发送邮件或者发送飞信来达到报警。在此脚本就是一个媒介了。1、E-mail使用sendmail发送邮件&#xff0c;从这边出去的…

Office Live for Small Business--开启您创业的大门

在我印象中&#xff0c;有一段时间了&#xff0c;我一个人或是和一些朋友在一起聊天的时候&#xff0c;脑子里总是会不由自主地琢磨一个问题&#xff0c;我想这个问题或许也常常困扰很多朋友&#xff0c;那就是“房子首付从哪里来”。我不是一个习惯于伸手跟父母要钱的人&#…

webView加载不出网页的一种可能情况

我的webview的Java代码里有以下内容 Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.webview);savedInstanceState getIntent().getExtras();myurl savedInstanceState.getString("url&qu…

GridView 始终显示 Pager 分页行的一种方法

GridView 是 ASP.NET 2.0 新增加的 Web 控件&#xff0c;拥有比 DataGrid 更多的扩展和改进。使用 GridView 可以很容易的实现数据分页&#xff0c;但是遗憾的是&#xff0c;在缺省情况下&#xff0c;当仅有一页数据时&#xff0c; GridView 不显示 Pager 分页行&#xff0c;这…

php 几十万数据导出到csv

2019独角兽企业重金招聘Python工程师标准>>> 参考资料 &#xff1a; https://blog.csdn.net/tim_phper/article/details/77581071 https://www.imooc.com/wenda/detail/316785 /*** 下载/导出到csv文件* param $title 标题栏标题* param $data : array($count M(表…

恍然大悟之原、反、补

曾在很多书籍中看到过关于原码、反码和补码的介绍&#xff0c;都未能够深入理解。今在Richard Blum编写的《汇编语言程序设计》一书中读到关于带符号整数一节的讲解时&#xff08;确切的说是其中的一句话&#xff09;&#xff0c;的确有茅塞顿开、恍然大悟之感。原文如下&#…

Android中的多线程(字节跳动)

文章目录Handler机制(Android中的消息队列机制)Handler机制为Android系统解决了以下两个问题Handler常用方法Handler的使用补充知识点Handler原理辨析Runnable/Message扩展知识&#xff1a;ANRHandler总结Android中的多线程概念&#xff1a;进程与线程(Process and Thread)Andr…

利用ZYNQ SOC快速打开算法验证通路(5)——system generator算法IP导入IP integrator

一、前言 利用FPGA设计算法一直以来都是热点&#xff0c;同样也是难点。将复杂的数学公式 模型通过硬件系统来搭建&#xff0c;在低延时 高并行性等优势背后极大提高了设计难度和开发周期。Xilinx公司的sysGen&#xff08;system generator&#xff09;工具扩展了MATLAB的simul…

JS下计算当前日期(当天)后N天出现NAN或者undefined的情况

前言&#xff1a; 帮客户做一个订单系统&#xff0c;需要一个日期1&#xff0c;一个日期2&#xff0c;默认情况下日期1为当天&#xff0c;日期2为明天&#xff0c;只是当时有些疑惑的是日期2偶尔会出现NAN的情况&#xff0c;今天在segmentfault.com看到了同样的问题&#xff0c…

VCL 中的 Windows API 函数(6): BeginDeferWindowPos

BeginDeferWindowPos 和 DeferWindowPos、EndDeferWindowPos 是一组一起使用的函数, 可对一组窗口的位置、大小、Z 序等进行调整, 在 ExtCtrls 单元有用到.下面先用常规方法实现对 Panel1 中的一组 Button 进行调整, 然后再用上面三个函数重新实现.本例效果图:代码文件:unit Un…

base64格式的图片数据如何转成图片

base64格式的图片数据如何转成图片 一、总结 一句话总结&#xff1a;不仅要去掉前面的格式串&#xff0c;还需要base64_decode&#xff08;&#xff09;解码才行。 1 // $base_img是获取到前端传递的值2 $base_img str_replace(data:image/jpg;base64,, , $base_img);3 // 设…

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象&#xff0c;而赋值运算符不能。 2.由于拷贝构造函数是直接构造一个新的类对象&#xff0c;所以在初始化这个对象之前不用检验源对象是否和新对…

代码重构之三种取代类型码(类、子类、状态对象或策略对象)的方式辨析

1.以类取代类型码 适用情况&#xff1a;类之中有一个数值类型码&#xff0c;但它并不影响类的行为。 重构手段&#xff1a;以一个新的类替换该数值类型码。 重构类图示意&#xff1a; 这里的“不影响类的行为”是什么意思呢&#xff1f; 类型码往往和switch语句一起出现&#…