泛型连接数据库

这些天用泛型做了一个数据库的底层,自我感觉很方便,但是功能不是很完善,会继续考虑下去下面给大家分享一下代码

1数据库连接的帮助类


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

namespace DAL
{

public class DBHelper
{
/// <summary>
/// 从web.config中获得数据库连接字符串
/// </summary>
public static string Connstr = "Data Source=.;Initial Catalog=Pet;Integrated Security=True";

#region sql语句部分

/// <summary>
/// 执行sql语句返回DataTable
/// </summary>
/// <param name="sql">sql</param>
/// <returns>根据sql语句得到所有记录</returns>
public static DataTable GetDataTable(string sql)
{

using (SqlConnection conn = new SqlConnection(Connstr))
{

SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
DataTable dt = new DataTable();
sda.Fill(dt);
return dt;

}

}

/// <summary>
/// 执行带参数的sql语句返回DataTable
/// </summary>
/// <param name="sql">带参数的sql语句</param>
/// <param name="values">参数</param>
/// <returns>根据sql语句得到所有记录</returns>
public static DataTable GetDataTable(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
cmd.Parameters.AddRange(values);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
conn.Close();
return dt;
}

}

/// <summary>
/// 执行无参数的sql语句
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>影响的行数</returns>
public static int ExecuteCommand(string sql)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
int num = cmd.ExecuteNonQuery();
conn.Close();
return num;
}
}

/// <summary>
/// 执行有参数的sql语句
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="values">参数</param>
/// <returns>影响的行数</returns>
public static int ExecuteCommand(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(values);
conn.Open();
int num = Convert.ToInt32(cmd.ExecuteNonQuery());
conn.Close();
return num;
}
}
/// <summary>
/// 执行无参数的sql语句,返回首行首列
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>返回首行首列</returns>
public static object GetScalar(string sql)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
conn.Open();
object obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
}
/// <summary>
/// 执行有参数的sql语句,返回首行首列
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="values">参数,是否返回首行首列</param>
/// <returns>返回首行首列</returns>
public static object ExecuteScalar(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(values);
conn.Open();
object obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
}

/// <summary>
/// 带事务的执行多条sql语句
/// </summary>
/// <param name="sqls"></param>
/// <returns></returns>
//public static bool ExecuteCommandByTran(params ExecuteSql[] sqls)
//{

// using (SqlConnection conn = new SqlConnection(Connstr))
// {
// conn.Open();
// //为数据库连接打开事务
// SqlTransaction tran = conn.BeginTransaction();
// SqlCommand cmd = new SqlCommand();
// cmd.Connection = conn;
// //为命令对象指定要应用事务
// cmd.Transaction = tran;
// try
// {

// for (int i = 0; i < sqls.Length; i++)
// {
// cmd.CommandText = sqls[i].SqlString;
// cmd.Parameters.AddRange(sqls[i].Pars);
// cmd.ExecuteNonQuery();
// }

// //没有异常的情况下,提交事务
// tran.Commit();

// return true;
// }
// catch (Exception ex)
// {
// //事务滚回去
// tran.Rollback();

// return false;

// }
// finally
// {

// conn.Close();
// }

// }
//}

#endregion

#region 存储过程部分
/// <summary>
/// 执行sql语句返回DataTable
/// </summary>
/// <param name="sql">安全的sql语句</param>
/// <returns>根据sql语句得到所有记录</returns>
public static DataTable GetDataTableByProcedure(string sql)
{

using (SqlConnection conn = new SqlConnection(Connstr))
{

SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
conn.Close();
return dt;

}

}
/// <summary>
/// 执行带参数的sql语句返回DataTable
/// </summary>
/// <param name="sql">带参数的sql语句</param>
/// <param name="values">参数</param>
/// <returns>根据sql语句得到所有记录</returns>
public static DataTable GetDataTableByProcedure(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
//指定查询的方式使用存储过程
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
cmd.Parameters.AddRange(values);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sda.Fill(dt);
conn.Close();
return dt;
}

}

/// <summary>
/// 执行无参数的sql语句
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>影响的行数</returns>
public static int ExecuteCommandByProcedure(string sql)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
int num = cmd.ExecuteNonQuery();
conn.Close();
return num;
}
}

/// <summary>
/// 执行有参数的sql语句
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="values">参数</param>
/// <returns>影响的行数</returns>
public static int ExecuteCommandByProcedure(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
conn.Open();
int num = cmd.ExecuteNonQuery();
conn.Close();
return num;
}
}
/// <summary>
/// 执行无参数的sql语句,返回首行首列
/// </summary>
/// <param name="sql">sql语句</param>
/// <returns>返回首行首列</returns>
public static object GetScalarByProcedure(string sql)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
conn.Open();
object obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
}
/// <summary>
/// 执行有参数的sql语句,返回首行首列
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="values">参数,是否返回首行首列</param>
/// <returns>返回首行首列</returns>
public static object ExecuteScalarByProcedure(string sql, params SqlParameter[] values)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(values);
conn.Open();
object obj = cmd.ExecuteScalar();
conn.Close();
return obj;
}
}
#endregion

