电子药箱通讯服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DynamicParameters.cs 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace RDH.Data
  8. {
  9. public class DynamicParameters : IDynamicParameters
  10. {
  11. static Dictionary<Identity, Action<IDbCommand, object>> paramReaderCache = new Dictionary<Identity, Action<IDbCommand, object>>();
  12. Dictionary<string, ParamInfo> parameters = new Dictionary<string, ParamInfo>();
  13. List<object> templates;
  14. class ParamInfo
  15. {
  16. public string Name { get; set; }
  17. public object Value { get; set; }
  18. public ParameterDirection ParameterDirection { get; set; }
  19. public DbType? DbType { get; set; }
  20. public int? Size { get; set; }
  21. public IDbDataParameter AttachedParam { get; set; }
  22. }
  23. public DynamicParameters() { }
  24. public DynamicParameters(object template)
  25. {
  26. if (template != null)
  27. {
  28. AddDynamicParams(template);
  29. }
  30. }
  31. /// <summary>
  32. /// Append a whole object full of params to the dynamic
  33. /// EG: AddParams(new {A = 1, B = 2}) // will add property A and B to the dynamic
  34. /// </summary>
  35. /// <param name="param"></param>
  36. public void AddDynamicParams(
  37. #if CSHARP30
  38. object param
  39. #else
  40. dynamic param
  41. #endif
  42. )
  43. {
  44. object obj = param as object;
  45. if (obj != null)
  46. {
  47. templates = templates ?? new List<object>();
  48. templates.Add(obj);
  49. }
  50. }
  51. public void Add(
  52. #if CSHARP30
  53. string name, object value, DbType? dbType, ParameterDirection? direction, int? size
  54. #else
  55. string name, object value = null, DbType? dbType = null, ParameterDirection? direction = null, int? size = null
  56. #endif
  57. )
  58. {
  59. parameters[Clean(name)] = new ParamInfo() { Name = name, Value = value, ParameterDirection = direction ?? ParameterDirection.Input, DbType = dbType, Size = size };
  60. }
  61. static string Clean(string name)
  62. {
  63. if (!string.IsNullOrEmpty(name))
  64. {
  65. switch (name[0])
  66. {
  67. case '@':
  68. case ':':
  69. case '?':
  70. return name.Substring(1);
  71. }
  72. }
  73. return name;
  74. }
  75. void IDynamicParameters.AddParameters(IDbCommand command, Identity identity)
  76. {
  77. if (templates != null)
  78. {
  79. foreach (var template in templates)
  80. {
  81. var newIdent = identity.ForDynamicParameters(template.GetType());
  82. Action<IDbCommand, object> appender;
  83. lock (paramReaderCache)
  84. {
  85. if (!paramReaderCache.TryGetValue(newIdent, out appender))
  86. {
  87. appender = SqlMapper.CreateParamInfoGenerator(newIdent);
  88. paramReaderCache[newIdent] = appender;
  89. }
  90. }
  91. appender(command, template);
  92. }
  93. }
  94. foreach (var param in parameters.Values)
  95. {
  96. var p = command.CreateParameter();
  97. var val = param.Value;
  98. p.ParameterName = param.Name;
  99. p.Value = val ?? DBNull.Value;
  100. p.Direction = param.ParameterDirection;
  101. var s = val as string;
  102. if (s != null)
  103. {
  104. if (s.Length <= 4000)
  105. {
  106. p.Size = 4000;
  107. }
  108. }
  109. if (param.Size != null)
  110. {
  111. p.Size = param.Size.Value;
  112. }
  113. if (param.DbType != null)
  114. {
  115. p.DbType = param.DbType.Value;
  116. }
  117. command.Parameters.Add(p);
  118. param.AttachedParam = p;
  119. }
  120. }
  121. public T Get<T>(string name)
  122. {
  123. var val = parameters[Clean(name)].AttachedParam.Value;
  124. if (val == DBNull.Value)
  125. {
  126. if (default(T) != null)
  127. {
  128. throw new ApplicationException("Attempting to cast a DBNull to a non nullable type!");
  129. }
  130. return default(T);
  131. }
  132. return (T)val;
  133. }
  134. }
  135. }