SqlServerProvider.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Common;
  5. using Microsoft.Data.SqlClient;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Xml.Linq;
  10. namespace SqlSugar
  11. {
  12. public class SqlServerProvider : AdoProvider
  13. {
  14. public SqlServerProvider() { }
  15. public override IDbConnection Connection
  16. {
  17. get
  18. {
  19. if (base._DbConnection == null)
  20. {
  21. try
  22. {
  23. base._DbConnection = new SqlConnection(base.Context.CurrentConnectionConfig.ConnectionString);
  24. }
  25. catch (Exception ex)
  26. {
  27. Check.Exception(true, ErrorMessage.ConnnectionOpen, ex.Message);
  28. }
  29. }
  30. return base._DbConnection;
  31. }
  32. set
  33. {
  34. base._DbConnection = value;
  35. }
  36. }
  37. /// <summary>
  38. /// Only SqlServer
  39. /// </summary>
  40. /// <param name="transactionName"></param>
  41. public override void BeginTran(string transactionName)
  42. {
  43. CheckConnection();
  44. base.Transaction = ((SqlConnection)this.Connection).BeginTransaction(transactionName);
  45. }
  46. /// <summary>
  47. /// Only SqlServer
  48. /// </summary>
  49. /// <param name="iso"></param>
  50. /// <param name="transactionName"></param>
  51. public override void BeginTran(IsolationLevel iso, string transactionName)
  52. {
  53. CheckConnection();
  54. base.Transaction = ((SqlConnection)this.Connection).BeginTransaction(iso, transactionName);
  55. }
  56. public override IDataAdapter GetAdapter()
  57. {
  58. return new SqlDataAdapter();
  59. }
  60. public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
  61. {
  62. SqlCommand sqlCommand = new SqlCommand(sql, (SqlConnection)this.Connection);
  63. sqlCommand.CommandType = this.CommandType;
  64. sqlCommand.CommandTimeout = this.CommandTimeOut;
  65. if (this.Transaction != null)
  66. {
  67. sqlCommand.Transaction = (SqlTransaction)this.Transaction;
  68. }
  69. if (parameters.HasValue())
  70. {
  71. SqlParameter[] ipars = GetSqlParameter(parameters);
  72. sqlCommand.Parameters.AddRange(ipars);
  73. }
  74. CheckConnection();
  75. return sqlCommand;
  76. }
  77. public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command)
  78. {
  79. ((SqlDataAdapter)dataAdapter).SelectCommand = (SqlCommand)command;
  80. }
  81. /// <summary>
  82. /// if mysql return MySqlParameter[] pars
  83. /// if sqlerver return SqlParameter[] pars ...
  84. /// </summary>
  85. /// <param name="parameters"></param>
  86. /// <returns></returns>
  87. public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters)
  88. {
  89. if (parameters == null || parameters.Length == 0) return null;
  90. SqlParameter[] result = new SqlParameter[parameters.Length];
  91. int index = 0;
  92. foreach (var parameter in parameters)
  93. {
  94. if (parameter.Value == null) parameter.Value = DBNull.Value;
  95. var sqlParameter = new SqlParameter();
  96. sqlParameter.ParameterName = parameter.ParameterName;
  97. //sqlParameter.UdtTypeName = parameter.UdtTypeName;
  98. sqlParameter.Size = parameter.Size;
  99. sqlParameter.Value = parameter.Value;
  100. sqlParameter.DbType = parameter.DbType;
  101. sqlParameter.Direction = parameter.Direction;
  102. result[index] = sqlParameter;
  103. if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput,ParameterDirection.ReturnValue))
  104. {
  105. if (this.OutputParameters == null) this.OutputParameters = new List<IDataParameter>();
  106. this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName);
  107. this.OutputParameters.Add(sqlParameter);
  108. }
  109. ++index;
  110. }
  111. return result;
  112. }
  113. /// <summary>
  114. /// if mysql return MySqlParameter[] pars
  115. /// if sqlerver return SqlParameter[] pars ...
  116. /// </summary>
  117. /// <param name="parameters"></param>
  118. /// <returns></returns>
  119. public SqlParameter[] GetSqlParameter(params SugarParameter[] parameters)
  120. {
  121. var isVarchar = this.Context.IsVarchar();
  122. if (parameters == null || parameters.Length == 0) return null;
  123. SqlParameter[] result = new SqlParameter[parameters.Length];
  124. int index = 0;
  125. foreach (var parameter in parameters)
  126. {
  127. if (parameter.Value == null) parameter.Value = DBNull.Value;
  128. var sqlParameter = new SqlParameter();
  129. sqlParameter.ParameterName = parameter.ParameterName;
  130. //sqlParameter.UdtTypeName = parameter.UdtTypeName;
  131. sqlParameter.Size = parameter.Size;
  132. sqlParameter.Value = parameter.Value;
  133. sqlParameter.DbType = GetDbType(parameter);
  134. var isTime = parameter.DbType == System.Data.DbType.Time;
  135. if (isTime)
  136. {
  137. sqlParameter.SqlDbType = SqlDbType.Time;
  138. if (sqlParameter.Value != DBNull.Value)
  139. {
  140. sqlParameter.Value = DateTime.Parse(parameter.Value?.ToString()).TimeOfDay;
  141. }
  142. }
  143. else if (parameter.Value != null && parameter.Value is XElement)
  144. {
  145. sqlParameter.SqlDbType = SqlDbType.Xml;
  146. sqlParameter.Value = (parameter.Value as XElement).ToString();
  147. }
  148. if (sqlParameter.Value != null && sqlParameter.Value != DBNull.Value && sqlParameter.DbType == System.Data.DbType.DateTime)
  149. {
  150. var date = Convert.ToDateTime(sqlParameter.Value);
  151. if (date == DateTime.MinValue)
  152. {
  153. sqlParameter.Value = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  154. }
  155. }
  156. if (parameter.Direction == 0)
  157. {
  158. parameter.Direction = ParameterDirection.Input;
  159. }
  160. sqlParameter.Direction = parameter.Direction;
  161. result[index] = sqlParameter;
  162. if (parameter.TypeName.HasValue())
  163. {
  164. sqlParameter.TypeName = parameter.TypeName;
  165. sqlParameter.SqlDbType = SqlDbType.Structured;
  166. sqlParameter.DbType = System.Data.DbType.Object;
  167. }
  168. if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue))
  169. {
  170. if (this.OutputParameters == null) this.OutputParameters = new List<IDataParameter>();
  171. this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName);
  172. this.OutputParameters.Add(sqlParameter);
  173. }
  174. if (isVarchar && sqlParameter.DbType == System.Data.DbType.String)
  175. {
  176. sqlParameter.DbType = System.Data.DbType.AnsiString;
  177. }
  178. ++index;
  179. }
  180. return result;
  181. }
  182. private static System.Data.DbType GetDbType(SugarParameter parameter)
  183. {
  184. if (parameter.DbType==System.Data.DbType.UInt16)
  185. {
  186. return System.Data.DbType.Int16;
  187. }
  188. else if (parameter.DbType == System.Data.DbType.UInt32)
  189. {
  190. return System.Data.DbType.Int32;
  191. }
  192. else if (parameter.DbType == System.Data.DbType.UInt64)
  193. {
  194. return System.Data.DbType.Int64;
  195. }
  196. else
  197. {
  198. return parameter.DbType;
  199. }
  200. }
  201. }
  202. }