您的位置:首页 > 数据库

C#操作数据库的常用公共方法!

2012-09-03 18:46 573 查看
即便是一个小型的C#+数据库的项目(本文以SQL SERVER为例,其他数据库类似),也需要多种对数据库的操作。有时候编代码的时候,想到哪写到哪确实可以实现具体的功能,但从整个框架体系上来看,代码的冗余以及不规范,很有可能导致代码运行的效率,对后期扩展项目的规模也是有弊而无利。以前我犯了很都这种错误,以后坚决不犯了。

好了,言归正传了。经常操作数据库的步骤无非就是连接数据库,执行SQL语句,显示结果三个大步骤。而一般这三个步骤可以由两个方面进行(个人感觉是这样):一个方法就是建立SqlDataAdapter用以填充数据集DataSet;另一个方法就是利用Commd对象执行SQL语句,然后建立SqlDataReader。前者主要用于绑定显示控件,后者则倾向于判断某种条件。总之,大体的操作流程就是这样,当我们进行多次操作数据库的时候,必然会有重复的代码,那么建立公共方法就是很必要的了。

建立一个公共类,如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace BaseClass
{
class BaseOperate
{

//连接数据库
public SqlConnection getcon()
{
string M_str_sqlcon = "Server=.;DataBase=db_CRM;Trusted_Connection=SSPI";
SqlConnection myCon = new SqlConnection(M_str_sqlcon);
return myCon;
}

//连接SqlConnection,执行SQL
public void getcom(string M_str_sqlstr)
{
SqlConnection sqlcon = this.getcon();
sqlcon.Open();
SqlCommand sqlcom = new SqlCommand(M_str_sqlstr, sqlcon);
sqlcom.ExecuteNonQuery();
sqlcom.Dispose();
sqlcon.Close();
sqlcon.Dispose();
}

//创建DataSet对象
public DataSet getds(string M_str_sqlstr, string M_str_table)
{
SqlConnection sqlcon = this.getcon();
SqlDataAdapter sqlda = new SqlDataAdapter(M_str_sqlstr, sqlcon);
DataSet myds = new DataSet();
sqlda.Fill(myds, M_str_table);
return myds;
}

//创建SqlDataReader对象
public SqlDataReader getread(string M_str_sqlstr)
{
SqlConnection sqlcon = this.getcon();
SqlCommand sqlcom = new SqlCommand(M_str_sqlstr, sqlcon);
sqlcon.Open();
SqlDataReader sqlread = sqlcom.ExecuteReader(CommandBehavior.CloseConnection);
return sqlread;
}

}
}

将每一个步骤像如上一样写成公共方法,则就能随意的在各个模块进行调用,这不仅使得代码简洁明了,也有助于旁人阅读。另外,对变量的命名也需要有自己的命名规则,不然当变量很都得时候就会搞混。

有了上面的铺垫,可以按照上面的思路继续考虑可能用到的公共方法,其中,控件(比如下拉框)的数据绑定,正则表达式的判定算是最常用的,乘胜追击,立刻再写一个公共类,添加如下公共方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace BaseClass
{

class OperateAndValidate
{
BaseOperate boperate = new BaseOperate();// 声明BaseOperate类的一个对象,以调用其方法
//绑定COMBOBOX控件
public void cboxBind(string P_str_sqlstr, string P_str_table, string P_str_tbMember, ComboBox cbox)
{
DataSet myds = boperate.getds(P_str_sqlstr, P_str_table);
cbox.DataSource = myds.Tables[P_str_table];//将数据集中的表绑定到下拉框上
cbox.DisplayMember = P_str_tbMember;//将表中的具体的列所对应的值显示在下拉框中
}

//验证输入的字符串为数字
public bool validateNum(string P_str_num)
{
return Regex.IsMatch(P_str_num, "^[0-9]*$");
}
//验证输入的字符串为电话号码
public bool validatePhone(string P_str_phone)
{
return Regex.IsMatch(P_str_phone, @"\d{3,4}-\d{7,8}");
}
//验证输入的字符串为传真号码
public bool validateFax(string P_str_fax)
{
return Regex.IsMatch(P_str_fax, @"86-\d{2,3}-\d{7,8}");
}

//验证输入的字符串为邮编号码
public bool validatePostCode(string P_str_postcode)
{
return Regex.IsMatch(P_str_postcode, @"\d{6}");
}
#endregion

//验证输入的字符串为E-MAIL地址
public bool validateEmail(string P_str_email)
{
return Regex.IsMatch(P_str_email, @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");
}

//验证输入的字符串为网络地址
public bool validateNAddress(string P_str_naddress)
{
return Regex.IsMatch(P_str_naddress, @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
}

//自动编号
/// <summary>
/// 自动编号
/// </summary>
/// <param name="P_str_sqlstr">SQL语句</param>
/// <param name="P_str_table">数据表</param>
/// <param name="P_str_tbColumn">数据表字段</param>
/// <param name="P_str_codeIndex">编号前的字符串</param>
/// <param name="P_str_codeNum">编号后的数字</param>
/// <param name="txt">textBox控件名</param>
public void autoNum(string P_str_sqlstr, string P_str_table, string P_str_tbColumn, string P_str_codeIndex, string P_str_codeNum, TextBox txt)
{
string P_str_Code = "";
int P_int_Code = 0;
DataSet myds = boperate.getds(P_str_sqlstr, P_str_table);
if (myds.Tables[0].Rows.Count == 0)
{
txt.Text = P_str_codeIndex + P_str_codeNum;
}
else
{
P_str_Code = Convert.ToString(myds.Tables[0].Rows[myds.Tables[0].Rows.Count - 1][P_str_tbColumn]);//获取最后一行数据里的编号字段
P_int_Code = Convert.ToInt32(P_str_Code.Substring(1, 3)) + 1;//我的字段为"C101,C102....."
P_str_Code = P_str_codeIndex + P_int_Code.ToString();
txt.Text = P_str_Code;
}
}

}
}


在自动编号的公共方法里,提取字符串的格式各有不同,由于不知道有什么方法可以实现自增,只能用C101来进行自增(要是设置为C001要的话,按照上述方法,第二个就是C2了),这方法也就将就着能用吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: