zoukankan      html  css  js  c++  java
  • 数据库操作类

    现在做项目几乎都得用到数据库吧!我用的是Sql Server 2008,具体也没有怎么研究过相关的数据库,不过,平常用到的数据库操作很多,这样我就写了一个数据库的操作类,平常调用起来倒是挺方便的,拿出来给大家分享一下!

    具体是怎么写的很容易,每个方法都有一些简单的注释!

    View Code
    class DataBaseHelper
    {
    private string serverName;
    private string datebaseName;
    private string userName;
    private string password;

    /// <summary>
    /// 构造函数,传入一些连接数据库需要的参数
    /// </summary>
    /// <param name="serverName">数据库的网络地址</param>
    /// <param name="datebaseName">数据库名称</param>
    /// <param name="userName">数据库的用户名</param>
    /// <param name="password">数据库的密码</param>
    public DataBaseHelper(string serverName, string datebaseName, string userName, string password)
    {
    this.serverName = serverName;
    this.datebaseName = datebaseName;
    this.userName = userName;
    this.password = password;
    }

    /// <summary>
    /// 平常用到的数据库的连接信息放到这里,直接调用这个函数就可以了
    /// </summary>
    /// <returns>返回一个数据库连接</returns>
    public static DataBaseHelper GetHelper()
    {
    return new DataBaseHelper("127.0.0.1", "databaseName", "username", "password");
    }

    /// <summary>
    /// 得到一个数据库连接,在调用每个操作数据库函数时调用
    /// </summary>
    /// <param name="timeoutMins">连接超时时间,单位:分</param>
    /// <returns>返回一个可用的连接</returns>
    private SqlConnection getConnection(int timeoutMins)
    {
    return new SqlConnection(
    string.Format("server={0}; database={1}; uid={2}; pwd={3}; Connection Timeout={4};"
    , this.serverName, this.datebaseName, this.userName, this.password, timeoutMins * 60));
    }

    /// <summary>
    /// 执行数据库操作
    /// </summary>
    /// <param name="sqlStr">需要执行的数据库语句</param>
    /// <returns>执行结果</returns>
    public int ExecuteNonQuery(string sqlStr)
    {
    return ExecuteNonQuery(sqlStr, null);
    }

    /// <summary>
    /// 执行数据库操作
    /// </summary>
    /// <param name="sqlStr">数据库操作语句</param>
    /// <param name="list">传入的数据参数</param>
    /// <returns>返回操作结果</returns>
    public int ExecuteNonQuery(string sqlStr, List<SqlParameter> list)
    {
    SqlConnection sqlConn = getConnection(1);
    try
    {
    sqlConn.Open();
    SqlCommand sqlCom = new SqlCommand(sqlStr, sqlConn);
    sqlCom.CommandTimeout = 60 * 30;
    if (list != null)
    {
    foreach (SqlParameter s in list)
    {
    sqlCom.Parameters.AddWithValue(s.ParameterName, s.SqlValue);
    }
    }
    return sqlCom.ExecuteNonQuery();
    }
    catch
    {
    return -1;
    }
    finally
    {
    sqlConn.Close();
    }
    }

    /// <summary>
    /// 执行读取数据库操作
    /// </summary>
    /// <param name="sqlStr">数据库读取操作语句</param>
    /// <returns>返回一个reader</returns>
    public SqlDataReader ExecuteReader(string sqlStr)
    {
    return ExecuteReader(sqlStr, null);
    }

    /// <summary>
    /// 数据库读取操作
    /// </summary>
    /// <param name="sqlStr">数据库读取操作语句</param>
    /// <param name="parList">传入的操作语句参数</param>
    /// <returns>读取之后的reader</returns>
    public SqlDataReader ExecuteReader(string sqlStr, List<SqlParameter> parList)
    {
    SqlDataReader reader = null;
    SqlConnection sqlConn = getConnection(1);
    try
    {
    sqlConn.Open();
    SqlCommand sqlCom = new SqlCommand(sqlStr, sqlConn);
    sqlCom.CommandTimeout = 30 * 60;
    if (parList != null)
    {
    foreach (SqlParameter s in parList)
    {
    sqlCom.Parameters.AddWithValue(s.ParameterName, s.SqlValue);
    }
    }
    reader = sqlCom.ExecuteReader(CommandBehavior.CloseConnection);
    }
    catch
    {
    sqlConn.Close();
    }

    return reader;
    }

    /// <summary>
    /// 将datatable里面的数据加入到数据库中,每次操作数据1,2W为宜
    /// </summary>
    /// <param name="dataTable">需要添加到数据库的数据</param>
    public void AddToDatabase(DataTable dataTable)
    {
    SqlConnection conn = getConnection(1);
    try
    {
    conn.Open();
    SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(conn);
    sqlBulkCopy.DestinationTableName = dataTable.TableName;
    sqlBulkCopy.BulkCopyTimeout = 600;

    foreach (DataColumn item in dataTable.Columns)
    {
    sqlBulkCopy.ColumnMappings.Add(item.ColumnName, item.ColumnName);
    }

    sqlBulkCopy.WriteToServer(dataTable);
    sqlBulkCopy.Close();
    }
    catch (Exception ex) { Console.WriteLine(ex.Message); }
    finally
    {
    conn.Close();
    }
    }

    /// <summary>
    /// 查看数据库中表的数据量
    /// </summary>
    /// <param name="tableName">需要查看的数据表</param>
    /// <returns>count(*)</returns>
    public int GetRowCount(string tableName)
    {
    SqlDataReader reader = ExecuteReader("select rows from sysindexes where id = object_id('" + tableName + "') and indid in (0,1)");

    if (reader == null)
    return -1;

    reader.Read();
    return (int)reader["rows"];
    }
    }

    之后需要在写道这里的是,怎么用到这个里面的AddToDatabase这个方法,很简单,这个类就可以用到了

    View Code
    /// <summary>
    /// 测试类
    /// </summary>
    class Test
    {
    public int para1;
    public int para2;
    public int para3;
    public int para4;

    public static void AddToDB(Test[] data)
    {
    DataBaseHelper helper = DataBaseHelper.GetHelper();

    DataTable dataTable = GetTableSchema();
    for (int i = 0; i < data.Length; i++)
    {
    DataRow dataRow = dataTable.NewRow();
    dataRow["para1"] = data[i].para1;
    dataRow["para2"] = data[i].para2;
    dataRow["para3"] = data[i].para3;
    dataRow["para4"] = data[i].para4;
    dataTable.Rows.Add(dataRow);
    }
    helper.AddToDatabase(dataTable);
    dataTable.Clear();
    }

    private static DataTable GetTableSchema()
    {
    DataTable dt = new DataTable("Test");
    dt.Columns.Add("para1", typeof(int));
    dt.Columns.Add("para2", typeof(int));
    dt.Columns.Add("para3", typeof(int));
    dt.Columns.Add("para4", typeof(int));
    return dt;
    }
    }

    需要说一下经常遇到的问题:

    1,GetTableSchema这个函数中用到的dt.Columns.Add("para1", typeof(int));这里的类型很容易搞明白,这里的名字很让人不爽,她严格的要求,必须和你要添加的数据库表的字段名完全一致(区分大小写),否则就等着程序报bug吧!

    2,GetTableSchema还是在这个函数里面,如果在数据库里面制定了某一项有默认值,那么在这里面你认为添加这一项多余的话,可以省略。

    其他的要说的没有什么了,就这样!

    记在这里,分享给大家!



  • 相关阅读:
    常见总结
    手机号中间四位替换为****
    写给30岁之前的我
    顺序栈ADT简单的实现
    快速排序
    关于存储类的例子总结
    非有序的静态查找表的查找某个元素的算法
    有序的静态查找表的折半(二分)查找算法
    【项目】项目125
    【项目】项目132
  • 原文地址:https://www.cnblogs.com/pmars/p/2299551.html
Copyright © 2011-2022 走看看