OracleDbMaintenance.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Common;
  5. using System.Linq;
  6. using System.Text;
  7. namespace SqlSugar
  8. {
  9. public class OracleDbMaintenance : DbMaintenanceProvider
  10. {
  11. #region DML
  12. protected override string GetDataBaseSql
  13. {
  14. get
  15. {
  16. throw new NotSupportedException();
  17. }
  18. }
  19. protected override string GetColumnInfosByTableNameSql
  20. {
  21. get
  22. {
  23. throw new NotSupportedException();
  24. }
  25. }
  26. protected override string GetTableInfoListSql
  27. {
  28. get
  29. {
  30. return @"SELECT table_name name ,
  31. (select COMMENTS from user_tab_comments where t.table_name=table_name ) as Description
  32. from user_tables t where
  33. table_name!='HELP'
  34. AND table_name NOT LIKE '%$%'
  35. AND table_name NOT LIKE 'LOGMNRC_%'
  36. AND table_name!='LOGMNRP_CTAS_PART_MAP'
  37. AND table_name!='LOGMNR_LOGMNR_BUILDLOG'
  38. AND table_name!='SQLPLUS_PRODUCT_PROFILE'
  39. ";
  40. }
  41. }
  42. protected override string GetViewInfoListSql
  43. {
  44. get
  45. {
  46. return @"select view_name name from user_views
  47. WHERE VIEW_name NOT LIKE '%$%'
  48. AND VIEW_NAME !='PRODUCT_PRIVS'
  49. AND VIEW_NAME NOT LIKE 'MVIEW_%' ";
  50. }
  51. }
  52. #endregion
  53. #region DDL
  54. protected override string IsAnyIndexSql
  55. {
  56. get
  57. {
  58. return "select count(1) from user_ind_columns where upper(index_name)=upper('{0}')";
  59. }
  60. }
  61. protected override string CreateIndexSql
  62. {
  63. get
  64. {
  65. return "CREATE {3} INDEX Index_{0}_{2} ON {0}({1})";
  66. }
  67. }
  68. protected override string AddDefaultValueSql
  69. {
  70. get
  71. {
  72. return "ALTER TABLE {0} MODIFY({1} DEFAULT '{2}')";
  73. }
  74. }
  75. protected override string CreateDataBaseSql
  76. {
  77. get
  78. {
  79. return "CREATE DATABASE {0}";
  80. }
  81. }
  82. protected override string AddPrimaryKeySql
  83. {
  84. get
  85. {
  86. return "ALTER TABLE {0} ADD CONSTRAINT {1} PRIMARY KEY({2})";
  87. }
  88. }
  89. protected override string AddColumnToTableSql
  90. {
  91. get
  92. {
  93. return "ALTER TABLE {0} ADD ({1} {2}{3} {4} {5} {6})";
  94. }
  95. }
  96. protected override string AlterColumnToTableSql
  97. {
  98. get
  99. {
  100. return "ALTER TABLE {0} modify ({1} {2}{3} {4} {5} {6}) ";
  101. }
  102. }
  103. protected override string BackupDataBaseSql
  104. {
  105. get
  106. {
  107. return @"USE master;BACKUP DATABASE {0} TO disk = '{1}'";
  108. }
  109. }
  110. protected override string CreateTableSql
  111. {
  112. get
  113. {
  114. return "CREATE TABLE {0}(\r\n{1})";
  115. }
  116. }
  117. protected override string CreateTableColumn
  118. {
  119. get
  120. {
  121. return "{0} {1}{2} {3} {4} {5}";
  122. }
  123. }
  124. protected override string TruncateTableSql
  125. {
  126. get
  127. {
  128. return "TRUNCATE TABLE {0}";
  129. }
  130. }
  131. protected override string BackupTableSql
  132. {
  133. get
  134. {
  135. return "create table {1} as select * from {2} where ROWNUM<={0}";
  136. }
  137. }
  138. protected override string DropTableSql
  139. {
  140. get
  141. {
  142. return "DROP TABLE {0}";
  143. }
  144. }
  145. protected override string DropColumnToTableSql
  146. {
  147. get
  148. {
  149. return "ALTER TABLE {0} DROP COLUMN {1}";
  150. }
  151. }
  152. protected override string DropConstraintSql
  153. {
  154. get
  155. {
  156. return "ALTER TABLE {0} DROP CONSTRAINT {1}";
  157. }
  158. }
  159. protected override string RenameColumnSql
  160. {
  161. get
  162. {
  163. return "ALTER TABLE {0} rename column {1} to {2}";
  164. }
  165. }
  166. protected override string AddColumnRemarkSql
  167. {
  168. get
  169. {
  170. return "comment on column {1}.{0} is '{2}'";
  171. }
  172. }
  173. protected override string DeleteColumnRemarkSql
  174. {
  175. get
  176. {
  177. return "comment on column {1}.{0} is ''";
  178. }
  179. }
  180. protected override string IsAnyColumnRemarkSql
  181. {
  182. get
  183. {
  184. return "select * from user_col_comments where Table_Name='{1}' AND COLUMN_NAME='{0}' order by column_name";
  185. }
  186. }
  187. protected override string AddTableRemarkSql
  188. {
  189. get
  190. {
  191. return "comment on table {0} is '{1}'";
  192. }
  193. }
  194. protected override string DeleteTableRemarkSql
  195. {
  196. get
  197. {
  198. return "comment on table {0} is ''";
  199. }
  200. }
  201. protected override string IsAnyTableRemarkSql
  202. {
  203. get
  204. {
  205. return "select * from user_tab_comments where Table_Name='{0}'order by Table_Name";
  206. }
  207. }
  208. protected override string RenameTableSql
  209. {
  210. get
  211. {
  212. return "alter table {0} rename to {1}";
  213. }
  214. }
  215. protected override string IsAnyProcedureSql
  216. {
  217. get
  218. {
  219. return "SELECT COUNT(*) FROM user_objects WHERE OBJECT_TYPE = 'PROCEDURE' AND OBJECT_NAME ='{0}'";
  220. }
  221. }
  222. #endregion
  223. #region Check
  224. protected override string CheckSystemTablePermissionsSql
  225. {
  226. get
  227. {
  228. return "select t.table_name from user_tables t where rownum=1";
  229. }
  230. }
  231. #endregion
  232. #region Scattered
  233. protected override string CreateTableNull
  234. {
  235. get
  236. {
  237. return " NULL ";
  238. }
  239. }
  240. protected override string CreateTableNotNull
  241. {
  242. get
  243. {
  244. return " NOT NULL ";
  245. }
  246. }
  247. protected override string CreateTablePirmaryKey
  248. {
  249. get
  250. {
  251. return "PRIMARY KEY";
  252. }
  253. }
  254. protected override string CreateTableIdentity
  255. {
  256. get
  257. {
  258. return "";
  259. }
  260. }
  261. #endregion
  262. #region Methods
  263. public override bool IsAnyTable(string tableName, bool isCache = true)
  264. {
  265. if (isCache)
  266. {
  267. return base.IsAnyTable(tableName, isCache);
  268. }
  269. else
  270. {
  271. if (tableName.Contains("\""))
  272. {
  273. tableName = SqlBuilder.GetNoTranslationColumnName(tableName);
  274. }
  275. return this.Context.Ado.GetInt(@"
  276. SELECT COUNT(table_name)
  277. FROM user_tables
  278. WHERE UPPER(table_name) = UPPER(@p)",new { p=tableName}) > 0;
  279. }
  280. }
  281. public override bool UpdateColumn(string tableName, DbColumnInfo column)
  282. {
  283. ConvertCreateColumnInfo(column);
  284. var oldColumn = this.Context.DbMaintenance.GetColumnInfosByTableName(tableName, false)
  285. .FirstOrDefault(it=>it.DbColumnName.EqualCase(column.DbColumnName));
  286. if (oldColumn != null)
  287. {
  288. if (oldColumn.IsNullable == column.IsNullable)
  289. {
  290. var sql=GetUpdateColumnSqlOnlyType(tableName, column);
  291. this.Context.Ado.ExecuteCommand(sql);
  292. return true;
  293. }
  294. }
  295. return base.UpdateColumn(tableName, column);
  296. }
  297. protected virtual string GetUpdateColumnSqlOnlyType(string tableName, DbColumnInfo columnInfo)
  298. {
  299. string columnName = this.SqlBuilder.GetTranslationColumnName(columnInfo.DbColumnName);
  300. tableName = this.SqlBuilder.GetTranslationTableName(tableName);
  301. string dataSize = GetSize(columnInfo);
  302. string dataType = columnInfo.DataType;
  303. string nullType ="";
  304. string primaryKey = null;
  305. string identity = null;
  306. string result = string.Format(this.AlterColumnToTableSql, tableName, columnName, dataType, dataSize, nullType, primaryKey, identity);
  307. return result;
  308. }
  309. public override bool RenameTable(string oldTableName, string newTableName)
  310. {
  311. return base.RenameTable(SqlBuilder.GetTranslationColumnName(oldTableName), SqlBuilder.GetTranslationColumnName(newTableName));
  312. }
  313. public override List<string> GetDbTypes()
  314. {
  315. var result= this.Context.Ado.SqlQuery<string>(@"SELECT DISTINCT DATA_TYPE
  316. FROM DBA_TAB_COLUMNS
  317. WHERE OWNER = user ");
  318. result.Add("TIMESTAMP");
  319. result.Add("NCLOB");
  320. return result.Distinct().ToList();
  321. }
  322. public override List<string> GetTriggerNames(string tableName)
  323. {
  324. return this.Context.Ado.SqlQuery<string>(@"SELECT trigger_name
  325. FROM all_triggers
  326. WHERE table_name = '"+tableName+"'");
  327. }
  328. public override List<string> GetFuncList()
  329. {
  330. return this.Context.Ado.SqlQuery<string>(" SELECT object_name\r\nFROM all_objects\r\nWHERE object_type = 'FUNCTION' AND owner = USER ");
  331. }
  332. public override List<string> GetIndexList(string tableName)
  333. {
  334. var sql = $"SELECT index_name FROM user_ind_columns\r\nWHERE upper(table_name) = upper('{tableName}')";
  335. return this.Context.Ado.SqlQuery<string>(sql);
  336. }
  337. public override List<string> GetProcList(string dbName)
  338. {
  339. var sql = $"SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE' AND OWNER = '{dbName.ToUpper()}'";
  340. return this.Context.Ado.SqlQuery<string>(sql);
  341. }
  342. public override bool AddColumn(string tableName, DbColumnInfo columnInfo)
  343. {
  344. if (columnInfo.DataType == "varchar"&& columnInfo.Length ==0)
  345. {
  346. columnInfo.DataType = "varchar2";
  347. columnInfo.Length = 50;
  348. }
  349. return base.AddColumn(tableName,columnInfo);
  350. }
  351. public override bool CreateIndex(string tableName, string[] columnNames, bool isUnique=false)
  352. {
  353. string sql = string.Format(CreateIndexSql, tableName, string.Join(",", columnNames), string.Join("_", columnNames.Select(it=>(it+"abc").Substring(0,3))), isUnique ? "UNIQUE" : "");
  354. this.Context.Ado.ExecuteCommand(sql);
  355. return true;
  356. }
  357. public override bool AddDefaultValue(string tableName, string columnName, string defaultValue)
  358. {
  359. columnName = SqlBuilder.GetTranslationColumnName(columnName);
  360. tableName = SqlBuilder.GetTranslationColumnName(tableName);
  361. if (defaultValue == "''")
  362. {
  363. defaultValue = "";
  364. }
  365. if (defaultValue.ToLower().IsIn("sysdate"))
  366. {
  367. var template = AddDefaultValueSql.Replace("'", "");
  368. string sql = string.Format(template,tableName,columnName,defaultValue);
  369. this.Context.Ado.ExecuteCommand(sql);
  370. return true;
  371. }
  372. else
  373. {
  374. return base.AddDefaultValue(tableName, columnName, defaultValue);
  375. }
  376. }
  377. public override bool CreateDatabase(string databaseDirectory = null)
  378. {
  379. if (this.Context.Ado.IsValidConnection())
  380. {
  381. return true;
  382. }
  383. Check.ExceptionEasy("Oracle no support create database ", "Oracle不支持建库方法,请写有效连接字符串可以正常运行该方法。");
  384. return true;
  385. }
  386. public override bool CreateDatabase(string databaseName, string databaseDirectory = null)
  387. {
  388. throw new NotSupportedException();
  389. }
  390. public override bool AddRemark(EntityInfo entity)
  391. {
  392. var db = this.Context;
  393. var columns = entity.Columns.Where(it => it.IsIgnore == false).ToList();
  394. foreach (var item in columns)
  395. {
  396. if (item.ColumnDescription != null)
  397. {
  398. //column remak
  399. if (db.DbMaintenance.IsAnyColumnRemark(item.DbColumnName.ToUpper(IsUppper), item.DbTableName.ToUpper(IsUppper)))
  400. {
  401. db.DbMaintenance.DeleteColumnRemark(this.SqlBuilder.GetTranslationColumnName(item.DbColumnName), this.SqlBuilder.GetTranslationColumnName(item.DbTableName));
  402. db.DbMaintenance.AddColumnRemark(this.SqlBuilder.GetTranslationColumnName(item.DbColumnName), this.SqlBuilder.GetTranslationColumnName(item.DbTableName), item.ColumnDescription);
  403. }
  404. else
  405. {
  406. db.DbMaintenance.AddColumnRemark(this.SqlBuilder.GetTranslationColumnName(item.DbColumnName), this.SqlBuilder.GetTranslationColumnName(item.DbTableName), item.ColumnDescription);
  407. }
  408. }
  409. }
  410. //table remak
  411. if (entity.TableDescription != null)
  412. {
  413. if (db.DbMaintenance.IsAnyTableRemark(entity.DbTableName))
  414. {
  415. db.DbMaintenance.DeleteTableRemark(SqlBuilder.GetTranslationColumnName( entity.DbTableName));
  416. db.DbMaintenance.AddTableRemark(SqlBuilder.GetTranslationColumnName(entity.DbTableName), entity.TableDescription);
  417. }
  418. else
  419. {
  420. db.DbMaintenance.AddTableRemark(SqlBuilder.GetTranslationColumnName(entity.DbTableName), entity.TableDescription);
  421. }
  422. }
  423. return true;
  424. }
  425. public override List<DbColumnInfo> GetColumnInfosByTableName(string tableName, bool isCache = true)
  426. {
  427. string cacheKey = "DbMaintenanceProvider.GetColumnInfosByTableName." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
  428. cacheKey = GetCacheKey(cacheKey);
  429. if (!isCache)
  430. return GetColumnInfosByTableName(tableName);
  431. else
  432. return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
  433. () =>
  434. {
  435. return GetColumnInfosByTableName(tableName);
  436. });
  437. }
  438. private List<DbColumnInfo> GetColumnInfosByTableName(string tableName)
  439. {
  440. List<DbColumnInfo> columns = GetOracleDbType(tableName);
  441. string sql = "select * /* " + Guid.NewGuid() + " */ from " +SqlBuilder.GetTranslationTableName(SqlBuilder.GetNoTranslationColumnName(tableName)) + " WHERE 1=2 ";
  442. if (!IsAnyTable(tableName, false))
  443. {
  444. return new List<DbColumnInfo>();
  445. }
  446. this.Context.Utilities.RemoveCache<List<DbColumnInfo>>("DbMaintenanceProvider.GetFieldComment."+tableName);
  447. this.Context.Utilities.RemoveCache<List<string>>("DbMaintenanceProvider.GetPrimaryKeyByTableNames." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower());
  448. var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
  449. this.Context.Ado.IsEnableLogEvent = false;
  450. using (DbDataReader reader = (DbDataReader)this.Context.Ado.GetDataReader(sql))
  451. {
  452. this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
  453. List<DbColumnInfo> result = new List<DbColumnInfo>();
  454. var schemaTable = reader.GetSchemaTable();
  455. foreach (System.Data.DataRow row in schemaTable.Rows)
  456. {
  457. DbColumnInfo column = new DbColumnInfo()
  458. {
  459. TableName = tableName,
  460. DataType = row["DataType"].ToString().Replace("System.", "").Trim(),
  461. IsNullable = (bool)row["AllowDBNull"],
  462. //IsIdentity = (bool)row["IsAutoIncrement"],
  463. ColumnDescription = GetFieldComment(tableName, row["ColumnName"].ToString()),
  464. DbColumnName = row["ColumnName"].ToString(),
  465. //DefaultValue = row["defaultValue"].ToString(),
  466. IsPrimarykey = GetPrimaryKeyByTableNames(tableName).Any(it => it.Equals(row["ColumnName"].ToString(), StringComparison.CurrentCultureIgnoreCase)),
  467. Length = row["ColumnSize"].ObjToInt(),
  468. Scale = row["numericscale"].ObjToInt()
  469. };
  470. var current = columns.FirstOrDefault(it => it.DbColumnName.EqualCase(column.DbColumnName));
  471. if (current != null)
  472. {
  473. column.OracleDataType = current.DataType;
  474. if (current.DataType.EqualCase("number"))
  475. {
  476. column.Length = row["numericprecision"].ObjToInt();
  477. column.Scale = row["numericscale"].ObjToInt();
  478. column.DecimalDigits = row["numericscale"].ObjToInt();
  479. if (column.Length == 38 && column.Scale==0)
  480. {
  481. column.Length = 22;
  482. }
  483. }
  484. }
  485. result.Add(column);
  486. }
  487. return result;
  488. }
  489. }
  490. private List<DbColumnInfo> GetOracleDbType(string tableName)
  491. {
  492. var sql0 = $@"select
  493. t1.table_name as TableName,
  494. t6.comments,
  495. t1.column_id,
  496. t1.column_name as DbColumnName,
  497. t5.comments,
  498. t1.data_type as DataType,
  499. t1.data_length as Length,
  500. t1.char_length,
  501. t1.data_precision,
  502. t1.data_scale,
  503. t1.nullable,
  504. t4.index_name,
  505. t4.column_position,
  506. t4.descend
  507. from user_tab_columns t1
  508. left join (select t2.table_name,
  509. t2.column_name,
  510. t2.column_position,
  511. t2.descend,
  512. t3.index_name
  513. from user_ind_columns t2
  514. left join user_indexes t3
  515. on t2.table_name = t3.table_name and t2.index_name = t3.index_name
  516. and t3.status = 'valid' and t3.uniqueness = 'unique') t4 --unique:唯一索引
  517. on t1.table_name = t4.table_name and t1.column_name = t4.column_name
  518. left join user_col_comments t5 on t1.table_name = t5.table_name and t1.column_name = t5.column_name
  519. left join user_tab_comments t6 on t1.table_name = t6.table_name
  520. where upper(t1.table_name)=upper('{tableName}')
  521. order by t1.table_name, t1.column_id";
  522. var columns = this.Context.Ado.SqlQuery<DbColumnInfo>(sql0);
  523. return columns;
  524. }
  525. private List<string> GetPrimaryKeyByTableNames(string tableName)
  526. {
  527. string cacheKey = "DbMaintenanceProvider.GetPrimaryKeyByTableNames." + this.SqlBuilder.GetNoTranslationColumnName(tableName).ToLower();
  528. cacheKey = GetCacheKey(cacheKey);
  529. return this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
  530. () =>
  531. {
  532. var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
  533. this.Context.Ado.IsEnableLogEvent = false;
  534. string sql = @" select distinct cu.COLUMN_name KEYNAME from user_cons_columns cu, user_constraints au
  535. where cu.constraint_name = au.constraint_name
  536. and au.constraint_type = 'P' and au.table_name = '" + tableName.ToUpper(IsUppper) + @"'";
  537. var pks = this.Context.Ado.SqlQuery<string>(sql);
  538. this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
  539. return pks;
  540. });
  541. }
  542. public string GetTableComment(string tableName)
  543. {
  544. string cacheKey = "DbMaintenanceProvider.GetTableComment." + tableName;
  545. var comments = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
  546. () =>
  547. {
  548. string sql = "SELECT COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME =@tableName ORDER BY TABLE_NAME";
  549. var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
  550. this.Context.Ado.IsEnableLogEvent = false;
  551. var pks = this.Context.Ado.SqlQuery<string>(sql, new { tableName = tableName.ToUpper(IsUppper) });
  552. this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
  553. return pks;
  554. });
  555. return comments.HasValue() ? comments.First() : "";
  556. }
  557. public string GetFieldComment(string tableName, string filedName)
  558. {
  559. string cacheKey = "DbMaintenanceProvider.GetFieldComment." + tableName;
  560. var comments = this.Context.Utilities.GetReflectionInoCacheInstance().GetOrCreate(cacheKey,
  561. () =>
  562. {
  563. string sql = "SELECT TABLE_NAME AS TableName, COLUMN_NAME AS DbColumnName,COMMENTS AS ColumnDescription FROM user_col_comments WHERE TABLE_NAME =@tableName ORDER BY TABLE_NAME";
  564. var oldIsEnableLog = this.Context.Ado.IsEnableLogEvent;
  565. this.Context.Ado.IsEnableLogEvent = false;
  566. var pks = this.Context.Ado.SqlQuery<DbColumnInfo>(sql, new { tableName = tableName.ToUpper(IsUppper) });
  567. this.Context.Ado.IsEnableLogEvent = oldIsEnableLog;
  568. return pks;
  569. });
  570. return comments.HasValue() ? comments.First(it => it.DbColumnName.Equals(filedName, StringComparison.CurrentCultureIgnoreCase)).ColumnDescription : "";
  571. }
  572. public override bool CreateTable(string tableName, List<DbColumnInfo> columns, bool isCreatePrimaryKey = true)
  573. {
  574. if (columns.HasValue())
  575. {
  576. foreach (var item in columns)
  577. {
  578. ConvertCreateColumnInfo(item);
  579. if (item.DbColumnName.Equals("GUID", StringComparison.CurrentCultureIgnoreCase) && item.Length == 0)
  580. {
  581. item.Length = 50;
  582. }
  583. if (item.DataType == "varchar" && item.Length == 0)
  584. {
  585. item.Length = 50;
  586. }
  587. if (item.IsIdentity && this.Context.CurrentConnectionConfig?.MoreSettings?.EnableOracleIdentity == true)
  588. {
  589. item.DataType = "NUMBER GENERATED ALWAYS AS IDENTITY";
  590. }
  591. }
  592. }
  593. string sql = GetCreateTableSql(tableName, columns);
  594. this.Context.Ado.ExecuteCommand(sql);
  595. if (isCreatePrimaryKey)
  596. {
  597. var pkColumns = columns.Where(it => it.IsPrimarykey).ToList();
  598. if (pkColumns.Count <=1)
  599. {
  600. foreach (var item in pkColumns)
  601. {
  602. this.Context.DbMaintenance.AddPrimaryKey(tableName, item.DbColumnName);
  603. }
  604. }
  605. else
  606. {
  607. var addItems = pkColumns.Select(it => it.DbColumnName).ToArray();
  608. this.Context.DbMaintenance.AddPrimaryKeys(tableName, addItems);
  609. }
  610. }
  611. return true;
  612. }
  613. #endregion
  614. #region Helper
  615. public bool IsUppper
  616. {
  617. get
  618. {
  619. if (this.Context.CurrentConnectionConfig.MoreSettings == null)
  620. {
  621. return true;
  622. }
  623. else
  624. {
  625. return this.Context.CurrentConnectionConfig.MoreSettings.IsAutoToUpper == true;
  626. }
  627. }
  628. }
  629. private static void ConvertCreateColumnInfo(DbColumnInfo x)
  630. {
  631. string[] array = new string[] { "int"};
  632. if (array.Contains(x.DataType?.ToLower()))
  633. {
  634. x.Length = 0;
  635. x.DecimalDigits = 0;
  636. }
  637. if (x.OracleDataType.HasValue())
  638. {
  639. x.DataType = x.OracleDataType;
  640. }
  641. }
  642. #endregion
  643. }
  644. }