#region 帮助方法

//判断是否为主键
public static bool IsPrimaryKey(String columnName, String tableName)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
conn.Open();
SqlParameter[] parameters = new SqlParameter[3];
parameters[0] = new SqlParameter("@table_name", tableName);
parameters[1] = new SqlParameter("@table_owner", null);
parameters[2] = new SqlParameter("@table_qualifier", null);
SqlCommand comm = new SqlCommand();
//指定存储过程名称
comm.CommandText = "sp_pkeys";
comm.Connection = conn;
//声明执行命令的类型
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddRange(parameters);
SqlDataAdapter ad = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
ad.Fill(dt);
DataRowCollection drc = dt.Rows;
if (drc.Count == 0 || (drc[0]["COLUMN_NAME"].ToString().ToLower() != columnName.ToLower()))
return false;
else
return true;
}

}
//判断是否为外键
public static bool IsForeignKey(String columnName, String tableName)
{
using (SqlConnection conn = new SqlConnection(Connstr))
{
conn.Open();
SqlParameter[] parameters = new SqlParameter[3];
parameters[0] = new SqlParameter("@pktable_name", tableName);
parameters[1] = new SqlParameter("@pktable_owner", null);
parameters[2] = new SqlParameter("@pktable_qualifier", null);
SqlCommand comm = new SqlCommand();
//指定存储过程名称
comm.CommandText = "sp_fkeys";
comm.Connection = conn;
//声明执行命令的类型
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddRange(parameters);
SqlDataAdapter ad = new SqlDataAdapter(comm);
DataTable dt = new DataTable();
ad.Fill(dt);
DataRowCollection drc = dt.Rows;
if (drc.Count == 0 || (drc[0]["COLUMN_NAME"].ToString().ToLower() != columnName.ToLower()))
return false;
else
return true;
}

}
#endregion
}
}

2BaseDAL定义了一些主要的增删改查的方法因为只是开始做 所以只能是对单张表的操作


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
using Model;

namespace DAL
{
public abstract class BassDAL<T> where T : new()
{
//单表查询
public virtual List<T> GetAllModels()
{
List<T> tList = new List<T>();
string name = new T().GetType().Name;
string sqlStr = "select * from " + name;
DataTable dt = DBHelper.GetDataTable(sqlStr);

foreach (DataRow dr in dt.Rows)
{
T t = new T();
PropertyInfo[] proList = t.GetType().GetProperties();
foreach (PropertyInfo pi in proList)
{
string piName = pi.Name;
if (dt.Columns.Contains(piName))
{
if (!pi.CanWrite) continue;
object value = dr[piName];
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
tList.Add(t);
}
return tList;
}
//添加
public virtual bool AddModel(T model)
{
PropertyInfo[] proList = model.GetType().GetProperties();
string name = model.GetType().Name;
string sqlStr = "insert into " + name;
string filed = "(";
string values = " values (";

foreach (PropertyInfo pi in proList)
{
filed += pi.Name + ",";
values += "‘" + pi.GetValue(model, null).ToString() + "‘,";
}
filed = filed.Substring(0, filed.Length - 1) + ")";
values = values.Substring(0, values.Length - 1) + ")";
sqlStr = sqlStr + filed + values;
return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
}
//修改
public virtual bool UpdateModel(T model)
{
PropertyInfo[] proList = model.GetType().GetProperties();
string name = model.GetType().Name;
string sqlStr = "update " + name + " set ";
foreach (PropertyInfo pi in proList)
{
if (pi.GetValue(model, null) != null && DBHelper.IsPrimaryKey(pi.Name, name) == false)
{
sqlStr += pi.Name + "=‘" + pi.GetValue(model, null).ToString() + "‘,";
}
}
sqlStr = sqlStr.Substring(0, sqlStr.Length - 1);
foreach (PropertyInfo pi in proList)
{
if (pi.GetValue(model, null) != null && DBHelper.IsPrimaryKey(pi.Name, name) != false)
{
sqlStr += " where " + pi.Name + "=‘" + pi.GetValue(model, null).ToString() + "‘";
}
}
return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
}
//删除
public virtual bool DeleteModel(T model)
{
PropertyInfo[] proList = model.GetType().GetProperties();
string name = model.GetType().Name;
string sqlStr = "delete " + name + " where ";
foreach (PropertyInfo pi in proList)
{
if (pi.GetValue(model, null) != null)
{
if (DBHelper.IsPrimaryKey(pi.Name, name) != false)
{
sqlStr += pi.Name + "=‘" + pi.GetValue(model, null).ToString()+"‘";
}
}
}
return DBHelper.ExecuteCommand(sqlStr) != 0 ? true : false;
}
}
}

3使用BaseDAL

用实体类的DAL继承BaseDAL由于BaseDAL是一个泛型类所以要在继承的时候传入实体类即BassDAL<PetInfo>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;

namespace DAL
{
public class Pet:BassDAL<PetInfo>
{
}
}

4这样就可以使用了


using System;
using System.Collections;
using System.Configuration;
using System.Data;

using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;

using DAL;
using Model;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
PetInfo petinfo = new PetInfo
{
Id = 1,
};
new Pet().DeleteModel(petinfo);
this.GridView1.DataSource = new Pet().GetAllModels();
this.GridView1.DataBind();

}
}

