SqlQueryHelper.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Data;
  2. using System.Data.Common;
  3. using System.Data.SqlClient;
  4. using System.Reflection;
  5. using Microsoft.EntityFrameworkCore;
  6. using Microsoft.EntityFrameworkCore.Infrastructure;
  7. namespace VberZero.Data;
  8. public static class SqlQueryHelper
  9. {
  10. public static IEnumerable<T> SqlQuery<T>(this DatabaseFacade facade, string sql, params object[] parameters) where T : class, new()
  11. {
  12. DataTable dt = SqlQuery(facade, sql, parameters);
  13. return dt.ToEnumerable<T>();
  14. }
  15. public static IEnumerable<T> ToEnumerable<T>(this DataTable dt) where T : class, new()
  16. {
  17. PropertyInfo[] propertyInfos = typeof(T).GetProperties();
  18. T[] ts = new T[dt.Rows.Count];
  19. int i = 0;
  20. foreach (DataRow row in dt.Rows)
  21. {
  22. T t = new T();
  23. foreach (PropertyInfo p in propertyInfos)
  24. {
  25. if (dt.Columns.IndexOf(p.Name) != -1 && row[p.Name] != DBNull.Value)
  26. p.SetValue(t, row[p.Name], null);
  27. }
  28. ts[i] = t;
  29. i++;
  30. }
  31. return ts;
  32. }
  33. public static DataTable SqlQuery(this DatabaseFacade facade, string sql, params object[] parameters)
  34. {
  35. DbCommand cmd = CreateCommand(facade, sql, out DbConnection conn, parameters);
  36. DbDataReader reader = cmd.ExecuteReader();
  37. DataTable dt = new DataTable();
  38. dt.Load(reader);
  39. reader.Close();
  40. conn.Close();
  41. return dt;
  42. }
  43. private static DbCommand CreateCommand(DatabaseFacade facade, string sql, out DbConnection dbConn, params object[] parameters)
  44. {
  45. DbConnection conn = facade.GetDbConnection();
  46. dbConn = conn;
  47. conn.Open();
  48. DbCommand cmd = conn.CreateCommand();
  49. if (facade.IsSqlServer())
  50. {
  51. cmd.CommandText = sql;
  52. CombineParams(ref cmd, parameters);
  53. }
  54. return cmd;
  55. }
  56. private static void CombineParams(ref DbCommand command, params object[] parameters)
  57. {
  58. if (parameters != null)
  59. {
  60. foreach (SqlParameter parameter in parameters)
  61. {
  62. if (!parameter.ParameterName.Contains("@"))
  63. parameter.ParameterName = $"@{parameter.ParameterName}";
  64. command.Parameters.Add(parameter);
  65. }
  66. }
  67. }
  68. }