You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

439 lines
16 KiB

  1. using Learun.DataBase.Repository;
  2. using Learun.Util;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Text;
  7. namespace Learun.Application.Base.SystemModule
  8. {
  9. /// <summary>
  10. /// 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园
  11. /// Copyright (c) 2013-2018 北京泉江科技有限公司
  12. /// 创建人:陈彬彬
  13. /// 日 期:2017.03.08
  14. /// 描 述:数据库表管理
  15. /// </summary>
  16. public class DatabaseTableService : RepositoryFactory
  17. {
  18. #region 获取数据
  19. /// <summary>
  20. /// 数据表列表
  21. /// </summary>
  22. /// <param name="databaseLinkEntity">数据库连接信息</param>
  23. /// <returns></returns>
  24. public IEnumerable<DatabaseTableModel> GetTableList(DatabaseLinkEntity databaseLinkEntity)
  25. {
  26. try
  27. {
  28. if (databaseLinkEntity == null)
  29. {
  30. return new List<DatabaseTableModel>();
  31. }
  32. return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).GetDBTable<DatabaseTableModel>();
  33. }
  34. catch (Exception ex)
  35. {
  36. if (ex is ExceptionEx)
  37. {
  38. throw;
  39. }
  40. else
  41. {
  42. throw ExceptionEx.ThrowServiceException(ex);
  43. }
  44. }
  45. }
  46. /// <summary>
  47. /// 数据表字段列表
  48. /// </summary>
  49. /// <param name="databaseLinkEntity">数据库连接信息</param>
  50. /// <param name="tableName">表名</param>
  51. /// <returns></returns>
  52. public IEnumerable<DatabaseTableFieldModel> GetTableFiledList(DatabaseLinkEntity databaseLinkEntity, string tableName)
  53. {
  54. try
  55. {
  56. if (databaseLinkEntity == null)
  57. {
  58. return new List<DatabaseTableFieldModel>();
  59. }
  60. return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).GetDBTableFields<DatabaseTableFieldModel>(tableName);
  61. }
  62. catch (Exception ex)
  63. {
  64. if (ex is ExceptionEx)
  65. {
  66. throw;
  67. }
  68. else
  69. {
  70. throw ExceptionEx.ThrowServiceException(ex);
  71. }
  72. }
  73. }
  74. /// <summary>
  75. /// 数据库表数据列表
  76. /// </summary>
  77. /// <param name="databaseLinkEntity">库连接信息</param>
  78. /// <param name="field">表明</param>
  79. /// <param name="switchWhere">条件</param>
  80. /// <param name="logic">逻辑</param>
  81. /// <param name="keyword">关键字</param>
  82. /// <param name="pagination">分页参数</param>
  83. /// <returns></returns>
  84. public DataTable GetTableDataList(DatabaseLinkEntity databaseLinkEntity, string tableName, string field, string logic, string keyword, Pagination pagination)
  85. {
  86. try
  87. {
  88. StringBuilder strSql = new StringBuilder();
  89. strSql.Append("SELECT * FROM " + tableName + " WHERE 1=1");
  90. if (!string.IsNullOrEmpty(keyword) && !string.IsNullOrEmpty(logic) && logic != "Null" && logic != "NotNull")
  91. {
  92. strSql.Append(" AND " + field + " ");
  93. switch (logic)
  94. {
  95. case "Equal": //等于
  96. strSql.Append(" = ");
  97. break;
  98. case "NotEqual": //不等于
  99. strSql.Append(" <> ");
  100. break;
  101. case "Greater": //大于
  102. strSql.Append(" > ");
  103. break;
  104. case "GreaterThan": //大于等于
  105. strSql.Append(" >= ");
  106. break;
  107. case "Less": //小于
  108. strSql.Append(" < ");
  109. break;
  110. case "LessThan": //小于等于
  111. strSql.Append(" >= ");
  112. break;
  113. case "Like": //包含
  114. strSql.Append(" like ");
  115. keyword = "%" + keyword + "%";
  116. break;
  117. default:
  118. break;
  119. }
  120. strSql.Append("@keyword ");
  121. }
  122. if (logic == "Null")
  123. {
  124. strSql.Append(" AND " + field + " is null ");
  125. }
  126. else if (logic == "NotNull")
  127. {
  128. strSql.Append(" AND " + field + " is not null ");
  129. }
  130. return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql.ToString(), new { keyword = keyword }, pagination);
  131. }
  132. catch (Exception ex)
  133. {
  134. if (ex is ExceptionEx)
  135. {
  136. throw;
  137. }
  138. else
  139. {
  140. throw ExceptionEx.ThrowServiceException(ex);
  141. }
  142. }
  143. }
  144. /// <summary>
  145. /// 数据库表数据列表
  146. /// </summary>
  147. /// <param name="databaseLinkEntity">库连接信息</param>
  148. /// <param name="tableName">表名</param>
  149. /// <returns></returns>
  150. public DataTable GetTableDataList(DatabaseLinkEntity databaseLinkEntity, string tableName)
  151. {
  152. try
  153. {
  154. StringBuilder strSql = new StringBuilder();
  155. strSql.Append(" SELECT * FROM " + tableName);
  156. return this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql.ToString());
  157. }
  158. catch (Exception ex)
  159. {
  160. if (ex is ExceptionEx)
  161. {
  162. throw;
  163. }
  164. else
  165. {
  166. throw ExceptionEx.ThrowServiceException(ex);
  167. }
  168. }
  169. }
  170. /// <summary>
  171. /// 数据库表数据列表
  172. /// </summary>
  173. /// <param name="databaseLinkEntity">库连接信息</param>
  174. /// <param name="strSql">表名</param>
  175. /// <returns></returns>
  176. public List<string> GetSqlColName(DatabaseLinkEntity databaseLinkEntity, string strSql)
  177. {
  178. try
  179. {
  180. var dt = this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).FindTable(strSql);
  181. List<string> res = new List<string>();
  182. foreach (DataColumn item in dt.Columns)
  183. {
  184. res.Add(item.ColumnName);
  185. }
  186. return res;
  187. }
  188. catch (Exception ex)
  189. {
  190. if (ex is ExceptionEx)
  191. {
  192. throw;
  193. }
  194. else
  195. {
  196. throw ExceptionEx.ThrowServiceException(ex);
  197. }
  198. }
  199. }
  200. #endregion
  201. #region 提交数据
  202. /// <summary>
  203. /// 创建数据库表
  204. /// </summary>
  205. /// <param name="databaseLinkEntity"></param>
  206. /// <param name="tableName"></param>
  207. /// <param name="tableRemark"></param>
  208. /// <param name="colList"></param>
  209. /// <returns></returns>
  210. public string CreateTable(DatabaseLinkEntity databaseLinkEntity, string tableName, string tableRemark, List<DatabaseTableFieldModel> colList) {
  211. try
  212. {
  213. if (databaseLinkEntity == null)
  214. {
  215. return "当前数据库不存在";
  216. }
  217. List<DatabaseTableModel> tableList = (List<DatabaseTableModel>)GetTableList(databaseLinkEntity);
  218. if (tableList.Find(t => t.name == tableName) != null)
  219. {
  220. return "表名重复";
  221. }
  222. else {
  223. var db = this.BaseRepository(databaseLinkEntity.F_DbConnection, databaseLinkEntity.F_DbType).BeginTrans();
  224. try
  225. {
  226. string sql = "";
  227. switch (databaseLinkEntity.F_DbType)
  228. {
  229. case "SqlServer":
  230. sql = GetSqlServerCreateTableSql(tableName, tableRemark, colList);
  231. db.ExecuteBySql(sql);
  232. break;
  233. case "MySql":
  234. sql = GetMySqlCreateTableSql(tableName, tableRemark, colList);
  235. db.ExecuteBySql(sql);
  236. break;
  237. case "Oracle":
  238. GetOracleCreateTableSql(tableName, tableRemark, colList,db);
  239. break;
  240. }
  241. db.Commit();
  242. }
  243. catch (Exception)
  244. {
  245. db.Rollback();
  246. throw;
  247. }
  248. return "建表成功";
  249. }
  250. }
  251. catch (Exception ex)
  252. {
  253. if (ex is ExceptionEx)
  254. {
  255. throw;
  256. }
  257. else
  258. {
  259. throw ExceptionEx.ThrowServiceException(ex);
  260. }
  261. }
  262. }
  263. /// <summary>
  264. /// 获取sqlserver建表语句
  265. /// </summary>
  266. /// <param name="tableName">表名</param>
  267. /// <param name="tableRemark">表备注</param>
  268. /// <param name="colList">字段集合</param>
  269. /// <returns></returns>
  270. private string GetSqlServerCreateTableSql(string tableName, string tableRemark, List<DatabaseTableFieldModel> colList) {
  271. StringBuilder sql = new StringBuilder();
  272. sql.Append("CREATE TABLE " + tableName + " ( ");//表名
  273. foreach (var item in colList)
  274. {
  275. sql.Append(item.f_column + " " + item.f_datatype);//列名+类型
  276. if (item.f_datatype == "varchar" && item.f_length != 0)
  277. {
  278. sql.Append("(" + item.f_length + ") ");//长度
  279. }
  280. if (item.f_key == "1")
  281. {
  282. sql.Append(" PRIMARY KEY ");//是否主键
  283. }
  284. else if (item.f_isnullable == "0")
  285. {
  286. sql.Append(" NOT NULL ");//是否为空
  287. }
  288. sql.Append(",");
  289. }
  290. sql.Remove(sql.Length - 1, 1);
  291. sql.Append(" )");
  292. foreach (var item in colList)
  293. {
  294. if (!string.IsNullOrEmpty(item.f_remark))
  295. {
  296. //添加列备注
  297. sql.Append(" execute sp_addextendedproperty 'MS_Description','" + item.f_remark + "','user','dbo','table','" + tableName + "','column','" + item.f_column + "';");
  298. }
  299. }
  300. //添加表备注
  301. if (!string.IsNullOrEmpty(tableRemark))
  302. {
  303. sql.Append(" execute sp_addextendedproperty 'MS_Description','" + tableRemark + "','user','dbo','table','" + tableName + "',null,null; ");
  304. }
  305. return sql.ToString();
  306. }
  307. /// <summary>
  308. /// 获取MySql建表语句
  309. /// </summary>
  310. /// <param name="tableName">表名</param>
  311. /// <param name="tableRemark">表备注</param>
  312. /// <param name="colList">字段集合</param>
  313. /// <returns></returns>
  314. private string GetMySqlCreateTableSql(string tableName, string tableRemark, List<DatabaseTableFieldModel> colList)
  315. {
  316. StringBuilder sql = new StringBuilder();
  317. sql.Append("CREATE TABLE " + tableName + " ( ");//表名
  318. foreach (var item in colList)
  319. {
  320. sql.Append(item.f_column + " " + item.f_datatype);//列名+类型
  321. if (item.f_datatype == "varchar" && item.f_length != 0)
  322. {
  323. sql.Append("(" + item.f_length + ") ");//长度
  324. }
  325. if (item.f_key == "1")
  326. {
  327. sql.Append(" PRIMARY KEY ");//是否主键
  328. }
  329. else if (item.f_isnullable == "0")
  330. {
  331. sql.Append(" NOT NULL ");//是否为空
  332. }
  333. if (!string.IsNullOrEmpty(item.f_remark))
  334. {
  335. sql.Append(" COMMENT '" + item.f_remark + "'");//列备注
  336. }
  337. sql.Append(",");
  338. }
  339. sql.Remove(sql.Length - 1, 1);
  340. sql.Append(" )");
  341. //添加表备注
  342. if (!string.IsNullOrEmpty(tableRemark))
  343. {
  344. sql.Append(" ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='"+ tableRemark + "';");
  345. }
  346. return sql.ToString();
  347. }
  348. /// <summary>
  349. /// 获取Oracle建表语句
  350. /// </summary>
  351. /// <param name="tableName">表名</param>
  352. /// <param name="tableRemark">表备注</param>
  353. /// <param name="colList">字段集合</param>
  354. /// <returns></returns>
  355. private void GetOracleCreateTableSql(string tableName, string tableRemark, List<DatabaseTableFieldModel> colList, IRepository db)
  356. {
  357. StringBuilder sql = new StringBuilder();
  358. sql.Append("CREATE TABLE \"" + tableName.ToUpper() + "\" ( ");//表名
  359. foreach (var item in colList)
  360. {
  361. sql.Append("\"" +item.f_column.ToUpper() + "\" " + GetOracleDataType(item.f_datatype));//列名+类型
  362. if (item.f_datatype == "varchar" && item.f_length != 0)
  363. {
  364. sql.Append("(" + item.f_length + " CHAR) ");//长度
  365. }
  366. if (item.f_key == "1")
  367. {
  368. sql.Append(" PRIMARY KEY NOT NULL ");//是否主键
  369. }
  370. else if (item.f_isnullable == "0")
  371. {
  372. sql.Append(" NOT NULL ");//是否为空
  373. }
  374. else {
  375. sql.Append(" NULL ");//是否为空
  376. }
  377. sql.Append(",");
  378. }
  379. sql.Remove(sql.Length - 1, 1);
  380. sql.Append(" )");
  381. db.ExecuteBySql(sql.ToString());
  382. ////添加表备注
  383. if (!string.IsNullOrEmpty(tableRemark))
  384. {
  385. db.ExecuteBySql(" COMMENT ON TABLE \"" + tableName.ToUpper() + "\" is '" + tableRemark + "' ");
  386. }
  387. foreach (var item in colList)
  388. {
  389. if (!string.IsNullOrEmpty(item.f_remark))
  390. {
  391. //添加列备注
  392. db.ExecuteBySql(" COMMENT ON COLUMN \"" + tableName.ToUpper() + "\".\"" + item.f_column.ToUpper() + "\" is '" + item.f_remark + "'");
  393. }
  394. }
  395. }
  396. /// <summary>
  397. /// 获取字段类型
  398. /// </summary>
  399. /// <param name="dataType"></param>
  400. /// <returns></returns>
  401. private string GetOracleDataType(string dataType) {
  402. string res = "";
  403. switch (dataType) {
  404. case "varchar":
  405. res = "VARCHAR2";
  406. break;
  407. case "datetime":
  408. res = "DATE";
  409. break;
  410. case "int":
  411. case "decimal":
  412. res = "NUMBER(11)";
  413. break;
  414. }
  415. return res;
  416. }
  417. #endregion
  418. }
  419. }