有什么不足希望大家指出来,一起完善哈

泛型连接数据库,码迷,mamicode.com

时间: 2024-10-12 08:12:55

泛型连接数据库的相关文章

ADO.Net创建数据模型和数据访问类及泛型集合

数据模型和数据访问类:数据模型: 使用面向对象中的封装特性,将数据表中的行数据组成一个同样结构的对象,来单独使用: 数据访问类: 将某一个表的全部增删改查操作的方法写进去,方便统一管理和调用: 数据模型和数据访问类单独创建两个文件件单独放置,方便查看:注意:单独创建的问题件命名空间会自动更改,调用时需要引用命名空间,并且在创建类时第一步要把类的访问权限设置为公开的 创建一个数据库模型和一个数据库访问类,对学生信息表进行简单的操作 数据库信息表: create database netlx go

Struts2 连接数据库总结

了解MVC模式 MVC 是一种使用MVC                         Model View Controller模型-视图-控制器设计创建Web 应用程序的模式[1]  大一时的笔记:现在写成博客,有些知识点看到想笑哈哈,给刚学的看看吧!         Model 模型 表示应用程序核心 比如数据库记录列表 View 视图 显示数据 数据库记录 Controller 控制器 处理输入 写入数据库记录 MVC    模式同时提供了对HTMLCSS 和JavaScript 的完

Android新项目GBSS:第3篇 Tomcat连接数据库[天坑,耗了1天才过关]

搭建好了开发环境,设计好了数据库,接下来该连接数据库了,这一块细节也基本上忘光,只能求助于Google了,大天朝最近围墙建的越来越高,Google基本处于不可用状态,SBBD又只能用来搜广告,谁能拯救我等屌丝码农. 步骤1:将mysql-connector-java-5.1.34-bin.jar复制到$CATALINA_HOME/lib文件夹下.下表列出了MySQL JDBC官方驱动和MySQL Server的版本对应关系[突然发现:有时候上QQ只是为了截图] 步骤2:配置JNDI数据源和连接池

连接数据库,使用c3p0技术连接MySQL数据库

读取配置文件连接MySQL数据库 先确认已经导入了 mysql 的驱动包 db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/v20?useUnicode=true&characterEncoding=utf8 username=root password=123456 JdbcUtil.java package com.stu_mvc.utils; import java.io.File; imp

jdbc的连接数据库,使用PreparedStatement实现增删改查等接口

首先是连接,关闭资源等数据库操作 将连接数据库,关闭资源封装在JDBCUtils里 package jdbc.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JDBCUtils { //获取数据库连接函数 public static Connection getCo

.NET编程01(泛型)

一:Object 类型:一切类型的父类,通过继承,子类拥有父类一切属性和行为:任何父类出现的地方,都可以用子类来代替: 用一个方法来完成多个方法做的事 /// <summary>    /// 普通方法类    /// </summary>    public class CommonMethod    {        /// <summary>        /// 打印个int值        /// </summary>        /// <

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

2017年9月3日 Spring及Mybatis中连接数据库的不同方式

连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --> <!-- location:指定要读取的属性文件的位置及文件名. 注: classpath:表示依据类路径去查找 容器依据路径读取属性文件的内容, 并且将这些内容存放到Properties对象上 --> //数据库的登入数据文件 //文件名db.properties #db connectio

泛型2

万用字符(wildcard) 以动物Animal类为例,怎样才能创建出一种ArrayList<?>里面既可以保存ArrayList<Dog>,又可以保存ArrayList<Cat>? public void takeAnimals(ArrayList<? extends Animal> animals){  //泛型中extends同时代表继承和实现. for(Animal a : animals){ a.eat(); } } 我们可以这样调用该函数: Ar