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 }
来,纪念一下。