DataTableCreatorDesigner.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. using Core.StlMes.Client.Judge.Forms;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.ComponentModel.Design;
  6. using System.Data;
  7. using System.Data.OracleClient;
  8. using System.Linq;
  9. using System.Windows.Forms;
  10. namespace Core.StlMes.Client.Judge.Commons
  11. {
  12. public class DataTableCreatorDesigner : ComponentDesigner
  13. {
  14. public DataTableCreatorDesigner()
  15. {
  16. // 添加菜单到右键菜单和智能标记中。
  17. DesignerVerb V2 = new DesignerVerb("生成DataTable结构", new EventHandler(OnGenerateButtonCode));
  18. this.Verbs.Add(V2);
  19. }
  20. public override void Initialize(IComponent component)
  21. {
  22. base.Initialize(component);
  23. }
  24. private void OnGenerateButtonCode(object sender, EventArgs e)
  25. {
  26. //
  27. //在窗体上加入一个Button组件,host.RootComponent=Form
  28. //
  29. //取出窗体设计器
  30. IDesignerHost host = (IDesignerHost)this.GetService(typeof(IDesignerHost));
  31. IComponentChangeService c = (IComponentChangeService)this.GetService(typeof(IComponentChangeService));
  32. Control control = (Control)host.RootComponent;//RootComponent: 根组件,指Form
  33. DesignerTransaction tran = host.CreateTransaction();//创建事务
  34. c.OnComponentChanging(control, null);//通知窗体正在新增控件服务
  35. //创建table
  36. DataSet ds = (DataSet)host.CreateComponent(typeof(DataSet));
  37. DataTable dt = (DataTable)host.CreateComponent(typeof(DataTable));
  38. PopupTextBox popup = new PopupTextBox("", 99999)
  39. {
  40. Text = "请输入查询SQL"
  41. };
  42. if (popup.ShowDialog() == DialogResult.OK)
  43. {
  44. CreateDataTable(dt, host, popup.TextInfo);
  45. ds.Tables.Add(dt);
  46. }
  47. c.OnComponentChanged(control, null, null, null);//通知窗体修改服务已完成
  48. if (dt.Columns.Count > 0)
  49. {
  50. tran.Commit();//提交事务
  51. }
  52. else
  53. {
  54. tran.Cancel();
  55. }
  56. }
  57. private void CreateDataTable(DataTable dt, IDesignerHost host, string sql)
  58. {
  59. OracleDriver driver = new OracleDriver();
  60. try
  61. {
  62. driver.Connect("TGCXDB", "cxuser", "tgcxuser_2015");
  63. driver.Open();
  64. string sqlColumnInfo = @"SELECT T.COLUMN_NAME,
  65. T.DATA_TYPE,
  66. TO_CHAR(DECODE(T.DATA_TYPE,
  67. 'NUMBER',
  68. NVL2(T.DATA_PRECISION, T.DATA_PRECISION, T.DATA_LENGTH),
  69. T.DATA_LENGTH)) DATA_LENGTH,
  70. T.NULLABLE,
  71. NVL(T2.COMMENTS, T.COLUMN_NAME) COMMENTS,
  72. CASE (SELECT COUNT(1)
  73. FROM USER_CONSTRAINTS T3, USER_CONS_COLUMNS T4
  74. WHERE T3.TABLE_NAME = T.TABLE_NAME
  75. AND T3.CONSTRAINT_TYPE = 'P'
  76. AND T4.CONSTRAINT_NAME = T3.CONSTRAINT_NAME
  77. AND T4.COLUMN_NAME = T.COLUMN_NAME)
  78. WHEN 0 THEN
  79. '0'
  80. ELSE
  81. '1'
  82. END IS_PK
  83. FROM USER_TAB_COLS T, USER_COL_COMMENTS T2
  84. WHERE T.COLUMN_NAME = T2.COLUMN_NAME
  85. AND T.TABLE_NAME = T2.TABLE_NAME
  86. AND T.TABLE_NAME IN ('1'{0})
  87. ORDER BY T.SEGMENT_COLUMN_ID";
  88. sql = "SELECT * FROM (" + sql + ") WHERE ROWNUM <= 1";
  89. DataTable disDt = driver.ExecuteQuery(sql.ToUpper());
  90. for (int i = 0; i < disDt.Columns.Count; i++)
  91. {
  92. DataColumn dc = (DataColumn)host.CreateComponent(typeof(DataColumn));
  93. dc.ColumnName = GetLanguageFormat(disDt.Columns[i].ColumnName, true);
  94. dt.Columns.Add(dc);
  95. }
  96. //TSqlEngine eg = new TSqlEngine();
  97. //List<TSqlEngine.AnalyzeResultSqlStruct> retSql = eg.AnalyzeTSql(sql);
  98. //List<DataTable> tables = new List<DataTable>();
  99. //MessageBox.Show(retSql.Count.ToString());
  100. // Regex rg = new Regex("(?i)(?<=(?:from|into|update|join)\\s{1,1000}"
  101. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?" // 重复这里, 可以多个from后面的表
  102. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  103. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  104. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  105. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  106. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  107. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  108. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  109. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  110. //+ "(?:\\w{1,1000}(?:\\s{0,1000},\\s{0,1000})?)?"
  111. //+ ")(\\w+)");
  112. //List<string> tableNames = new List<string>();
  113. //foreach (Match mt in rg.Matches(sql))
  114. //{
  115. // tableNames.Add(mt.Value);
  116. // MessageBox.Show(mt.Value);
  117. //}
  118. List<string> tableNames = new List<string>();
  119. List<string> sqls = sql.Split(new string[] { " ", "\r\n", "," }, StringSplitOptions.RemoveEmptyEntries).ToList();
  120. string sqlTables = "";
  121. for (int i = sqls.Count - 1; i >= 0; i--)
  122. {
  123. foreach (DataColumn col in disDt.Columns)
  124. {
  125. if (col.ColumnName == sqls[i])
  126. {
  127. sqls.RemoveAt(i);
  128. break;
  129. }
  130. }
  131. if (sqls[i].Contains("'")) continue;
  132. sqlTables += ", '" + sqls[i] + "'";
  133. }
  134. //int interval = 0;
  135. //for (int i = 0; i < sqls.Length; i++)
  136. //{
  137. // string str = sqls[i];
  138. // if (str.StartsWith("(")) continue;
  139. // if (i != 0)
  140. // {
  141. // if (sqls[i - 1] == "FROM")
  142. // {
  143. // tableNames.Add(str);
  144. // }
  145. // else if (sqls[i - 1] == "JOIN")
  146. // {
  147. // tableNames.Add(str);
  148. // }
  149. // bool isTable = false;
  150. // for (int j = i; j >= 0; j--)
  151. // {
  152. // if (sqls[j] == "FROM" || sqls[j] == "JOIN")
  153. // {
  154. // isTable = true;
  155. // }
  156. // else if (sqls[j].Contains("(")
  157. // || sqls[j] == "SELECT")
  158. // {
  159. // isTable = false;
  160. // }
  161. // }
  162. // if (isTable)
  163. // {
  164. // tableNames.Add(str);
  165. // }
  166. // //else if (i >= 2 && (sqls[i - 2] == "FROM" || sqls[i - 2] == "JOIN"))
  167. // //{
  168. // // tableNames.Add(str);
  169. // //}
  170. // //else if (i >= 3 && (sqls[i - 3] == "FROM" || sqls[i - 3] == "JOIN"))
  171. // //{
  172. // // tableNames.Add(str);
  173. // //}
  174. // //处理连接
  175. // if (str == "ON")
  176. // {
  177. // i += 2;
  178. // interval = 4;
  179. // }
  180. // else
  181. // {
  182. // interval = 0;
  183. // }
  184. // }
  185. //}
  186. //string[] tableNames = new string[] { "STL_INCISION", "QCM_LG_CHEMJUDGE" };
  187. string sss = string.Format(sqlColumnInfo, sqlTables);
  188. //MessageUtil.ShowTips(sss);
  189. DataTable table = driver.ExecuteQuery(sss);
  190. for (int i = 0; i < dt.Columns.Count; i++)
  191. {
  192. for (int k = 0; k < table.Rows.Count; k++)
  193. {
  194. string columnName = GetLanguageFormat(table.Rows[k]["COLUMN_NAME"].ToString(), true);
  195. string columnDesc = table.Rows[k]["COMMENTS"].ToString();
  196. if (columnName == dt.Columns[i].ColumnName)
  197. {
  198. dt.Columns[i].Caption = columnDesc;
  199. break;
  200. }
  201. }
  202. }
  203. }
  204. catch (Exception ex)
  205. {
  206. MessageBox.Show(ex.Message);
  207. }
  208. finally
  209. {
  210. driver.Close();
  211. }
  212. }
  213. private string GetLanguageFormat(string strName, bool isLowerBegin)
  214. {
  215. string[] strs = strName.Split('_');
  216. strName = "";
  217. for (int i = 0; i < strs.Length; i++)
  218. {
  219. if (i == 0 && isLowerBegin)
  220. {
  221. strName += strs[i].ToLower();
  222. }
  223. else
  224. {
  225. strName += strs[i].Substring(0, 1).ToUpper() + strs[i].Substring(1).ToLower();
  226. }
  227. }
  228. return strName;
  229. }
  230. public class OracleDriver
  231. {
  232. //(ADDRESS_LIST =
  233. // (ADDRESS = (PROTOCOL = TCP)(HOST = {0})(PORT = 1521))
  234. // )
  235. public OracleConnection _connect;
  236. public void Connect(string severName, string userName, string password)
  237. {
  238. string connectString = "";
  239. connectString += string.Format("Data Source={0};User Id={1};Password={2};", severName, userName, password);
  240. _connect = new OracleConnection(connectString);
  241. }
  242. public bool Open()
  243. {
  244. try
  245. {
  246. _connect.Open();
  247. }
  248. catch (Exception e)
  249. {
  250. MessageBox.Show(e.Message);
  251. return false;
  252. }
  253. return true;
  254. }
  255. public void Close()
  256. {
  257. _connect.Close();
  258. }
  259. public DataTable ExecuteQuery(string sql)
  260. {
  261. OracleDataAdapter dtAdapter = new OracleDataAdapter(sql, _connect);
  262. DataTable dt = new DataTable();
  263. try
  264. {
  265. dtAdapter.Fill(dt);
  266. }
  267. catch (Exception e)
  268. {
  269. MessageBox.Show(e.Message);
  270. }
  271. return dt;
  272. }
  273. }
  274. }
  275. }