MySqlProvider.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. using MySqlConnector;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Data.Common;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace SqlSugar
  11. {
  12. public class MySqlProvider : AdoProvider
  13. {
  14. public MySqlProvider() { }
  15. public override IDbConnection Connection
  16. {
  17. get
  18. {
  19. if (base._DbConnection == null)
  20. {
  21. try
  22. {
  23. var mySqlConnectionString = base.Context.CurrentConnectionConfig.ConnectionString;
  24. Check.ExceptionEasy(String.IsNullOrEmpty(mySqlConnectionString), "ConnectionString is not null", "连接字符串ConnectionString不能为Null");
  25. if (!mySqlConnectionString.ToLower().Contains("charset")&& !mySqlConnectionString.ToLower().Contains("character"))
  26. {
  27. mySqlConnectionString = mySqlConnectionString.Trim().TrimEnd(';') + ";charset=utf8;";
  28. }
  29. //if (!mySqlConnectionString.ToLower().Contains("min"))
  30. //{
  31. // mySqlConnectionString = mySqlConnectionString.Trim().TrimEnd(';') + ";min pool size=1";
  32. //}
  33. base._DbConnection = new MySqlConnection(mySqlConnectionString);
  34. }
  35. catch (Exception ex)
  36. {
  37. if (ex is SqlSugarException)
  38. {
  39. throw ex;
  40. }
  41. else
  42. {
  43. Check.Exception(true, ErrorMessage.ConnnectionOpen, ex.Message);
  44. }
  45. }
  46. }
  47. return base._DbConnection;
  48. }
  49. set
  50. {
  51. base._DbConnection = value;
  52. }
  53. }
  54. public override void BeginTran(string transactionName)
  55. {
  56. base.BeginTran();
  57. }
  58. /// <summary>
  59. /// Only SqlServer
  60. /// </summary>
  61. /// <param name="iso"></param>
  62. /// <param name="transactionName"></param>
  63. public override void BeginTran(IsolationLevel iso, string transactionName)
  64. {
  65. base.BeginTran(iso);
  66. }
  67. public override IDataAdapter GetAdapter()
  68. {
  69. return new MySqlDataAdapter();
  70. }
  71. public override DbCommand GetCommand(string sql, SugarParameter[] parameters)
  72. {
  73. MySqlCommand sqlCommand = new MySqlCommand(sql, (MySqlConnection)this.Connection);
  74. sqlCommand.CommandType = this.CommandType;
  75. sqlCommand.CommandTimeout = this.CommandTimeOut;
  76. if (this.Transaction != null)
  77. {
  78. sqlCommand.Transaction = (MySqlTransaction)this.Transaction;
  79. }
  80. if (parameters.HasValue())
  81. {
  82. IDataParameter[] ipars = ToIDbDataParameter(parameters);
  83. sqlCommand.Parameters.AddRange((MySqlParameter[])ipars);
  84. }
  85. CheckConnection();
  86. return sqlCommand;
  87. }
  88. public override void SetCommandToAdapter(IDataAdapter dataAdapter, DbCommand command)
  89. {
  90. ((MySqlDataAdapter)dataAdapter).SelectCommand = (MySqlCommand)command;
  91. }
  92. /// <summary>
  93. /// if mysql return MySqlParameter[] pars
  94. /// if sqlerver return SqlParameter[] pars ...
  95. /// </summary>
  96. /// <param name="parameters"></param>
  97. /// <returns></returns>
  98. public override IDataParameter[] ToIDbDataParameter(params SugarParameter[] parameters)
  99. {
  100. if (parameters == null || parameters.Length == 0) return null;
  101. MySqlParameter[] result = new MySqlParameter[parameters.Length];
  102. int index = 0;
  103. var isVarchar = this.Context.IsVarchar();
  104. foreach (var parameter in parameters)
  105. {
  106. if (parameter.Value == null) parameter.Value = DBNull.Value;
  107. var sqlParameter = new MySqlParameter();
  108. sqlParameter.ParameterName = parameter.ParameterName;
  109. sqlParameter.Size = parameter.Size;
  110. sqlParameter.Value = parameter.Value;
  111. sqlParameter.DbType = parameter.DbType;
  112. if (parameter.Direction == 0)
  113. {
  114. parameter.Direction = ParameterDirection.Input;
  115. }
  116. sqlParameter.Direction = parameter.Direction;
  117. //if (sqlParameter.Direction == 0)
  118. //{
  119. // sqlParameter.Direction = ParameterDirection.Input;
  120. //}
  121. result[index] = sqlParameter;
  122. if (sqlParameter.Direction.IsIn(ParameterDirection.Output, ParameterDirection.InputOutput, ParameterDirection.ReturnValue))
  123. {
  124. if (this.OutputParameters == null) this.OutputParameters = new List<IDataParameter>();
  125. this.OutputParameters.RemoveAll(it => it.ParameterName == sqlParameter.ParameterName);
  126. this.OutputParameters.Add(sqlParameter);
  127. }
  128. if (isVarchar && sqlParameter.DbType == System.Data.DbType.String)
  129. {
  130. sqlParameter.DbType = System.Data.DbType.AnsiString;
  131. }
  132. else if (parameter.DbType== System.Data.DbType.DateTimeOffset)
  133. {
  134. if(sqlParameter.Value != DBNull.Value)
  135. sqlParameter.Value = UtilMethods.ConvertFromDateTimeOffset((DateTimeOffset)sqlParameter.Value);
  136. sqlParameter.DbType = System.Data.DbType.DateTime;
  137. }
  138. if (sqlParameter.Value is DateTime&&sqlParameter.Value.ObjToDate()==DateTime.MinValue)
  139. {
  140. var date = Convert.ToDateTime(sqlParameter.Value);
  141. if (date == DateTime.MinValue)
  142. {
  143. sqlParameter.Value = UtilMethods.GetMinDate(this.Context.CurrentConnectionConfig);
  144. }
  145. }
  146. if (parameter.IsJson == false&& sqlParameter.Value!=null&& sqlParameter.Value is JArray)
  147. {
  148. sqlParameter.Value = sqlParameter.Value.ToString();
  149. }
  150. ++index;
  151. }
  152. return result;
  153. }
  154. protected override void SugarCatch(Exception ex, string sql, SugarParameter[] parameters)
  155. {
  156. base.SugarCatch(ex, sql, parameters);
  157. if (ex is NullReferenceException&&SugarCompatible.IsFramework)
  158. {
  159. Check.ExceptionEasy($"To upgrade the MySql.Data. Error:{ex.Message}", $" 请先升级MySql.Data 。 详细错误:{ex.Message}");
  160. }
  161. }
  162. #region async
  163. public async Task<DbCommand> GetCommandAsync(string sql, SugarParameter[] parameters)
  164. {
  165. MySqlCommand sqlCommand = new MySqlCommand(sql, (MySqlConnection)this.Connection);
  166. sqlCommand.CommandType = this.CommandType;
  167. sqlCommand.CommandTimeout = this.CommandTimeOut;
  168. if (this.Transaction != null)
  169. {
  170. sqlCommand.Transaction = (MySqlTransaction)this.Transaction;
  171. }
  172. if (parameters.HasValue())
  173. {
  174. IDataParameter[] ipars = ToIDbDataParameter(parameters);
  175. sqlCommand.Parameters.AddRange((MySqlParameter[])ipars);
  176. }
  177. if (this.Connection.State != ConnectionState.Open)
  178. {
  179. try
  180. {
  181. await (this.Connection as MySqlConnection).OpenAsync();
  182. }
  183. catch (Exception ex)
  184. {
  185. Check.Exception(true, ex.Message);
  186. }
  187. }
  188. return sqlCommand;
  189. }
  190. public override async Task<int> ExecuteCommandAsync(string sql, params SugarParameter[] parameters)
  191. {
  192. if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true)
  193. return await base.ExecuteCommandAsync(sql,parameters);
  194. try
  195. {
  196. Async();
  197. InitParameters(ref sql, parameters);
  198. if (FormatSql != null)
  199. sql = FormatSql(sql);
  200. SetConnectionStart(sql);
  201. if (this.ProcessingEventStartingSQL != null)
  202. ExecuteProcessingSQL(ref sql, ref parameters);
  203. ExecuteBefore(sql, parameters);
  204. var sqlCommand = await GetCommandAsync(sql, parameters);
  205. int count;
  206. if (this.CancellationToken == null)
  207. count = await sqlCommand.ExecuteNonQueryAsync();
  208. else
  209. count = await sqlCommand.ExecuteNonQueryAsync(this.CancellationToken.Value);
  210. if (this.IsClearParameters)
  211. sqlCommand.Parameters.Clear();
  212. ExecuteAfter(sql, parameters);
  213. sqlCommand.Dispose();
  214. return count;
  215. }
  216. catch (Exception ex)
  217. {
  218. CommandType = CommandType.Text;
  219. if (ErrorEvent != null)
  220. ExecuteErrorEvent(sql, parameters, ex);
  221. throw ex;
  222. }
  223. finally
  224. {
  225. if (this.IsAutoClose())
  226. {
  227. await this.CloseAsync();
  228. }
  229. SetConnectionEnd(sql);
  230. }
  231. }
  232. public override async Task<IDataReader> GetDataReaderAsync(string sql, params SugarParameter[] parameters)
  233. {
  234. if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true)
  235. return await base.GetDataReaderAsync(sql, parameters);
  236. try
  237. {
  238. Async();
  239. InitParameters(ref sql, parameters);
  240. if (FormatSql != null)
  241. sql = FormatSql(sql);
  242. SetConnectionStart(sql);
  243. var isSp = this.CommandType == CommandType.StoredProcedure;
  244. if (this.ProcessingEventStartingSQL != null)
  245. ExecuteProcessingSQL(ref sql, ref parameters);
  246. ExecuteBefore(sql, parameters);
  247. var sqlCommand = await GetCommandAsync(sql, parameters);
  248. DbDataReader sqlDataReader;
  249. if (this.CancellationToken == null)
  250. sqlDataReader = await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default);
  251. else
  252. sqlDataReader = await sqlCommand.ExecuteReaderAsync(this.IsAutoClose() ? CommandBehavior.CloseConnection : CommandBehavior.Default, this.CancellationToken.Value);
  253. if (isSp)
  254. DataReaderParameters = sqlCommand.Parameters;
  255. if (this.IsClearParameters)
  256. sqlCommand.Parameters.Clear();
  257. ExecuteAfter(sql, parameters);
  258. SetConnectionEnd(sql);
  259. if (SugarCompatible.IsFramework || this.Context.CurrentConnectionConfig.DbType != DbType.Sqlite)
  260. sqlCommand.Dispose();
  261. return sqlDataReader;
  262. }
  263. catch (Exception ex)
  264. {
  265. CommandType = CommandType.Text;
  266. if (ErrorEvent != null)
  267. ExecuteErrorEvent(sql, parameters, ex);
  268. throw ex;
  269. }
  270. }
  271. public override async Task<object> GetScalarAsync(string sql, params SugarParameter[] parameters)
  272. {
  273. if (this.Context.CurrentConnectionConfig?.SqlMiddle?.IsSqlMiddle == true)
  274. return await base.GetScalarAsync(sql, parameters);
  275. try
  276. {
  277. Async();
  278. InitParameters(ref sql, parameters);
  279. if (FormatSql != null)
  280. sql = FormatSql(sql);
  281. SetConnectionStart(sql);
  282. if (this.ProcessingEventStartingSQL != null)
  283. ExecuteProcessingSQL(ref sql, ref parameters);
  284. ExecuteBefore(sql, parameters);
  285. var sqlCommand = await GetCommandAsync(sql, parameters);
  286. object scalar;
  287. if (CancellationToken == null)
  288. scalar = await sqlCommand.ExecuteScalarAsync();
  289. else
  290. scalar = await sqlCommand.ExecuteScalarAsync(this.CancellationToken.Value);
  291. //scalar = (scalar == null ? 0 : scalar);
  292. if (this.IsClearParameters)
  293. sqlCommand.Parameters.Clear();
  294. ExecuteAfter(sql, parameters);
  295. sqlCommand.Dispose();
  296. return scalar;
  297. }
  298. catch (Exception ex)
  299. {
  300. CommandType = CommandType.Text;
  301. if (ErrorEvent != null)
  302. ExecuteErrorEvent(sql, parameters, ex);
  303. throw ex;
  304. }
  305. finally
  306. {
  307. if (this.IsAutoClose())
  308. {
  309. await this.CloseAsync();
  310. }
  311. SetConnectionEnd(sql);
  312. }
  313. }
  314. #endregion
  315. }
  316. }