• Db


       1 /* Jonney Create 2013-8-12 */
       2 
       3 /*using System.Data.OracleClient;*/
       4 /*using System.Data.SQLite;*/
       5 /*using MySql.Data.MySqlClient;*/
       6 using System.Data.SqlClient;
       7 using System;
       8 using System.Collections.Generic;
       9 using System.ComponentModel;
      10 using System.Data;
      11 using System.Reflection;
      12 
      13 namespace Dade.DataCenter.CutBoard.Dal
      14 {
      15     public class SqlDataAccess : DataAccess
      16     {
      17         protected SqlDataAccess()
      18         {
      19             _databaseType = DatabaseType.SqlServer;
      20             _connString = ConnStr;
      21             _conn = new SqlConnection(_connString);
      22             _cmd = _conn.CreateCommand();
      23             _dataAdapter = new SqlDataAdapter();
      24             _dataAdapter.SelectCommand = _cmd;
      25         }
      26 
      27         public static string ConnStr { get; set; }
      28 
      29         public static DataAccess Instance
      30         {
      31             get { return new SqlDataAccess(); }
      32         }
      33     }
      34 
      35     public class OracleDataAccess : DataAccess
      36     {
      37         protected OracleDataAccess()
      38         {
      39             /*_databaseType = DatabaseType.Oracle;
      40             _connString = ConnStr;
      41             _conn = new OracleConnection(_connString);
      42             _cmd = _conn.CreateCommand();
      43             _dataAdapter = new OracleDataAdapter();
      44             _dataAdapter.SelectCommand = _cmd;
      45             _parameterChar = ":";*/
      46         }
      47 
      48         public static string ConnStr { get; set; }
      49         public static DataAccess Instance
      50         {
      51             get { return new OracleDataAccess(); }
      52         }
      53     }
      54 
      55     public class SqliteDataAccess : DataAccess
      56     {
      57         protected SqliteDataAccess()
      58         {
      59             /*_databaseType = DatabaseType.Sqlite;
      60             _connString = ConnStr;
      61             _conn = new SQLiteConnection(_connString);
      62             _cmd = _conn.CreateCommand();
      63             _dataAdapter = new SQLiteDataAdapter();
      64             _dataAdapter.SelectCommand = _cmd;*/
      65         }
      66 
      67         public static string ConnStr { get; set; }
      68         public static DataAccess Instance
      69         {
      70             get { return new SqliteDataAccess(); }
      71         }
      72     }
      73 
      74     public class MySqlDataAccess : DataAccess
      75     {
      76         protected MySqlDataAccess()
      77         {
      78             /*_databaseType = DatabaseType.Mysql;
      79             _connString = ConnStr;
      80             _conn = new MySqlConnection(_connString);
      81             _cmd = _conn.CreateCommand();
      82             _dataAdapter = new MySqlDataAdapter();
      83             _dataAdapter.SelectCommand = _cmd;*/
      84         }
      85 
      86         public static string ConnStr { get; set; }
      87         public static DataAccess Instance
      88         {
      89             get { return new MySqlDataAccess(); }
      90         }
      91 
      92     }
      93 
      94     /// <summary>
      95     /// 数据库类型
      96     /// </summary>
      97     public enum DatabaseType
      98     {
      99         SqlServer, Oracle, Mysql, Sqlite, PostgreSql, SqlCe, Access, Firebird
     100     }
     101 
     102     /// <summary>
     103     /// 通用数据库访问抽象类
     104     /// </summary>
     105     public abstract class DataAccess : IDisposable
     106     {
     107         protected DatabaseType _databaseType;
     108         protected string _connString;
     109         protected bool _useTransaction;
     110         protected IDbConnection _conn;
     111         protected IDbTransaction _transaction;
     112         protected IDbCommand _cmd;
     113         protected IDbDataAdapter _dataAdapter;
     114         protected string _parameterChar = "@";
     115 
     116         /// <summary>
     117         /// 根据数据库类型返回参数
     118         /// </summary>
     119         /// <param name="parameterName"></param>
     120         /// <param name="value"></param>
     121         /// <returns></returns>
     122         public IDbDataParameter GetParameter(string parameterName, object value)
     123         {
     124             try
     125             {
     126                 IDbDataParameter parameter = null;
     127                 switch (_databaseType)
     128                 {
     129                     case DatabaseType.SqlServer:
     130                         parameter = new SqlParameter(parameterName, value ?? DBNull.Value);
     131                         break;
     132                     /*case DatabaseType.Mysql:
     133                         parameter = new MySqlParameter(parameterName, value ?? DBNull.Value);
     134                         break;*/
     135                     /*case DatabaseType.Oracle:
     136                         parameter = new OracleParameter(parameterName, value ?? DBNull.Value);
     137                         break;*/
     138                     /*case DatabaseType.Sqlite:
     139                         parameter = new SQLiteParameter(parameterName, value ?? DBNull.Value);
     140                         break;*/
     141                     default:
     142                         throw new Exception("DataAccess-->DatabaseType-->GetParameter()-->Not Implement");
     143                 }
     144                 return parameter;
     145             }
     146             catch
     147             {
     148                 DoCatch();
     149                 throw;
     150             }
     151         }
     152 
     153         /// <summary>
     154         /// 异常处理
     155         /// </summary>
     156         protected void DoCatch()
     157         {
     158             if (_useTransaction && _transaction!=null && _transaction.Connection !=null)
     159             {
     160                 _transaction.Rollback();
     161                 _transaction.Dispose();
     162                 _transaction = null;
     163                 _useTransaction = false;
     164             }
     165             Close();
     166         }
     167 
     168         /// <summary>
     169         /// 获取是否使用事务
     170         /// </summary>
     171         public bool UseTransaction
     172         {
     173             get { return _useTransaction; }
     174         }
     175 
     176         /// <summary>
     177         /// 获取当前正在执行的事务
     178         /// </summary>
     179         public IDbTransaction Transaction
     180         {
     181             get { return _transaction; }
     182         }
     183 
     184         /// <summary>
     185         /// 获取或设置连接字符串
     186         /// </summary>
     187         public string ConnString
     188         {
     189             get { return _connString; }
     190             set
     191             {
     192                 _connString = value;
     193                 if (_conn != null && _conn.ConnectionString != value)
     194                 {
     195                     _conn.ConnectionString = _connString;
     196                 }
     197             }
     198         }
     199 
     200         /// <summary>
     201         /// Ping服务器IP
     202         /// </summary>
     203         /// <param name="ip">目标主机IP</param>
     204         /// <returns></returns>
     205         public static bool Ping(string ip)
     206         {
     207             try
     208             {
     209                 var p = new System.Net.NetworkInformation.Ping();
     210                 var options = new System.Net.NetworkInformation.PingOptions { DontFragment = true };
     211                 byte[] buffer = System.Text.Encoding.ASCII.GetBytes("Ping..");
     212                 const int timeout = 1000; // Timeout 时间,单位:毫秒
     213                 System.Net.NetworkInformation.PingReply reply = p.Send(ip, timeout, buffer, options);
     214                 return reply != null && reply.Status == System.Net.NetworkInformation.IPStatus.Success;
     215             }
     216             catch
     217             {
     218                 return false;
     219             }
     220         }
     221 
     222         /// <summary>
     223         /// 测试连接字符串
     224         /// </summary>
     225         /// <returns></returns>
     226         public bool TestConnect()
     227         {
     228             try
     229             {
     230                 Open();
     231                 Close();
     232                 return true;
     233             }
     234             catch
     235             {
     236                 DoCatch();
     237                 return false;
     238             }
     239         }
     240 
     241         /// <summary>
     242         /// 是否存在
     243         /// </summary>
     244         /// <param name="sql"></param>
     245         /// <param name="parameters"></param>
     246         /// <returns></returns>
     247         public bool Exists(string sql, params IDbDataParameter[] parameters)
     248         {
     249             var result = GetSingle(sql, parameters);
     250             if (result!=null && result!=DBNull.Value && result.ToString()!="0")
     251             {
     252                 return true;
     253             }
     254             return false;
     255         }
     256 
     257         /// <summary>
     258         /// 查询
     259         /// </summary>
     260         /// <param name="sql">查询语句</param>
     261         /// <returns></returns>
     262         public DataSet Query(string sql)
     263         {
     264             try
     265             {
     266                 DataSet ds = new DataSet();
     267                 _cmd.Connection = _conn;
     268                 _cmd.CommandType = CommandType.Text;
     269                 _cmd.CommandText = sql;
     270                 _cmd.Parameters.Clear();
     271                 _dataAdapter.SelectCommand = _cmd;
     272 
     273                 if (_useTransaction)
     274                 {
     275                     _dataAdapter.Fill(ds);
     276                 }
     277                 else
     278                 {
     279                     Open();
     280                     _dataAdapter.Fill(ds);
     281                     Close();
     282                 }
     283                 return ds;
     284             }
     285             catch
     286             {
     287                 DoCatch();
     288                 throw;
     289             }
     290         }
     291         
     292         /// <summary>
     293         /// 查询
     294         /// </summary>
     295         /// <param name="type">参数类型</param>
     296         /// <param name="sql">查询语句</param>
     297         /// <param name="parameters">参数列表</param>
     298         /// <returns></returns>
     299         public DataSet Query(CommandType type, string sql, params IDbDataParameter[] parameters)
     300         {
     301             try
     302             {
     303                 DataSet ds = new DataSet();
     304                 _cmd.Connection = _conn;
     305                 _cmd.CommandType = type;
     306                 _cmd.CommandText = sql;
     307                 _dataAdapter.SelectCommand = _cmd;
     308                 ReSetParameters(_cmd, parameters);
     309                 if (_useTransaction)
     310                 {
     311                     _dataAdapter.Fill(ds);
     312                 }
     313                 else
     314                 {
     315                     Open();
     316                     _dataAdapter.Fill(ds);
     317                     Close();
     318                 }
     319                 return ds;
     320             }
     321             catch
     322             {
     323                 DoCatch();
     324                 throw;
     325             }
     326         }
     327 
     328         /// <summary>
     329         /// 查询
     330         /// </summary>
     331         /// <param name="sql">查询语句</param>
     332         /// <param name="parameters">参数列表</param>
     333         /// <returns></returns>
     334         public DataSet Query(string sql, params IDbDataParameter[] parameters)
     335         {
     336             try
     337             {
     338                 DataSet ds = new DataSet();
     339                 _cmd.Connection = _conn;
     340                 _cmd.CommandType = CommandType.Text;
     341                 _cmd.CommandText = sql;
     342                 _dataAdapter.SelectCommand = _cmd;
     343                 ReSetParameters(_cmd, parameters);
     344                 if (_useTransaction)
     345                 {
     346                     _dataAdapter.Fill(ds);
     347                 }
     348                 else
     349                 {
     350                     Open();
     351                     _dataAdapter.Fill(ds);
     352                     Close();
     353                 }
     354                 return ds;
     355             }
     356             catch
     357             {
     358                 DoCatch();
     359                 throw;
     360             }
     361         }
     362 
     363         /// <summary>
     364         /// 返回T类型的实体
     365         /// </summary>
     366         /// <typeparam name="T"></typeparam>
     367         /// <param name="sql"></param>
     368         /// <param name="parameters"></param>
     369         /// <returns></returns>
     370         public T QuerySingle<T>(string sql, params IDbDataParameter[] parameters)
     371         {
     372             try
     373             {
     374                 DataSet ds = new DataSet();
     375                 _cmd.Connection = _conn;
     376                 _cmd.CommandType = CommandType.Text;
     377                 _cmd.CommandText = sql;
     378                 _dataAdapter.SelectCommand = _cmd;
     379                 ReSetParameters(_cmd, parameters);
     380                 if (_useTransaction)
     381                 {
     382                     _dataAdapter.Fill(ds);
     383                 }
     384                 else
     385                 {
     386                     Open();
     387                     _dataAdapter.Fill(ds);
     388                     Close();
     389                 }
     390                 if (ds.Tables.Count>0 && ds.Tables[0].Rows.Count>0)
     391                 {
     392                     return ds.Tables[0].Rows[0].ToEntity<T>();
     393                 }
     394                 return default(T);
     395             }
     396             catch
     397             {
     398                 DoCatch();
     399                 throw;
     400             }
     401         }
     402 
     403         /// <summary>
     404         /// 查询实体集合
     405         /// </summary>
     406         /// <typeparam name="T"></typeparam>
     407         /// <param name="sql"></param>
     408         /// <param name="parameters"></param>
     409         /// <returns></returns>
     410         public List<T> Query<T>(string sql, params IDbDataParameter[] parameters)
     411         {
     412             try
     413             {
     414                 DataSet ds = new DataSet();
     415                 _cmd.Connection = _conn;
     416                 _cmd.CommandType = CommandType.Text;
     417                 _cmd.CommandText = sql;
     418                 _dataAdapter.SelectCommand = _cmd;
     419                 ReSetParameters(_cmd, parameters);
     420                 if (_useTransaction)
     421                 {
     422                     _dataAdapter.Fill(ds);
     423                 }
     424                 else
     425                 {
     426                     Open();
     427                     _dataAdapter.Fill(ds);
     428                     Close();
     429                 }
     430                 if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
     431                 {
     432                     return ds.Tables[0].ToList<T>();
     433                 }
     434                 return null;
     435             }
     436             catch
     437             {
     438                 DoCatch();
     439                 throw;
     440             }
     441         }
     442 
     443         /// <summary>
     444         /// 查询
     445         /// </summary>
     446         /// <param name="cmd">IDbCommand</param>
     447         /// <param name="parameters">参数列表</param>
     448         /// <returns></returns>
     449         public DataSet Query(IDbCommand cmd, params IDbDataParameter[] parameters)
     450         {
     451             try
     452             {
     453                 DataSet ds = new DataSet();
     454                 cmd.Connection = _conn;
     455                 _dataAdapter.SelectCommand = cmd;
     456                 ReSetParameters(cmd, parameters);
     457                 if (_useTransaction)
     458                 {
     459                     _dataAdapter.Fill(ds);
     460                 }
     461                 else
     462                 {
     463                     Open();
     464                     _dataAdapter.Fill(ds);
     465                     Close();
     466                 }
     467                 return ds;
     468             }
     469             catch
     470             {
     471                 DoCatch();
     472                 throw;
     473             }
     474         }
     475 
     476         /// <summary>
     477         /// 执行sql
     478         /// </summary>
     479         /// <param name="sql"></param>
     480         /// <returns></returns>
     481         public int ExecuteSql(string sql)
     482         {
     483             try
     484             {
     485                 int result;
     486                 _cmd.CommandType = CommandType.Text;
     487                 _cmd.CommandText = sql;
     488                 _cmd.Connection = _conn;
     489                 _cmd.Parameters.Clear();
     490 
     491                 if (_useTransaction)
     492                 {
     493                     result = _cmd.ExecuteNonQuery();
     494                 }
     495                 else
     496                 {
     497                     Open();
     498                     result = _cmd.ExecuteNonQuery();
     499                     Close();
     500                 }
     501                 return result;
     502             }
     503             catch
     504             {
     505                 DoCatch();
     506                 throw;
     507             }
     508         }
     509 
     510         /// <summary>
     511         /// 执行不返回数据集的SQL/存储过程
     512         /// </summary>
     513         /// <param name="type">SQL类型</param>
     514         /// <param name="sql">SQL</param>
     515         /// <param name="parameters">参数列表</param>
     516         /// <returns>影响行数</returns>
     517         public int ExecuteSql(CommandType type, string sql, params IDbDataParameter[] parameters)
     518         {
     519             try
     520             {
     521                 int result;
     522                 _cmd.CommandType = type;
     523                 _cmd.CommandText = sql;
     524                 _cmd.Connection = _conn;
     525                 ReSetParameters(_cmd, parameters);
     526                 if (_useTransaction)
     527                 {
     528                     result = _cmd.ExecuteNonQuery();
     529                 }
     530                 else
     531                 {
     532                     Open();
     533                     result = _cmd.ExecuteNonQuery();
     534                     Close();
     535                 }
     536                 return result;
     537             }
     538             catch
     539             {
     540                 DoCatch();
     541                 throw;
     542             }
     543         }
     544 
     545         /// <summary>
     546         /// 执行不返回数据集的SQL
     547         /// </summary>
     548         /// <param name="sql">SQL</param>
     549         /// <param name="parameters">参数列表</param>
     550         /// <returns>影响行数</returns>
     551         public int ExecuteSql(string sql, params IDbDataParameter[] parameters)
     552         {
     553             try
     554             {
     555                 int result;
     556                 _cmd.CommandType = CommandType.Text;
     557                 _cmd.CommandText = sql;
     558                 _cmd.Connection = _conn;
     559                 ReSetParameters(_cmd, parameters);
     560                 if (_useTransaction)
     561                 {
     562                     result = _cmd.ExecuteNonQuery();
     563                 }
     564                 else
     565                 {
     566                     Open();
     567                     result = _cmd.ExecuteNonQuery();
     568                     Close();
     569                 }
     570                 return result;
     571             }
     572             catch
     573             {
     574                 DoCatch();
     575                 throw;
     576             }
     577         }
     578 
     579         /// <summary>
     580         /// 执行不返回数据集的SQL/存储过程
     581         /// </summary>
     582         /// <param name="cmd">IDbCommand</param>
     583         /// <param name="parameters">参数列表</param>
     584         /// <returns>影响行数</returns>
     585         public int ExecuteSql(IDbCommand cmd, params IDbDataParameter[] parameters)
     586         {
     587             try
     588             {
     589                 int result;
     590                 cmd.Connection = _conn;
     591                 ReSetParameters(cmd, parameters);
     592                 if (_useTransaction)
     593                 {
     594                     result = cmd.ExecuteNonQuery();
     595                 }
     596                 else
     597                 {
     598                     Open();
     599                     result = cmd.ExecuteNonQuery();
     600                     Close();
     601                 }
     602                 return result;
     603             }
     604             catch
     605             {
     606                 DoCatch();
     607                 throw;
     608             }
     609         }
     610 
     611         /// <summary>
     612         /// 返回首行首列
     613         /// </summary>
     614         /// <param name="sql"></param>
     615         /// <returns></returns>
     616         public object GetSingle(string sql)
     617         {
     618             try
     619             {
     620                 object result;
     621                 _cmd.CommandType = CommandType.Text;
     622                 _cmd.CommandText = sql;
     623                 _cmd.Connection = _conn;
     624                 _cmd.Parameters.Clear();
     625 
     626                 if (_useTransaction)
     627                     result = _cmd.ExecuteScalar();
     628                 else
     629                 {
     630                     Open();
     631                     result = _cmd.ExecuteScalar();
     632                     Close();
     633                 }
     634                 return result;
     635             }
     636             catch
     637             {
     638                 DoCatch();
     639                 throw;
     640             }
     641         }
     642 
     643         /// <summary>
     644         /// 返回首行首列
     645         /// </summary>
     646         /// <param name="type">sql类型</param>
     647         /// <param name="sql">查询语句</param>
     648         /// <param name="parameters">参数列表</param>
     649         /// <returns></returns>
     650         public object GetSingle(CommandType type, string sql, params IDbDataParameter[] parameters)
     651         {
     652             try
     653             {
     654                 object result;
     655                 _cmd.CommandType = type;
     656                 _cmd.CommandText = sql;
     657                 _cmd.Connection = _conn;
     658                 ReSetParameters(_cmd, parameters);
     659 
     660                 if (_useTransaction)
     661                     result = _cmd.ExecuteScalar();
     662                 else
     663                 {
     664                     Open();
     665                     result = _cmd.ExecuteScalar();
     666                     Close();
     667                 }
     668                 return result;
     669             }
     670             catch
     671             {
     672                 DoCatch();
     673                 throw;
     674             }
     675         }
     676 
     677         /// <summary>
     678         /// 返回首行首列
     679         /// </summary>
     680         /// <param name="sql">查询语句</param>
     681         /// <param name="parameters">参数列表</param>
     682         /// <returns></returns>
     683         public object GetSingle(string sql, params IDbDataParameter[] parameters)
     684         {
     685             try
     686             {
     687                 object result;
     688                 _cmd.CommandType = CommandType.Text;
     689                 _cmd.CommandText = sql;
     690                 _cmd.Connection = _conn;
     691                 ReSetParameters(_cmd, parameters);
     692 
     693                 if (_useTransaction)
     694                     result = _cmd.ExecuteScalar();
     695                 else
     696                 {
     697                     Open();
     698                     result = _cmd.ExecuteScalar();
     699                     Close();
     700                 }
     701                 return result;
     702             }
     703             catch
     704             {
     705                 DoCatch();
     706                 throw;
     707             }
     708         }
     709 
     710         /// <summary>
     711         /// 返回首行首列
     712         /// </summary>
     713         /// <param name="cmd">IDbCommand</param>
     714         /// <param name="parameters">参数列表</param>
     715         /// <returns></returns>
     716         public object GetSingle(IDbCommand cmd, params IDbDataParameter[] parameters)
     717         {
     718             try
     719             {
     720                 object result;
     721                 cmd.Connection = _conn;
     722                 ReSetParameters(cmd, parameters);
     723 
     724                 if (_useTransaction)
     725                     result = cmd.ExecuteScalar();
     726                 else
     727                 {
     728                     Open();
     729                     result = cmd.ExecuteScalar();
     730                     Close();
     731                 }
     732                 return result;
     733             }
     734             catch
     735             {
     736                 DoCatch();
     737                 throw;
     738             }
     739         }
     740 
     741         /// <summary>
     742         /// 返回Reader
     743         /// </summary>
     744         /// <param name="sql"></param>
     745         /// <returns></returns>
     746         public IDataReader CreateReader(string sql)
     747         {
     748             try
     749             {
     750                 IDataReader reader;
     751                 _cmd.CommandType = CommandType.Text;
     752                 _cmd.CommandText = sql;
     753                 _cmd.Connection = _conn;
     754                 _cmd.Parameters.Clear();
     755 
     756                 if (_useTransaction)
     757                     reader = _cmd.ExecuteReader();
     758                 else
     759                 {
     760                     Open();
     761                     reader = _cmd.ExecuteReader();
     762                 }
     763                 return reader;
     764             }
     765             catch
     766             {
     767                 DoCatch();
     768                 throw;
     769             }
     770         }
     771 
     772         /// <summary>
     773         /// 返回Reader,注意:一定要结束时手动关闭Reader、Connection
     774         /// </summary>
     775         /// <param name="type">sql类型</param>
     776         /// <param name="sql">查询语句</param>
     777         /// <param name="parameters">参数列表</param>
     778         /// <returns></returns>
     779         public IDataReader CreateReader(CommandType type, string sql, params IDbDataParameter[] parameters)
     780         {
     781             try
     782             {
     783                 IDataReader reader;
     784                 _cmd.CommandType = type;
     785                 _cmd.CommandText = sql;
     786                 _cmd.Connection = _conn;
     787                 ReSetParameters(_cmd, parameters);
     788 
     789                 if (_useTransaction)
     790                     reader = _cmd.ExecuteReader();
     791                 else
     792                 {
     793                     Open();
     794                     reader = _cmd.ExecuteReader();
     795                 }
     796                 return reader;
     797             }
     798             catch
     799             {
     800                 DoCatch();
     801                 throw;
     802             }
     803         }
     804 
     805         /// <summary>
     806         /// 返回Reader,注意:一定要结束时手动关闭Reader、Connection
     807         /// </summary>
     808         /// <param name="sql">查询语句</param>
     809         /// <param name="parameters">参数列表</param>
     810         /// <returns></returns>
     811         public IDataReader CreateReader(string sql, params IDbDataParameter[] parameters)
     812         {
     813             try
     814             {
     815                 IDataReader reader;
     816                 _cmd.CommandType = CommandType.Text;
     817                 _cmd.CommandText = sql;
     818                 _cmd.Connection = _conn;
     819                 ReSetParameters(_cmd, parameters);
     820 
     821                 if (_useTransaction)
     822                     reader = _cmd.ExecuteReader();
     823                 else
     824                 {
     825                     Open();
     826                     reader = _cmd.ExecuteReader();
     827                 }
     828                 return reader;
     829             }
     830             catch
     831             {
     832                 DoCatch();
     833                 throw;
     834             }
     835         }
     836 
     837         private void ReSetParameters(IDbCommand cmd, params IDbDataParameter[] parameters)
     838         {
     839             cmd.Parameters.Clear();
     840             if (parameters != null && parameters.Length > 0)
     841             {
     842                 for (int i = 0; i < parameters.Length; i++)
     843                 {
     844                     cmd.Parameters.Add(parameters[i]);
     845                 }
     846             }
     847         }
     848 
     849         /// <summary>
     850         /// 关闭Connection
     851         /// </summary>
     852         public void CloseReader()
     853         {
     854             CommitTransaction();
     855         }
     856 
     857         /// <summary>
     858         /// 创建和Connection(Open状态)相关联的cmd(sql预编译过)
     859         /// </summary>
     860         /// <param name="sql"></param>
     861         /// <returns></returns>
     862         public IDbCommand CreateCommand(string sql)
     863         {
     864             try
     865             {
     866                 Open();
     867                 IDbCommand dbCommand = _conn.CreateCommand();
     868                 dbCommand.Transaction = _transaction;
     869                 dbCommand.CommandText = sql;
     870                 dbCommand.Prepare();
     871                 return dbCommand;
     872             }
     873             catch
     874             {
     875                 DoCatch();
     876                 throw;
     877             }
     878         }
     879 
     880         /// <summary>
     881         /// 开始事务
     882         /// </summary>
     883         /// <returns></returns>
     884         public bool BeginTransaction()
     885         {
     886             try
     887             {
     888                 Open();
     889                 _transaction = _conn.BeginTransaction();
     890                 _cmd.Transaction = _transaction;
     891                 _useTransaction = true;
     892                 return true;
     893             }
     894             catch
     895             {
     896                 DoCatch();
     897                 throw;
     898             }
     899         }
     900 
     901         /// <summary>
     902         /// 提交事务
     903         /// </summary>
     904         /// <returns></returns>
     905         public bool CommitTransaction()
     906         {
     907             try
     908             {
     909                 if (_transaction != null && _transaction.Connection != null)
     910                 {
     911                     _transaction.Commit();
     912                     _transaction.Dispose();
     913                     _transaction = null;
     914                 }
     915                 Close();
     916                 _cmd.Transaction = null;
     917                 _useTransaction = false;
     918                 return true;
     919             }
     920             catch
     921             {
     922                 DoCatch();
     923                 throw;
     924             }
     925         }
     926 
     927         /// <summary>
     928         /// 回滚事务
     929         /// </summary>
     930         /// <returns></returns>
     931         public bool RollBackTransaction()
     932         {
     933             try
     934             {
     935                 if (_transaction != null && _transaction.Connection != null)
     936                 {
     937                     _transaction.Rollback();
     938                     _transaction.Dispose();
     939                     _transaction = null;
     940                 }
     941                 Close();
     942                 _cmd.Transaction = null;
     943                 _useTransaction = false;
     944                 return true;
     945             }
     946             catch
     947             {
     948                 DoCatch();
     949                 throw;
     950             }
     951         }
     952 
     953         /// <summary>
     954         /// 打开数据库
     955         /// </summary>
     956         protected void Open()
     957         {
     958             if (_conn != null && _conn.State != ConnectionState.Open)
     959             {
     960                 _conn.Open();
     961             }
     962         }
     963 
     964         /// <summary>
     965         /// 关闭数据库
     966         /// </summary>
     967         protected void Close()
     968         {
     969             if (_conn != null && _conn.State != ConnectionState.Closed)
     970             {
     971                 _conn.Close();
     972             }
     973         }
     974 
     975         /// <summary>
     976         /// 释放资源
     977         /// </summary>
     978         public void Dispose()
     979         {
     980             if (_transaction != null && _transaction.Connection != null)
     981             {
     982                 _transaction.Rollback();
     983                 _transaction.Dispose();
     984                 _transaction = null;
     985             }
     986             if (_cmd !=null)
     987             {
     988                 _cmd.Dispose();
     989                 _cmd = null;
     990             }
     991             Close();
     992             if (_conn != null)
     993             {
     994                 _conn.Dispose();
     995                 _conn = null;
     996             }
     997         }
     998 
     999         /// <summary>
    1000         /// 向数据库插入实体对象
    1001         /// </summary>
    1002         /// <param name="entity">实体对象</param>
    1003         /// <param name="ignoreProperties">忽略映射的属性</param>
    1004         /// <returns></returns>
    1005         public int Insert(object entity, params string[] ignoreProperties)
    1006         {
    1007             return ExecuteSql(MakeInsertSql(entity, ignoreProperties), MakeInsertParameters(entity, ignoreProperties));
    1008         }
    1009 
    1010         /// <summary>
    1011         /// 更新实体
    1012         /// </summary>
    1013         /// <param name="entity"></param>
    1014         /// <param name="keys"></param>
    1015         /// <returns></returns>
    1016         public int Update(object entity, params string[] keys)
    1017         {
    1018             return ExecuteSql(MakeUpdateSql(entity, keys), MakeUpdateParameters(entity));
    1019         }
    1020 
    1021         /// <summary>
    1022         /// 生产Insert语句--带参数
    1023         /// </summary>
    1024         /// <param name="obj">实体对象</param>
    1025         /// <param name="ignoreProperties">忽略自曾的属性</param>
    1026         /// <returns></returns>
    1027         private string MakeInsertSql(object obj, params string[] ignoreProperties)
    1028         {
    1029             var insertHeader = string.Format("Insert Into {0} (", obj.GetType().Name);
    1030             var insertBody = ") Values(";
    1031             var pro = new List<string>();
    1032             pro.AddRange(ignoreProperties);
    1033             foreach (PropertyInfo info in obj.GetType().GetProperties())
    1034             {
    1035                 if (pro.Count > 0 && pro.Contains(info.Name))
    1036                     continue;
    1037                 insertHeader += info.Name + ",";
    1038                 insertBody += _parameterChar + info.Name + ",";
    1039             }
    1040             insertHeader = insertHeader.Substring(0, insertHeader.Length - 1);
    1041             insertBody = insertBody.Substring(0, insertBody.Length - 1) + ")";
    1042             return insertHeader + insertBody;
    1043         }
    1044 
    1045         /// <summary>
    1046         /// 为update产生sql脚本
    1047         /// </summary>
    1048         /// <param name="obj"></param>
    1049         /// <param name="keys"></param>
    1050         /// <returns></returns>
    1051         private string MakeUpdateSql(object obj, params string[] keys)
    1052         {
    1053             var updateHeader = string.Format("Update {0} set", obj.GetType().Name);
    1054             var updateWhere = " where 1=1";
    1055             var pro = new List<string>();
    1056             pro.AddRange(keys);
    1057             foreach (PropertyInfo info in obj.GetType().GetProperties())
    1058             {
    1059                 if (pro.Count > 0 && pro.Contains(info.Name))
    1060                 {
    1061                     updateWhere += " and " + info.Name + "=" + _parameterChar + info.Name;
    1062                     continue;
    1063                 }
    1064                 if (updateHeader.EndsWith("set"))
    1065                     updateHeader += " " + info.Name + "=" + _parameterChar + info.Name;
    1066                 else
    1067                     updateHeader += ", " + info.Name + "=" + _parameterChar + info.Name;
    1068             }
    1069             return updateHeader + updateWhere;
    1070         }
    1071 
    1072         /// <summary>
    1073         /// 生产Insert参数
    1074         /// </summary>
    1075         /// <param name="obj">实体对象</param>
    1076         /// <param name="ignoreProperties">忽略自曾的属性</param>
    1077         /// <returns></returns>
    1078         private IDbDataParameter[] MakeInsertParameters(object obj, params string[] ignoreProperties)
    1079         {
    1080             var parameters = new List<IDbDataParameter>();
    1081             var pro = new List<string>();
    1082             pro.AddRange(ignoreProperties);
    1083             foreach (PropertyInfo info in obj.GetType().GetProperties())
    1084             {
    1085                 if (pro.Count > 0 && pro.Contains(info.Name))
    1086                     continue;
    1087                 object temp = info.GetValue(obj, null);
    1088                 parameters.Add(GetParameter(_parameterChar + info.Name, temp ?? DBNull.Value));
    1089             }
    1090             return parameters.ToArray();
    1091         }
    1092 
    1093         /// <summary>
    1094         /// 为update产生sql参数
    1095         /// </summary>
    1096         /// <param name="obj"></param>
    1097         /// <returns></returns>
    1098         private IDbDataParameter[] MakeUpdateParameters(object obj)
    1099         {
    1100             var parameters = new List<IDbDataParameter>();
    1101             foreach (PropertyInfo info in obj.GetType().GetProperties())
    1102             {
    1103                 object temp = info.GetValue(obj, null);
    1104                 parameters.Add(GetParameter(_parameterChar + info.Name, temp ?? DBNull.Value));
    1105             }
    1106             return parameters.ToArray();
    1107         }
    1108         
    1109     }
    1110 
    1111 
    1112     /// <summary>
    1113     /// DataTable和Entity的转换工具
    1114     /// </summary>
    1115     public static class DataTableUtility
    1116     {
    1117         /// <summary>
    1118         /// DataTable To IList
    1119         /// </summary>
    1120         /// <typeparam name="T"></typeparam>
    1121         /// <param name="dt"></param>
    1122         /// <returns></returns>
    1123         public static List<T> ToList<T>(this DataTable dt)
    1124         {
    1125             if (dt == null || dt.Rows.Count == 0) return null;
    1126             var list = new List<T>();
    1127             foreach (DataRow row in dt.Rows)
    1128             {
    1129                 T obj = row.ToEntity<T>();
    1130                 list.Add(obj);
    1131             }
    1132             return list;
    1133         }
    1134 
    1135         /// <summary>
    1136         /// DataRow To T
    1137         /// </summary>
    1138         public static T ToEntity<T>(this DataRow row)
    1139         {
    1140             Type objType = typeof (T);
    1141             T obj = Activator.CreateInstance<T>();
    1142 
    1143             foreach (DataColumn column in row.Table.Columns)
    1144             {
    1145                 PropertyInfo property = objType.GetProperty(column.ColumnName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
    1146                 if (property == null || !property.CanWrite)
    1147                 {
    1148                     continue;
    1149                 }
    1150                 object value = row[column.ColumnName];
    1151                 if (value == DBNull.Value) value = null;
    1152 
    1153                 property.SetValue(obj, value, null);
    1154 
    1155             }
    1156             return obj;
    1157         }
    1158 
    1159         /// <summary>
    1160         /// List To DataTable
    1161         /// </summary>
    1162         /// <typeparam name="T"></typeparam>
    1163         /// <param name="list"></param>
    1164         /// <returns></returns>
    1165         public static DataTable ToDataTable<T>(this List<T> list)
    1166         {
    1167             try
    1168             {
    1169                 Type objType = typeof (T);
    1170                 DataTable dataTable = new DataTable(objType.Name);
    1171                 if (list != null ? list.Count > 0 : false)
    1172                 {
    1173                     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(objType);
    1174                     foreach (PropertyDescriptor property in properties)
    1175                     {
    1176                         Type propertyType = property.PropertyType;
    1177 
    1178                         //nullables must use underlying types
    1179                         if (propertyType.IsGenericType && propertyType.GetGenericTypeDefinition() == typeof (Nullable<>))
    1180                             propertyType = Nullable.GetUnderlyingType(propertyType);
    1181                         //enums also need special treatment
    1182                         if (propertyType.IsEnum)
    1183                             propertyType = Enum.GetUnderlyingType(propertyType); //probably Int32
    1184 
    1185                         dataTable.Columns.Add(property.Name, propertyType);
    1186                     }
    1187 
    1188                     foreach (T li in list)
    1189                     {
    1190                         DataRow row = dataTable.NewRow();
    1191                         foreach (PropertyDescriptor property1 in properties)
    1192                         {
    1193                             row[property1.Name] = property1.GetValue(li) ?? DBNull.Value; //can't use null
    1194                         }
    1195                         dataTable.Rows.Add(row);
    1196 
    1197                     }
    1198                 }
    1199                 return dataTable;
    1200             }
    1201             catch
    1202             {
    1203                 return null;
    1204             }
    1205         }
    1206     }
    1207 
    1208 }

    来,纪念一下。

  • 相关阅读:
    第一天,用诗遇见
    13计本班人工智能第二次作业
    第一次人工智能作业
    陈林 130702010048
    人工智能第一次作业
    第二次作业
    人工智能第一次作业
    软件工程(2019)结对编程第二次作业
    软件工程(2019)结对编程第一次作业
    软件工程(2019)第二次作业
  • 原文地址:https://www.cnblogs.com/jonney-wang/p/7101224.html
Copyright © 2020-2023  润新知