Methods.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Text.RegularExpressions;
  7. namespace SqlSugar
  8. {
  9. public abstract partial class DbMaintenanceProvider : IDbMaintenance
  10. {
  11. #region DML
  12. public virtual List<string> GetProcList(string dbName)
  13. {
  14. return new List<string>();
  15. }
  16. public virtual List<string> GetDataBaseList(SqlSugarClient db)
  17. {
  18. return db.Ado.SqlQuery<string>(this.GetDataBaseSql);
  19. }
  20. public virtual List<string> GetDataBaseList()
  21. {
  22. return this.Context.Ado.SqlQuery<string>(this.GetDataBaseSql);
  23. }
  24. public virtual List<DbTableInfo> GetViewInfoList(bool isCache = true)
  25. {
  26. string cacheKey = "DbMaintenanceProvider.GetViewInfoList" + this.Context.CurrentConnectionConfig.ConfigId;
  27. cacheKey = GetCacheKey(cacheKey);
  28. var result = new List<DbTableInfo>();
  29. if (isCache)
  30. result = GetListOrCache<DbTableInfo>(cacheKey, this.GetViewInfoListSql);
  31. else
  32. result = this.Context.Ado.SqlQuery<DbTableInfo>(this.GetViewInfoListSql);
  33. foreach (var item in result)
  34. {
  35. item.DbObjectType = DbObjectType.View;
  36. }
  37. return result;
  38. }
  39. public virtual List<DbTableInfo> GetTableInfoList(bool isCache = true)
  40. {
  41. string cacheKey = "DbMaintenanceProvider.GetTableInfoList"+this.Context.CurrentConnectionConfig.ConfigId;
  42. cacheKey = GetCacheKey(cacheKey);
  43. var result = new List<DbTableInfo>();
  44. if (isCache)
  45. result = GetListOrCache<DbTableInfo>(cacheKey, this.GetTableInfoListSql);
  46. else
  47. result = this.Context.Ado.SqlQuery<DbTableInfo>(this.GetTableInfoListSql);
  48. foreach (var item in result)
  49. {
  50. item.DbObjectType = DbObjectType.Table;
  51. }
  52. return result;
  53. }
  54. public virtual List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
  55. {
  56. if (string.IsNullOrEmpty(tableName)) return new List<DbColumnInfo>();
  57. string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower() + this.Context.CurrentConnectionConfig.ConfigId;
  58. cacheKey = GetCacheKey(cacheKey);
  59. var sql = string.Format(this.GetColumnInfosByTableNameSql, tableName);
  60. if (isCache)
  61. return GetListOrCache<DbColumnInfo>(cacheKey, sql).GroupBy(it => it.DbColumnName).Select(it => it.First()).ToList();
  62. else
  63. return this.Context.Ado.SqlQuery<DbColumnInfo>(sql).GroupBy(it => it.DbColumnName).Select(it => it.First()).ToList();
  64. }
  65. public virtual List<string> GetIsIdentities(string tableName)
  66. {
  67. string cacheKey = "DbMaintenanceProvider.GetIsIdentities" + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower() + this.Context.CurrentConnectionConfig.ConfigId;
  68. cacheKey = GetCacheKey(cacheKey);
  69. return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () =>
  70. {
  71. var result = GetColumnInfosByTableName(tableName).Where(it => it.IsIdentity).ToList();
  72. return result.Select(it => it.DbColumnName).ToList();
  73. });
  74. }
  75. public virtual List<string> GetPrimaries(string tableName)
  76. {
  77. string cacheKey = "DbMaintenanceProvider.GetPrimaries" + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower() + this.Context.CurrentConnectionConfig.ConfigId;
  78. cacheKey = GetCacheKey(cacheKey);
  79. return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey, () =>
  80. {
  81. var result = GetColumnInfosByTableName(tableName).Where(it => it.IsPrimarykey).ToList();
  82. return result.Select(it => it.DbColumnName).ToList();
  83. });
  84. }
  85. public virtual List<string> GetIndexList(string tableName)
  86. {
  87. return new List<string>();
  88. }
  89. public virtual List<string> GetFuncList()
  90. {
  91. return new List<string>();
  92. }
  93. public virtual List<string> GetTriggerNames(string tableName)
  94. {
  95. return new List<string>();
  96. }
  97. public virtual List<string> GetDbTypes()
  98. {
  99. return new List<string>();
  100. }
  101. #endregion
  102. #region Check
  103. public virtual bool IsAnyTable(string tableName, bool isCache = true)
  104. {
  105. Check.Exception(string.IsNullOrEmpty(tableName), "IsAnyTable tableName is not null");
  106. tableName = this.SqlBuilder.GetNoTranslationColumnName(tableName);
  107. var tables = GetTableInfoList(isCache);
  108. if (tables == null) return false;
  109. else return tables.Any(it => it.Name.Equals(tableName, StringComparison.CurrentCultureIgnoreCase));
  110. }
  111. public virtual bool IsAnyColumn(string tableName, string columnName, bool isCache = true)
  112. {
  113. columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
  114. tableName = this.SqlBuilder.GetNoTranslationColumnName(tableName);
  115. var isAny = IsAnyTable(tableName,isCache);
  116. Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
  117. var columns = GetColumnInfosByTableName(tableName,isCache);
  118. if (columns.IsNullOrEmpty()) return false;
  119. return columns.Any(it => it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
  120. }
  121. public virtual bool IsPrimaryKey(string tableName, string columnName)
  122. {
  123. columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
  124. var isAny = IsAnyTable(tableName);
  125. Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
  126. var columns = GetColumnInfosByTableName(tableName);
  127. if (columns.IsNullOrEmpty()) return false;
  128. var result=columns.Any(it => it.IsPrimarykey == true && it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
  129. return result;
  130. }
  131. public virtual bool IsPrimaryKey(string tableName, string columnName,bool isCache=true)
  132. {
  133. columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
  134. var isAny = IsAnyTable(tableName, isCache);
  135. Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
  136. var columns = GetColumnInfosByTableName(tableName,isCache);
  137. if (columns.IsNullOrEmpty()) return false;
  138. var result = columns.Any(it => it.IsPrimarykey == true && it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
  139. return result;
  140. }
  141. public virtual bool IsIdentity(string tableName, string columnName)
  142. {
  143. columnName = this.SqlBuilder.GetNoTranslationColumnName(columnName);
  144. var isAny = IsAnyTable(tableName);
  145. Check.Exception(!isAny, string.Format("Table {0} does not exist", tableName));
  146. var columns = GetColumnInfosByTableName(tableName);
  147. if (columns.IsNullOrEmpty()) return false;
  148. return columns.Any(it => it.IsIdentity = true && it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase));
  149. }
  150. public virtual bool IsAnyConstraint(string constraintName)
  151. {
  152. return this.Context.Ado.GetInt("select object_id('" + constraintName + "')") > 0;
  153. }
  154. public virtual bool IsAnySystemTablePermissions()
  155. {
  156. this.Context.Ado.CheckConnection();
  157. string sql = this.CheckSystemTablePermissionsSql;
  158. try
  159. {
  160. var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
  161. this.Context.Ado.IsEnableLogEvent = false;
  162. this.Context.Ado.ExecuteCommand(sql);
  163. this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
  164. return true;
  165. }
  166. catch
  167. {
  168. return false;
  169. }
  170. }
  171. #endregion
  172. #region DDL
  173. public virtual bool DropIndex(string indexName)
  174. {
  175. indexName = this.SqlBuilder.GetNoTranslationColumnName(indexName);
  176. this.Context.Ado.ExecuteCommand($" DROP INDEX {indexName} ");
  177. return true;
  178. }
  179. public virtual bool DropView(string viewName)
  180. {
  181. viewName = this.SqlBuilder.GetNoTranslationColumnName(viewName);
  182. this.Context.Ado.ExecuteCommand($" DROP VIEW {viewName} ");
  183. return true;
  184. }
  185. public virtual bool DropFunction(string funcName)
  186. {
  187. funcName = this.SqlBuilder.GetNoTranslationColumnName(funcName);
  188. this.Context.Ado.ExecuteCommand($" DROP FUNCTION {funcName} ");
  189. return true;
  190. }
  191. public virtual bool DropProc(string procName)
  192. {
  193. procName = this.SqlBuilder.GetNoTranslationColumnName(procName);
  194. this.Context.Ado.ExecuteCommand($" DROP PROCEDURE {procName} ");
  195. return true;
  196. }
  197. /// <summary>
  198. ///by current connection string
  199. /// </summary>
  200. /// <param name="databaseDirectory"></param>
  201. /// <returns></returns>
  202. public virtual bool CreateDatabase(string databaseDirectory = null)
  203. {
  204. var seChar = Path.DirectorySeparatorChar.ToString();
  205. if (databaseDirectory.HasValue())
  206. {
  207. databaseDirectory = databaseDirectory.TrimEnd('\\').TrimEnd('/');
  208. }
  209. var databaseName= this.Context.Ado.Connection.Database;
  210. return CreateDatabase(databaseName,databaseDirectory);
  211. }
  212. /// <summary>
  213. /// by databaseName
  214. /// </summary>
  215. /// <param name="databaseName"></param>
  216. /// <param name="databaseDirectory"></param>
  217. /// <returns></returns>
  218. public virtual bool CreateDatabase(string databaseName, string databaseDirectory = null)
  219. {
  220. this.Context.Ado.ExecuteCommand(string.Format(CreateDataBaseSql, databaseName, databaseDirectory));
  221. return true;
  222. }
  223. public virtual bool AddPrimaryKey(string tableName, string columnName)
  224. {
  225. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  226. columnName = this.SqlBuilder.GetTranslationTableName(columnName);
  227. string sql = string.Format(this.AddPrimaryKeySql, tableName, string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName).Replace("-","_"), this.SqlBuilder.GetNoTranslationColumnName(columnName)), columnName);
  228. if ((tableName+columnName).Length>25 &&this.Context?.CurrentConnectionConfig?.MoreSettings?.MaxParameterNameLength > 0)
  229. {
  230. sql = string.Format(this.AddPrimaryKeySql, tableName, string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName).GetNonNegativeHashCodeString(), "Id"), columnName);
  231. }
  232. this.Context.Ado.ExecuteCommand(sql);
  233. return true;
  234. }
  235. public bool AddPrimaryKeys(string tableName, string[] columnNames)
  236. {
  237. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  238. var columnName = string.Join(",", columnNames);
  239. var pkName = string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), columnName.Replace(",","_"));
  240. if (pkName.Length > 25 && this.Context?.CurrentConnectionConfig?.MoreSettings?.MaxParameterNameLength > 0)
  241. {
  242. pkName = "PK_" + pkName.GetNonNegativeHashCodeString();
  243. }
  244. string sql = string.Format(this.AddPrimaryKeySql, tableName,pkName, columnName);
  245. this.Context.Ado.ExecuteCommand(sql);
  246. return true;
  247. }
  248. public bool AddPrimaryKeys(string tableName, string[] columnNames,string pkName)
  249. {
  250. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  251. var columnName = string.Join(",", columnNames);
  252. //var pkName = string.Format("PK_{0}_{1}", this.SqlBuilder.GetNoTranslationColumnName(tableName), columnName.Replace(",", "_"));
  253. string sql = string.Format(this.AddPrimaryKeySql, tableName, pkName, columnName);
  254. this.Context.Ado.ExecuteCommand(sql);
  255. return true;
  256. }
  257. public virtual bool AddColumn(string tableName, DbColumnInfo columnInfo)
  258. {
  259. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  260. var isAddNotNUll = columnInfo.IsNullable == false && columnInfo.DefaultValue.HasValue();
  261. if (isAddNotNUll)
  262. {
  263. columnInfo = this.Context.Utilities.TranslateCopy(columnInfo);
  264. columnInfo.IsNullable = true;
  265. }
  266. string sql = GetAddColumnSql(tableName, columnInfo);
  267. this.Context.Ado.ExecuteCommand(sql);
  268. if (isAddNotNUll)
  269. {
  270. if (columnInfo.TableName == null)
  271. {
  272. columnInfo.TableName= tableName;
  273. }
  274. var dtColums = this.Context.Queryable<object>().AS(columnInfo.TableName).Where("1=2")
  275. .Select(this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName)).ToDataTable().Columns.Cast<System.Data.DataColumn>();
  276. var dtColumInfo = dtColums.First(it => it.ColumnName.EqualCase(columnInfo.DbColumnName));
  277. var type = UtilMethods.GetUnderType(dtColumInfo.DataType);
  278. var value= type==UtilConstants.StringType?(object)"": Activator.CreateInstance(type);
  279. if (this.Context.CurrentConnectionConfig.DbType == DbType.Oracle)
  280. {
  281. value = columnInfo.DefaultValue;
  282. if (value.Equals(""))
  283. {
  284. value = "empty";
  285. }
  286. }
  287. var dt = new Dictionary<string, object>();
  288. dt.Add(columnInfo.DbColumnName, value);
  289. this.Context.Updateable(dt)
  290. .AS(tableName)
  291. .Where($"{this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName)} is null ").ExecuteCommand();
  292. columnInfo.IsNullable = false;
  293. UpdateColumn(tableName, columnInfo);
  294. }
  295. return true;
  296. }
  297. public virtual bool UpdateColumn(string tableName, DbColumnInfo column)
  298. {
  299. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  300. string sql = GetUpdateColumnSql(tableName, column);
  301. this.Context.Ado.ExecuteCommand(sql);
  302. return true;
  303. }
  304. public abstract bool CreateTable(string tableName, List<DbColumnInfo> columns, bool isCreatePrimaryKey = true);
  305. public virtual bool DropTable(string tableName)
  306. {
  307. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  308. this.Context.Ado.ExecuteCommand(string.Format(this.DropTableSql, tableName));
  309. return true;
  310. }
  311. public virtual bool DropTable(string[] tableName)
  312. {
  313. foreach (var item in tableName)
  314. {
  315. DropTable(item);
  316. }
  317. return true;
  318. }
  319. public virtual bool DropTable(Type[] tableEnittyTypes)
  320. {
  321. foreach (var item in tableEnittyTypes)
  322. {
  323. var tableName = this.Context.EntityMaintenance.GetTableName(item);
  324. DropTable(tableName);
  325. }
  326. return true;
  327. }
  328. public virtual bool DropTable<T>()
  329. {
  330. var tableName= this.Context.EntityMaintenance.GetTableName<T>();
  331. return DropTable(tableName);
  332. }
  333. public virtual bool DropTable<T,T2>()
  334. {
  335. DropTable<T>();
  336. DropTable<T2>();
  337. return true;
  338. }
  339. public virtual bool DropTable<T, T2,T3>()
  340. {
  341. DropTable<T>();
  342. DropTable<T2>();
  343. DropTable<T3>();
  344. return true;
  345. }
  346. public virtual bool DropTable<T, T2, T3,T4>()
  347. {
  348. DropTable<T>();
  349. DropTable<T2>();
  350. DropTable<T3>();
  351. DropTable<T4>();
  352. return true;
  353. }
  354. public virtual bool TruncateTable<T>()
  355. {
  356. this.Context.InitMappingInfo<T>();
  357. return this.TruncateTable(this.Context.EntityMaintenance.GetEntityInfo<T>().DbTableName);
  358. }
  359. public virtual bool TruncateTable<T,T2>()
  360. {
  361. TruncateTable<T>();
  362. TruncateTable<T2>();
  363. return true;
  364. }
  365. public virtual bool TruncateTable<T, T2,T3>()
  366. {
  367. TruncateTable<T>();
  368. TruncateTable<T2>();
  369. TruncateTable<T3>();
  370. return true;
  371. }
  372. public virtual bool TruncateTable<T, T2, T3,T4>()
  373. {
  374. TruncateTable<T>();
  375. TruncateTable<T2>();
  376. TruncateTable<T3>();
  377. TruncateTable<T4>();
  378. return true;
  379. }
  380. public virtual bool TruncateTable<T, T2, T3, T4,T5>()
  381. {
  382. TruncateTable<T>();
  383. TruncateTable<T2>();
  384. TruncateTable<T3>();
  385. TruncateTable<T4>();
  386. TruncateTable<T5>();
  387. return true;
  388. }
  389. public virtual bool DropColumn(string tableName, string columnName)
  390. {
  391. columnName = this.SqlBuilder.GetTranslationColumnName(columnName);
  392. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  393. this.Context.Ado.ExecuteCommand(string.Format(this.DropColumnToTableSql, tableName, columnName));
  394. return true;
  395. }
  396. public virtual bool DropConstraint(string tableName, string constraintName)
  397. {
  398. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  399. string sql = string.Format(this.DropConstraintSql, tableName, constraintName);
  400. this.Context.Ado.ExecuteCommand(sql);
  401. return true;
  402. }
  403. public virtual bool TruncateTable(string tableName)
  404. {
  405. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  406. this.Context.Ado.ExecuteCommand(string.Format(this.TruncateTableSql, tableName));
  407. return true;
  408. }
  409. public bool TruncateTable(params string[] tableNames)
  410. {
  411. foreach (var item in tableNames)
  412. {
  413. TruncateTable(item);
  414. }
  415. return true;
  416. }
  417. public bool TruncateTable(params Type[] tableEnittyTypes)
  418. {
  419. foreach (var item in tableEnittyTypes)
  420. {
  421. var name = this.Context.EntityMaintenance.GetTableName(item);
  422. TruncateTable(name);
  423. }
  424. return true;
  425. }
  426. public virtual bool BackupDataBase(string databaseName, string fullFileName)
  427. {
  428. var directory = FileHelper.GetDirectoryFromFilePath(fullFileName);
  429. if (!FileHelper.IsExistDirectory(directory))
  430. {
  431. FileHelper.CreateDirectory(directory);
  432. }
  433. this.Context.Ado.ExecuteCommand(string.Format(this.BackupDataBaseSql, databaseName, fullFileName));
  434. return true;
  435. }
  436. public virtual bool BackupTable(string oldTableName, string newTableName, int maxBackupDataRows = int.MaxValue)
  437. {
  438. oldTableName = this.SqlBuilder.GetTranslationTableName(oldTableName);
  439. newTableName = this.SqlBuilder.GetTranslationTableName(newTableName);
  440. string sql = string.Format(this.BackupTableSql, maxBackupDataRows, newTableName, oldTableName);
  441. this.Context.Ado.ExecuteCommand(sql);
  442. return true;
  443. }
  444. public virtual bool RenameColumn(string tableName, string oldColumnName, string newColumnName)
  445. {
  446. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  447. oldColumnName = this.SqlBuilder.GetTranslationColumnName(oldColumnName);
  448. newColumnName = this.SqlBuilder.GetTranslationColumnName(newColumnName);
  449. string sql = string.Format(this.RenameColumnSql, tableName, oldColumnName, newColumnName);
  450. this.Context.Ado.ExecuteCommand(sql);
  451. return true;
  452. }
  453. public virtual bool AddColumnRemark(string columnName, string tableName, string description)
  454. {
  455. string sql = string.Format(this.AddColumnRemarkSql, columnName, tableName, description);
  456. this.Context.Ado.ExecuteCommand(sql);
  457. return true;
  458. }
  459. public virtual bool DeleteColumnRemark(string columnName, string tableName)
  460. {
  461. string sql = string.Format(this.DeleteColumnRemarkSql, columnName, tableName);
  462. this.Context.Ado.ExecuteCommand(sql);
  463. return true;
  464. }
  465. public virtual bool IsAnyColumnRemark(string columnName, string tableName)
  466. {
  467. string sql = string.Format(this.IsAnyColumnRemarkSql, columnName, tableName);
  468. var dt=this.Context.Ado.GetDataTable(sql);
  469. return dt.Rows!=null&&dt.Rows.Count>0;
  470. }
  471. public virtual bool AddTableRemark(string tableName, string description)
  472. {
  473. string sql = string.Format(this.AddTableRemarkSql,tableName, description);
  474. this.Context.Ado.ExecuteCommand(sql);
  475. return true;
  476. }
  477. public virtual bool DeleteTableRemark(string tableName)
  478. {
  479. string sql = string.Format(this.DeleteTableRemarkSql,tableName);
  480. this.Context.Ado.ExecuteCommand(sql);
  481. return true;
  482. }
  483. public virtual bool IsAnyTableRemark(string tableName)
  484. {
  485. string sql = string.Format(this.IsAnyTableRemarkSql, tableName);
  486. var dt=this.Context.Ado.GetDataTable(sql);
  487. return dt.Rows != null && dt.Rows.Count > 0;
  488. }
  489. public virtual bool AddDefaultValue(string tableName, string columnName, string defaultValue)
  490. {
  491. if (defaultValue == "''")
  492. {
  493. defaultValue = "";
  494. }
  495. if (defaultValue.IsDate() && !AddDefaultValueSql.Contains("'{2}'"))
  496. {
  497. defaultValue = "'" + defaultValue + "'";
  498. }
  499. if (defaultValue != null && defaultValue.EqualCase("'current_timestamp'"))
  500. {
  501. defaultValue = defaultValue.TrimEnd('\'').TrimStart('\'');
  502. }
  503. if (defaultValue != null && defaultValue.EqualCase("'current_date'"))
  504. {
  505. defaultValue = defaultValue.TrimEnd('\'').TrimStart('\'');
  506. }
  507. string sql = string.Format(AddDefaultValueSql, tableName, columnName,defaultValue);
  508. this.Context.Ado.ExecuteCommand(sql);
  509. return true;
  510. }
  511. public virtual bool CreateIndex(string tableName, string[] columnNames, bool isUnique=false)
  512. {
  513. string sql = string.Format(CreateIndexSql,this.SqlBuilder.GetTranslationTableName(tableName),string.Join(",",columnNames.Select(it=>this.SqlBuilder.GetTranslationColumnName(it))), string.Join("_", columnNames) + this.Context.CurrentConnectionConfig.IndexSuffix, isUnique ? "UNIQUE" : "");
  514. sql = sql.Replace("_" + this.SqlBuilder.SqlTranslationLeft, "_");
  515. sql = sql.Replace( this.SqlBuilder.SqlTranslationRight+"_", "_");
  516. sql = sql.Replace(this.SqlBuilder.SqlTranslationLeft+ this.SqlBuilder.SqlTranslationLeft, this.SqlBuilder.SqlTranslationLeft);
  517. sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + this.SqlBuilder.SqlTranslationRight, this.SqlBuilder.SqlTranslationRight);
  518. this.Context.Ado.ExecuteCommand(sql);
  519. return true;
  520. }
  521. public virtual bool CreateUniqueIndex(string tableName, string[] columnNames)
  522. {
  523. string sql = string.Format(CreateIndexSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",", columnNames.Select(it => this.SqlBuilder.GetTranslationColumnName(it))), string.Join("_", columnNames) + this.Context.CurrentConnectionConfig.IndexSuffix + "_Unique","UNIQUE" );
  524. sql = sql.Replace("_" + this.SqlBuilder.SqlTranslationLeft, "_");
  525. sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + "_", "_");
  526. sql = sql.Replace(this.SqlBuilder.SqlTranslationLeft + this.SqlBuilder.SqlTranslationLeft, this.SqlBuilder.SqlTranslationLeft);
  527. sql = sql.Replace(this.SqlBuilder.SqlTranslationRight + this.SqlBuilder.SqlTranslationRight, this.SqlBuilder.SqlTranslationRight);
  528. this.Context.Ado.ExecuteCommand(sql);
  529. return true;
  530. }
  531. public virtual bool CreateIndex(string tableName, string[] columnNames, string IndexName, bool isUnique = false)
  532. {
  533. var include = "";
  534. if (IndexName.ToLower().Contains("{include:"))
  535. {
  536. include = Regex.Match(IndexName, @"\{include\:.+$").Value;
  537. IndexName = IndexName.Replace(include, "");
  538. if (include == null)
  539. {
  540. throw new Exception("include format error");
  541. }
  542. include = include.Replace("{include:", "").Replace("}", "");
  543. include = $"include({include})";
  544. }
  545. string sql = string.Format("CREATE {3} INDEX {2} ON {0}({1})"+ include, this.SqlBuilder.GetTranslationColumnName(tableName) , string.Join(",", columnNames), IndexName, isUnique ? "UNIQUE" : "");
  546. this.Context.Ado.ExecuteCommand(sql);
  547. return true;
  548. }
  549. public virtual bool IsAnyIndex(string indexName)
  550. {
  551. //string sql = string.Format(this.IsAnyIndexSql, indexName);
  552. string sql = string.Format(this.IsAnyIndexSql, indexName, this.Context.Ado.Connection.Database);
  553. return this.Context.Ado.GetInt(sql)>0;
  554. }
  555. public virtual bool AddRemark(EntityInfo entity)
  556. {
  557. var db = this.Context;
  558. var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
  559. foreach (var item in columns)
  560. {
  561. if (item.ColumnDescription != null)
  562. {
  563. //column remak
  564. if (db.DbMaintenance.IsAnyColumnRemark(item.DbColumnName, item.DbTableName))
  565. {
  566. db.DbMaintenance.DeleteColumnRemark(item.DbColumnName, item.DbTableName);
  567. db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
  568. }
  569. else
  570. {
  571. db.DbMaintenance.AddColumnRemark(item.DbColumnName, item.DbTableName, item.ColumnDescription);
  572. }
  573. }
  574. }
  575. //table remak
  576. if (entity.TableDescription != null)
  577. {
  578. if (db.DbMaintenance.IsAnyTableRemark(entity.DbTableName))
  579. {
  580. db.DbMaintenance.DeleteTableRemark(entity.DbTableName);
  581. db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
  582. }
  583. else
  584. {
  585. db.DbMaintenance.AddTableRemark(entity.DbTableName, entity.TableDescription);
  586. }
  587. }
  588. return true;
  589. }
  590. public virtual void AddIndex(EntityInfo entityInfo)
  591. {
  592. var db = this.Context;
  593. var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
  594. var indexColumns = columns.Where(it => it.IndexGroupNameList.HasValue()).ToList();
  595. if (indexColumns.HasValue())
  596. {
  597. var groups = indexColumns.SelectMany(it => it.IndexGroupNameList).GroupBy(it => it).Select(it=>it.Key).ToList();
  598. foreach (var item in groups)
  599. {
  600. var columnNames = indexColumns.Where(it => it.IndexGroupNameList.Any(i => i.Equals(item, StringComparison.CurrentCultureIgnoreCase))).Select(it=>it.DbColumnName).ToArray();
  601. var indexName = string.Format("Index_{0}_{1}"+this.Context.CurrentConnectionConfig.IndexSuffix,entityInfo.DbTableName, string.Join("_", columnNames));
  602. if (!IsAnyIndex(indexName))
  603. {
  604. CreateIndex(entityInfo.DbTableName, columnNames);
  605. }
  606. }
  607. }
  608. var uIndexColumns = columns.Where(it => it.UIndexGroupNameList.HasValue()).ToList();
  609. if (uIndexColumns.HasValue())
  610. {
  611. var groups = uIndexColumns.SelectMany(it => it.UIndexGroupNameList).GroupBy(it => it).Select(it => it.Key).ToList();
  612. foreach (var item in groups)
  613. {
  614. var columnNames = uIndexColumns.Where(it => it.UIndexGroupNameList.Any(i => i.Equals(item, StringComparison.CurrentCultureIgnoreCase))).Select(it => it.DbColumnName).ToArray();
  615. var indexName = string.Format("Index_{0}_{1}_Unique" + this.Context.CurrentConnectionConfig.IndexSuffix, entityInfo.DbTableName, string.Join("_", columnNames));
  616. if (!IsAnyIndex(indexName))
  617. {
  618. CreateUniqueIndex(entityInfo.DbTableName, columnNames);
  619. }
  620. }
  621. }
  622. }
  623. protected virtual bool IsAnyDefaultValue(string tableName, string columnName,List<DbColumnInfo> columns)
  624. {
  625. var defaultValue = columns.Where(it => it.DbColumnName.Equals(columnName, StringComparison.CurrentCultureIgnoreCase)).First().DefaultValue;
  626. return defaultValue.HasValue();
  627. }
  628. public virtual bool IsAnyDefaultValue(string tableName, string columnName)
  629. {
  630. return IsAnyDefaultValue(tableName, columnName, this.GetColumnInfosByTableName(tableName, false));
  631. }
  632. public virtual void AddDefaultValue(EntityInfo entityInfo)
  633. {
  634. var dbColumns=this.GetColumnInfosByTableName(entityInfo.DbTableName, false);
  635. var db = this.Context;
  636. var columns = entityInfo.Columns.Where(it => it.IsIgnore == false).ToList();
  637. foreach (var item in columns)
  638. {
  639. if (item.DefaultValue.HasValue())
  640. {
  641. if (!IsAnyDefaultValue(entityInfo.DbTableName,item.DbColumnName,dbColumns))
  642. {
  643. this.AddDefaultValue(entityInfo.DbTableName, item.DbColumnName, item.DefaultValue);
  644. }
  645. }
  646. }
  647. }
  648. public virtual bool RenameTable(string oldTableName, string newTableName)
  649. {
  650. string sql = string.Format(this.RenameTableSql, oldTableName,newTableName);
  651. this.Context.Ado.ExecuteCommand(sql);
  652. return true;
  653. }
  654. public virtual bool IsAnyProcedure(string procName) {
  655. string sql = string.Format(this.IsAnyProcedureSql, procName);
  656. return this.Context.Ado.GetInt(sql)>0;
  657. }
  658. #endregion
  659. #region Private
  660. public virtual List<DbTableInfo> GetSchemaTables(EntityInfo entityInfo)
  661. {
  662. return null;
  663. }
  664. protected List<T> GetListOrCache<T>(string cacheKey, string sql)
  665. {
  666. return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
  667. () =>
  668. {
  669. var isEnableLogEvent = this.Context.Ado.IsEnableLogEvent;
  670. this.Context.Ado.IsEnableLogEvent = false;
  671. var result = this.Context.Ado.SqlQuery<T>(sql);
  672. this.Context.Ado.IsEnableLogEvent = isEnableLogEvent;
  673. return result;
  674. });
  675. }
  676. protected virtual string GetCreateTableSql(string tableName, List<DbColumnInfo> columns)
  677. {
  678. List<string> columnArray = new List<string>();
  679. Check.Exception(columns.IsNullOrEmpty(), "No columns found ");
  680. foreach (var item in columns)
  681. {
  682. string columnName = this.SqlBuilder.GetTranslationTableName(item.DbColumnName);
  683. string dataType = item.DataType;
  684. string dataSize = GetSize(item);
  685. string nullType = item.IsNullable ? this.CreateTableNull : CreateTableNotNull;
  686. string primaryKey = null;
  687. string identity = item.IsIdentity ? this.CreateTableIdentity : null;
  688. string addItem = string.Format(this.CreateTableColumn, columnName, dataType, dataSize, nullType, primaryKey, identity);
  689. columnArray.Add(addItem);
  690. }
  691. string tableString = string.Format(this.CreateTableSql, this.SqlBuilder.GetTranslationTableName(tableName), string.Join(",\r\n", columnArray));
  692. return tableString;
  693. }
  694. protected virtual string GetAddColumnSql(string tableName, DbColumnInfo columnInfo)
  695. {
  696. string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
  697. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  698. string dataType = columnInfo.DataType;
  699. if (dataType.EqualCase("varchar")
  700. &&this.Context.CurrentConnectionConfig?.MoreSettings?.SqlServerCodeFirstNvarchar == true
  701. &&this.Context.CurrentConnectionConfig?.DbType == DbType.SqlServer)
  702. {
  703. dataType = "nvarchar";
  704. }
  705. string dataSize = GetSize(columnInfo);
  706. string nullType = columnInfo.IsNullable ? this.CreateTableNull : CreateTableNotNull;
  707. string primaryKey = null;
  708. string identity = null;
  709. string result = string.Format(this.AddColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
  710. return result;
  711. }
  712. protected virtual string GetUpdateColumnSql(string tableName, DbColumnInfo columnInfo)
  713. {
  714. string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
  715. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  716. string dataSize = GetSize(columnInfo);
  717. string dataType = columnInfo.DataType;
  718. string nullType = columnInfo.IsNullable ? this.CreateTableNull : CreateTableNotNull;
  719. string primaryKey = null;
  720. string identity = null;
  721. string result = string.Format(this.AlterColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
  722. return result;
  723. }
  724. protected virtual string GetCacheKey(string cacheKey)
  725. {
  726. return this.Context.CurrentConnectionConfig.DbType + "." + this.Context.Ado.Connection.Database + "." + cacheKey;
  727. }
  728. protected virtual string GetSize(DbColumnInfo item)
  729. {
  730. string dataSize = null;
  731. var isMax = item.Length > 4000 || item.Length == -1;
  732. if (isMax)
  733. {
  734. dataSize = item.Length > 0 ? string.Format("({0})", "max") : null;
  735. }
  736. else if (item.Length == 0 && item.DecimalDigits > 0)
  737. {
  738. item.Length = 10;
  739. dataSize = string.Format("({0},{1})", item.Length, item.DecimalDigits);
  740. }
  741. else if (item.Length > 0 && item.DecimalDigits == 0)
  742. {
  743. dataSize = item.Length > 0 ? string.Format("({0})", item.Length) : null;
  744. }
  745. else if (item.Length > 0 && item.DecimalDigits > 0)
  746. {
  747. dataSize = item.Length > 0 ? string.Format("({0},{1})", item.Length, item.DecimalDigits) : null;
  748. }
  749. return dataSize;
  750. }
  751. #endregion
  752. }
  753. }