DbBindProvider.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. public abstract partial class DbBindProvider : DbBindAccessory, IDbBind
  11. {
  12. #region Properties
  13. public virtual SqlSugarProvider Context { get; set; }
  14. public abstract List<KeyValuePair<string, CSharpDataType>> MappingTypes { get; }
  15. #endregion
  16. #region Public methods
  17. public virtual string GetDbTypeName(string csharpTypeName)
  18. {
  19. if (csharpTypeName == UtilConstants.ByteArrayType.Name)
  20. return "varbinary";
  21. if (csharpTypeName.ToLower() == "int32")
  22. csharpTypeName = "int";
  23. if (csharpTypeName.ToLower() == "int16")
  24. csharpTypeName = "short";
  25. if (csharpTypeName.ToLower() == "int64")
  26. csharpTypeName = "long";
  27. if (csharpTypeName.ToLower().IsIn("boolean", "bool"))
  28. csharpTypeName = "bool";
  29. if (csharpTypeName == "DateTimeOffset")
  30. csharpTypeName = "DateTime";
  31. var mappings = this.MappingTypes.Where(it => it.Value.ToString().Equals(csharpTypeName, StringComparison.CurrentCultureIgnoreCase)).ToList();
  32. if (mappings!=null&&mappings.Count>0)
  33. return mappings.First().Key;
  34. else
  35. return "varchar";
  36. }
  37. public string GetCsharpTypeName(string dbTypeName)
  38. {
  39. var mappings = this.MappingTypes.Where(it => it.Key == dbTypeName);
  40. return mappings.HasValue() ? mappings.First().Key : "string";
  41. }
  42. public string GetCsharpTypeNameByDbTypeName(string dbTypeName)
  43. {
  44. var mappings = this.MappingTypes.Where(it => it.Key == dbTypeName);
  45. if (mappings == null || mappings.Count() == 0)
  46. {
  47. return "string";
  48. }
  49. var result = mappings.First().Value.ObjToString();
  50. return result;
  51. }
  52. public virtual string GetConvertString(string dbTypeName)
  53. {
  54. string result = string.Empty;
  55. switch (dbTypeName.ToLower())
  56. {
  57. #region Int
  58. case "int":
  59. result = "Convert.ToInt32";
  60. break;
  61. #endregion
  62. #region String
  63. case "nchar":
  64. case "char":
  65. case "ntext":
  66. case "nvarchar":
  67. case "varchar":
  68. case "text":
  69. result = "Convert.ToString";
  70. break;
  71. #endregion
  72. #region Long
  73. case "bigint":
  74. result = "Convert.ToInt64";
  75. break;
  76. #endregion
  77. #region Bool
  78. case "bit":
  79. result = "Convert.ToBoolean";
  80. break;
  81. #endregion
  82. #region Datetime
  83. case "timestamp":
  84. case "smalldatetime":
  85. case "datetime":
  86. case "date":
  87. case "datetime2":
  88. result = "Convert.ToDateTime";
  89. break;
  90. #endregion
  91. #region Decimal
  92. case "smallmoney":
  93. case "single":
  94. case "numeric":
  95. case "money":
  96. case "decimal":
  97. result = "Convert.ToDecimal";
  98. break;
  99. #endregion
  100. #region Double
  101. case "float":
  102. result = "Convert.ToSingle";
  103. break;
  104. case "double":
  105. result = "Convert.ToDouble";
  106. break;
  107. #endregion
  108. #region Byte[]
  109. case "varbinary":
  110. case "binary":
  111. case "image":
  112. result = "byte[]";
  113. break;
  114. #endregion
  115. #region Float
  116. case "real":
  117. result = "Convert.ToSingle";
  118. break;
  119. #endregion
  120. #region Short
  121. case "smallint":
  122. result = "Convert.ToInt16";
  123. break;
  124. #endregion
  125. #region Byte
  126. case "tinyint":
  127. result = "Convert.ToByte";
  128. break;
  129. #endregion
  130. #region Guid
  131. case "uniqueidentifier":
  132. result = "Guid.Parse";
  133. break;
  134. #endregion
  135. #region Null
  136. default:
  137. result = null;
  138. break;
  139. #endregion
  140. }
  141. return result;
  142. }
  143. public virtual string GetPropertyTypeName(string dbTypeName)
  144. {
  145. dbTypeName = dbTypeName.ToLower();
  146. var propertyTypes = MappingTypes.Where(it => it.Key.Equals(dbTypeName, StringComparison.CurrentCultureIgnoreCase));
  147. if (dbTypeName == "int32")
  148. {
  149. return "int";
  150. }
  151. else if (dbTypeName == "int64")
  152. {
  153. return "long";
  154. }
  155. else if (dbTypeName == "int16")
  156. {
  157. return "short";
  158. }
  159. else if (propertyTypes == null)
  160. {
  161. return "other";
  162. }
  163. else if (dbTypeName.IsContainsIn("xml", "string", "String"))
  164. {
  165. return "string";
  166. }
  167. else if (dbTypeName.IsContainsIn("boolean", "bool"))
  168. {
  169. return "bool";
  170. }
  171. else if (propertyTypes == null || propertyTypes.Count() == 0)
  172. {
  173. return "object";
  174. }
  175. else if (propertyTypes.First().Value == CSharpDataType.byteArray)
  176. {
  177. return "byte[]";
  178. }
  179. else
  180. {
  181. return propertyTypes.First().Value.ToString();
  182. }
  183. }
  184. public virtual List<T> DataReaderToList<T>(Type type, IDataReader dataReader)
  185. {
  186. using (dataReader)
  187. {
  188. if (type.Name.StartsWith("KeyValuePair"))
  189. {
  190. return GetKeyValueList<T>(type, dataReader);
  191. }
  192. else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType)
  193. {
  194. return GetValueTypeList<T>(type, dataReader);
  195. }
  196. else if (type.IsArray)
  197. {
  198. return GetArrayList<T>(type, dataReader);
  199. }
  200. else
  201. {
  202. return GetEntityList<T>(Context, dataReader);
  203. }
  204. }
  205. }
  206. public virtual async Task<List<T>> DataReaderToListAsync<T>(Type type, IDataReader dataReader)
  207. {
  208. using (dataReader)
  209. {
  210. if (type.Name.StartsWith("KeyValuePair"))
  211. {
  212. return await GetKeyValueListAsync<T>(type, dataReader);
  213. }
  214. else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType)
  215. {
  216. return await GetValueTypeListAsync<T>(type, dataReader);
  217. }
  218. else if (type.IsArray)
  219. {
  220. return await GetArrayListAsync<T>(type, dataReader);
  221. }
  222. else
  223. {
  224. return await GetEntityListAsync<T>(Context, dataReader);
  225. }
  226. }
  227. }
  228. public virtual List<T> DataReaderToListNoUsing<T>(Type type, IDataReader dataReader)
  229. {
  230. if (type.Name.StartsWith("KeyValuePair"))
  231. {
  232. return GetKeyValueList<T>(type, dataReader);
  233. }
  234. else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType)
  235. {
  236. return GetValueTypeList<T>(type, dataReader);
  237. }
  238. else if (type.IsArray)
  239. {
  240. return GetArrayList<T>(type, dataReader);
  241. }
  242. else
  243. {
  244. return GetEntityList<T>(Context, dataReader);
  245. }
  246. }
  247. public virtual Task<List<T>> DataReaderToListNoUsingAsync<T>(Type type, IDataReader dataReader)
  248. {
  249. if (type.Name.StartsWith("KeyValuePair"))
  250. {
  251. return GetKeyValueListAsync<T>(type, dataReader);
  252. }
  253. else if (type.IsValueType() || type == UtilConstants.StringType || type == UtilConstants.ByteArrayType)
  254. {
  255. return GetValueTypeListAsync<T>(type, dataReader);
  256. }
  257. else if (type.IsArray)
  258. {
  259. return GetArrayListAsync<T>(type, dataReader);
  260. }
  261. else
  262. {
  263. return GetEntityListAsync<T>(Context, dataReader);
  264. }
  265. }
  266. #endregion
  267. #region Throw rule
  268. public virtual List<string> IntThrow
  269. {
  270. get
  271. {
  272. return new List<string>() { "datetime", "byte" };
  273. }
  274. }
  275. public virtual List<string> ShortThrow
  276. {
  277. get
  278. {
  279. return new List<string>() { "datetime", "guid" };
  280. }
  281. }
  282. public virtual List<string> DecimalThrow
  283. {
  284. get
  285. {
  286. return new List<string>() { "datetime", "byte", "guid" };
  287. }
  288. }
  289. public virtual List<string> DoubleThrow
  290. {
  291. get
  292. {
  293. return new List<string>() { "datetime", "byte", "guid" };
  294. }
  295. }
  296. public virtual List<string> DateThrow
  297. {
  298. get
  299. {
  300. return new List<string>() { "int32", "decimal", "double", "byte", "guid" };
  301. }
  302. }
  303. public virtual List<string> GuidThrow
  304. {
  305. get
  306. {
  307. return new List<string>() { "int32", "datetime", "decimal", "double", "byte" };
  308. }
  309. }
  310. public virtual List<string> StringThrow
  311. {
  312. get
  313. {
  314. return new List<string>() { "int32", "datetime", "decimal", "double", "byte" };
  315. }
  316. }
  317. #endregion
  318. }
  319. }