PageRenderTime 67ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/HP10.2/Source/nHydrate.Generator/SqlSchemaToModel.cs

#
C# | 1977 lines | 1378 code | 195 blank | 404 comment | 250 complexity | 8c2f2a756a5bfe68675fefe56aec031f MD5 | raw file
Possible License(s): JSON, CC-BY-SA-3.0

Large files files are truncated, but you can click here to view the full file

  1. #region Copyright (c) 2006-2013 nHydrate.org, All Rights Reserved
  2. // -------------------------------------------------------------------------- *
  3. // NHYDRATE.ORG *
  4. // Copyright (c) 2006-2013 All Rights reserved *
  5. // *
  6. // *
  7. // Permission is hereby granted, free of charge, to any person obtaining a *
  8. // copy of this software and associated documentation files (the "Software"), *
  9. // to deal in the Software without restriction, including without limitation *
  10. // the rights to use, copy, modify, merge, publish, distribute, sublicense, *
  11. // and/or sell copies of the Software, and to permit persons to whom the *
  12. // Software is furnished to do so, subject to the following conditions: *
  13. // *
  14. // The above copyright notice and this permission notice shall be included *
  15. // in all copies or substantial portions of the Software. *
  16. // *
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
  20. // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY *
  21. // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, *
  22. // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE *
  23. // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
  24. // -------------------------------------------------------------------------- *
  25. #endregion
  26. using System;
  27. using System.Collections.Generic;
  28. using System.Data;
  29. using System.Data.SqlClient;
  30. using System.Linq;
  31. using System.Text;
  32. using System.Text.RegularExpressions;
  33. using System.Windows.Forms;
  34. using System.Xml;
  35. using nHydrate.Generator.Common;
  36. using nHydrate.Generator.Common.Logging;
  37. using nHydrate.Generator.Common.Util;
  38. using nHydrate.Generator.Models;
  39. using nHydrate.Generator.Common.GeneratorFramework;
  40. namespace nHydrate.Generator
  41. {
  42. internal enum SqlNativeTypes
  43. {
  44. image = 34,
  45. text = 35,
  46. uniqueidentifier = 36,
  47. date = 40,
  48. time = 41,
  49. datetime2 = 42,
  50. datetimeoffset = 43,
  51. tinyint = 48,
  52. smallint = 52,
  53. @int = 56,
  54. smalldatetime = 58,
  55. real = 59,
  56. money = 60,
  57. datetime = 61,
  58. @float = 62,
  59. sql_variant = 98,
  60. ntext = 99,
  61. bit = 104,
  62. @decimal = 106,
  63. numeric = 108,
  64. smallmoney = 122,
  65. bigint = 127,
  66. varbinary = 165,
  67. varchar = 167,
  68. binary = 173,
  69. @char = 175,
  70. timestamp = 189,
  71. nvarchar = 231,
  72. sysname = 231,
  73. nchar = 239,
  74. hierarchyid = 240,
  75. geometry = 240,
  76. geography = 240,
  77. xml = 241,
  78. }
  79. internal static class SqlSchemaToModel
  80. {
  81. #region Class Members
  82. //private string _connectString;
  83. //private bool _assumeInheritance = true;
  84. #endregion
  85. #region Constructors
  86. //public SqlSchemaToModel(string connectString, bool assumeInheritance)
  87. //{
  88. // this._connectString = connectString;
  89. // _assumeInheritance = assumeInheritance;
  90. //}
  91. #endregion
  92. //#region Events
  93. //public event EventHandler<ProgressEventArgs> Progress;
  94. //protected virtual void OnProgress(ProgressEventArgs e)
  95. //{
  96. // if (this.Progress != null)
  97. // this.Progress(this, e);
  98. //}
  99. //#endregion
  100. ///// <summary>
  101. ///// Load a database schema
  102. ///// </summary>
  103. ///// <param name="project">The project object to load from database</param>
  104. //public bool GetProjectFromSqlSchema(nHydrateGeneratorProject project)
  105. //{
  106. // return this.GetProjectFromSqlSchema(project, true);
  107. //}
  108. public static void SetupNewProject(nHydrateGeneratorProject project, string connectionString)
  109. {
  110. var root = project.RootController.Object as ModelRoot;
  111. var companyName = GetCompanyName(connectionString);
  112. var projectName = GetProjectName(connectionString);
  113. var databaseName = GetDatabaseName(connectionString);
  114. var databaseCollation = GetDatabaseCollation(connectionString);
  115. if (!string.IsNullOrEmpty(companyName))
  116. root.CompanyName = companyName;
  117. if (!string.IsNullOrEmpty(projectName))
  118. root.ProjectName = projectName;
  119. if (!string.IsNullOrEmpty(databaseName))
  120. root.Database.DatabaseName = databaseName;
  121. root.Version = "0.0.0.0";
  122. root.SQLServerType = GetSQLVersion(connectionString);
  123. root.Database.Columns.Clear();
  124. root.Database.Relations.Clear();
  125. root.Database.Tables.Clear();
  126. }
  127. /// <summary>
  128. /// Load a database schema
  129. /// </summary>
  130. /// <param name="project">The project object to load from database</param>
  131. /// <param name="refreshModel">Determines whether to load all model controllers and other UI components</param>
  132. public static bool GetProjectFromSqlSchema(nHydrateGeneratorProject project, string connectionString, bool refreshModel, bool assumeInheritance)
  133. {
  134. try
  135. {
  136. if (!IsValidConnectionString(connectionString))
  137. {
  138. //this.OnProgress(new ProgressEventArgs() { PercentDone = 100 });
  139. GenerationHelper.ShowError("The SQL Server engine could not be found.");
  140. return false;
  141. }
  142. if (!IsSupportedSQLVersion(connectionString))
  143. {
  144. //this.OnProgress(new ProgressEventArgs() { PercentDone = 100 });
  145. GenerationHelper.ShowError("The current version of SQL is not supported.");
  146. return false;
  147. }
  148. var root = project.RootController.Object as ModelRoot;
  149. SetupNewProject(project, connectionString);
  150. var databaseCollation = GetDatabaseCollation(connectionString);
  151. //var root = project.RootController.Object as ModelRoot;
  152. //var companyName = GetCompanyName(connectionString);
  153. //var projectName = GetProjectName(connectionString);
  154. //var databaseName = GetDatabaseName(connectionString);
  155. //var databaseCollation = GetDatabaseCollation(connectionString);
  156. //if (!string.IsNullOrEmpty(companyName))
  157. // root.CompanyName = companyName;
  158. //if (!string.IsNullOrEmpty(projectName))
  159. // root.ProjectName = projectName;
  160. //if (!string.IsNullOrEmpty(databaseName))
  161. // root.Database.DatabaseName = databaseName;
  162. //root.Version = "0.0.0.0";
  163. //root.SQLServerType = GetSQLVersion(connectionString);
  164. //root.Database.Columns.Clear();
  165. //root.Database.Relations.Clear();
  166. //root.Database.Tables.Clear();
  167. //Progress
  168. //this.OnProgress(new ProgressEventArgs() { PercentDone = 0, Text = "Loading..." });
  169. var tableCount = GetTableCount(connectionString);
  170. var tableIndex = 1;
  171. #region Tables
  172. var tableReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlDatabaseTables());
  173. while (tableReader.Read())
  174. {
  175. var startTime1 = DateTime.Now;
  176. var currentTable = root.Database.Tables.Add(tableReader["name"].ToString());
  177. currentTable.DBSchema = tableReader["schema"].ToString();
  178. ////Progress
  179. //this.OnProgress(new ProgressEventArgs()
  180. //{
  181. // PercentDone = (int)(tableIndex * 100.0 / tableCount),
  182. // Text = currentTable.Name
  183. //});
  184. if (!ValidationHelper.ValidDatabaseIdenitifer(currentTable.Name))
  185. {
  186. currentTable.CodeFacade = ValidationHelper.MakeDatabaseIdentifier(currentTable.Name);
  187. }
  188. //If single field table with identity then mark it immutable
  189. if ((currentTable.Columns.Count == 1) && (currentTable.GetColumns().First().Identity == IdentityTypeConstants.Database))
  190. {
  191. currentTable.Immutable = true;
  192. }
  193. //Default to false when importing
  194. currentTable.AllowCreateAudit = false;
  195. currentTable.AllowModifiedAudit = false;
  196. currentTable.AllowTimestamp = false;
  197. #region Table Attributes
  198. if (CanUseExtendedProperty(connectionString))
  199. {
  200. var tableAttributeReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, "SELECT name, value FROM ::fn_listextendedproperty (default,'user', 'dbo', 'table', '" + currentTable.Name + "', default, default)");
  201. while (tableAttributeReader.Read())
  202. {
  203. var attribName = string.Empty;
  204. attribName = tableAttributeReader["name"].ToString();
  205. if (attribName.ToLower().Equals("ms_description"))
  206. {
  207. currentTable.Description = tableAttributeReader["value"].ToString();
  208. }
  209. else if (attribName.ToLower().Equals("generated"))
  210. {
  211. currentTable.Generated = bool.Parse(tableAttributeReader["value"].ToString());
  212. }
  213. else if (attribName.ToLower().Equals("associative"))
  214. {
  215. currentTable.AssociativeTable = bool.Parse(tableAttributeReader["value"].ToString());
  216. }
  217. else if (attribName.ToLower().Equals("hasHistory"))
  218. {
  219. currentTable.HasHistory = bool.Parse(tableAttributeReader["value"].ToString());
  220. }
  221. System.Windows.Forms.Application.DoEvents();
  222. }
  223. tableAttributeReader.Close();
  224. }
  225. #endregion
  226. //System.Windows.Forms.Application.DoEvents();
  227. var endTime1 = DateTime.Now;
  228. //System.Diagnostics.Debug.WriteLine("Table '" + currentTable.Name + "': " + endTime1.Subtract(startTime1).TotalMilliseconds.ToString("###,###,###"));
  229. if (currentTable.Name == "sysdiagrams" ||
  230. currentTable.Name == "__nhydrateschema")
  231. {
  232. root.Database.Tables.Remove(currentTable);
  233. }
  234. tableIndex++;
  235. }
  236. tableReader.Close();
  237. #region Columns
  238. var startTime2 = DateTime.Now;
  239. var columnReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlColumnsForTable());
  240. while (columnReader.Read())
  241. {
  242. var columnName = columnReader["columnName"].ToString();
  243. var tableName = columnReader["tableName"].ToString();
  244. var currentTable = root.Database.Tables.FirstOrDefault(x => x.Name == tableName);
  245. if (currentTable != null)
  246. {
  247. if (StringHelper.Match(columnName, ((ModelRoot)project.RootController.Object).Database.CreatedByColumnName) ||
  248. StringHelper.Match(columnName, ((ModelRoot)project.RootController.Object).Database.CreatedDateColumnName))
  249. {
  250. currentTable.AllowCreateAudit = true;
  251. }
  252. else if (StringHelper.Match(columnName, ((ModelRoot)project.RootController.Object).Database.ModifiedByColumnName) ||
  253. StringHelper.Match(columnName, ((ModelRoot)project.RootController.Object).Database.ModifiedDateColumnName) ||
  254. StringHelper.Match(columnName, "updated_by") || StringHelper.Match(columnName, "updated_date"))
  255. {
  256. currentTable.AllowModifiedAudit = true;
  257. }
  258. else if (StringHelper.Match(columnName, ((ModelRoot)project.RootController.Object).Database.TimestampColumnName))
  259. {
  260. currentTable.AllowTimestamp = true;
  261. }
  262. else
  263. {
  264. var currentColumn = root.Database.Columns.Add(columnName);
  265. if (!ValidationHelper.ValidDatabaseIdenitifer(currentColumn.Name))
  266. {
  267. currentColumn.CodeFacade = ValidationHelper.MakeDatabaseIdentifier(currentColumn.Name);
  268. }
  269. currentColumn.ParentTableRef = currentTable.CreateRef();
  270. currentColumn.AllowNull = bool.Parse(columnReader["allowNull"].ToString());
  271. if (bool.Parse(columnReader["isIdentity"].ToString()))
  272. currentColumn.Identity = IdentityTypeConstants.Database;
  273. else
  274. currentColumn.Identity = IdentityTypeConstants.None;
  275. if (columnReader["isPrimaryKey"] != System.DBNull.Value)
  276. currentColumn.PrimaryKey = true;
  277. //currentColumn.PrimaryKey = bool.Parse(columnReader["isPrimaryKey"].ToString());
  278. try
  279. {
  280. //string columnTypename = columnReader["datatype"].ToString();
  281. //if (StringHelper.Match(columnTypename, "numeric", true))
  282. // currentColumn.DataType = SqlDbType.Decimal;
  283. //else
  284. // currentColumn.DataType = (SqlDbType)Enum.Parse(typeof(SqlDbType), columnTypename, true);
  285. currentColumn.DataType = DatabaseHelper.GetSQLDataType((SqlNativeTypes)int.Parse(columnReader["xtype"].ToString()));
  286. }
  287. catch { }
  288. var defaultvalue = columnReader["defaultValue"].ToString();
  289. SetupDefault(currentColumn, defaultvalue);
  290. currentColumn.Length = (int)columnReader["length"];
  291. //Decimals are a little different
  292. if (currentColumn.DataType == SqlDbType.Decimal)
  293. {
  294. currentColumn.Length = (byte)columnReader["precision"];
  295. currentColumn.Scale = (int)columnReader["scale"];
  296. }
  297. if (columnReader["collation"] != System.DBNull.Value)
  298. {
  299. if (databaseCollation != (string)columnReader["collation"])
  300. currentColumn.Collate = (string)columnReader["collation"];
  301. }
  302. currentTable.Columns.Add(currentColumn.CreateRef());
  303. } //Create New Column
  304. }
  305. }
  306. columnReader.Close();
  307. var endTime2 = DateTime.Now;
  308. //System.Diagnostics.Debug.WriteLine("Table '" + currentTable.Name + "' Load Columns: " + endTime2.Subtract(startTime2).TotalMilliseconds.ToString("###,###,###"));
  309. if (CanUseExtendedProperty(connectionString))
  310. {
  311. foreach (Table table in root.Database.Tables)
  312. {
  313. foreach (var column in table.GetColumns())
  314. {
  315. var startTime3 = DateTime.Now;
  316. var columnAttributeReader = DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, "SELECT name, value FROM ::fn_listextendedproperty (default,'user', 'dbo', 'table', '" + table.Name + "', 'column', '" + column.Name + "')");
  317. while (columnAttributeReader.Read())
  318. {
  319. var attribName = string.Empty;
  320. attribName = columnAttributeReader["name"].ToString();
  321. if (attribName.ToLower().Equals("ms_description"))
  322. {
  323. column.Description = columnAttributeReader["value"].ToString();
  324. }
  325. }
  326. columnAttributeReader.Close();
  327. var endTime3 = DateTime.Now;
  328. //System.Diagnostics.Debug.WriteLine("Time 3: " + endTime3.Subtract(startTime3).TotalMilliseconds.ToString("###,###,###"));
  329. }
  330. }
  331. }
  332. #endregion
  333. #region Columns Extra Info
  334. columnReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlColumnInfoAuxForTable());
  335. while (columnReader.Read())
  336. {
  337. var columnName = columnReader["columnname"].ToString();
  338. var tableName = columnReader["tablename"].ToString();
  339. var currentTable = root.Database.Tables.First(x => x.Name == tableName);
  340. var currentColumn = root.Database.Columns[columnName];
  341. if (currentColumn != null)
  342. {
  343. currentColumn.ComputedColumn = true;
  344. currentColumn.Formula = columnReader["definition"].ToString();
  345. }
  346. }
  347. columnReader.Close();
  348. #endregion
  349. #region Indexes
  350. var indexReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlIndexesForTable());
  351. while (indexReader.Read())
  352. {
  353. var indexName = indexReader["indexname"].ToString();
  354. var columnName = indexReader["columnname"].ToString();
  355. var tableName = indexReader["tableName"].ToString();
  356. var currentTable = root.Database.Tables.FirstOrDefault(x => x.Name == tableName);
  357. if (currentTable != null)
  358. {
  359. var pk = bool.Parse(indexReader["is_primary_key"].ToString());
  360. var column = currentTable.GetColumns().FirstOrDefault(x => x.Name == columnName);
  361. if (column != null && !pk)
  362. column.IsIndexed = true;
  363. }
  364. }
  365. #endregion
  366. #endregion
  367. #region Relations
  368. var startTimeRelation = DateTime.Now;
  369. LoadRelations(project, assumeInheritance, connectionString);
  370. var endTimeRelation = DateTime.Now;
  371. //System.Diagnostics.Debug.WriteLine("Load Relations: " + endTimeRelation.Subtract(startTimeRelation).TotalMilliseconds.ToString("###,###,###"));
  372. #endregion
  373. #region Views
  374. var startTimeV = DateTime.Now;
  375. LoadViews(project, connectionString);
  376. var endTimeV = DateTime.Now;
  377. //System.Diagnostics.Debug.WriteLine("Load Views: " + endTimeV.Subtract(startTimeV).TotalMilliseconds.ToString("###,###,###"));
  378. #endregion
  379. #region Stored Procedures
  380. var startTimeSP = DateTime.Now;
  381. LoadStoredProcedures(project, connectionString);
  382. var endTimeSP = DateTime.Now;
  383. //System.Diagnostics.Debug.WriteLine("Load Stored Procedures: " + endTimeSP.Subtract(startTimeSP).TotalMilliseconds.ToString("###,###,###"));
  384. #endregion
  385. //Refresh the tree
  386. if (refreshModel)
  387. {
  388. //project.RootController.Node.RefreshDeep();
  389. //Thread t = new Thread(new ThreadStart(project.RootController.Node.RefreshDeep));
  390. //t.Start();
  391. }
  392. //Progress
  393. //this.OnProgress(new ProgressEventArgs() { PercentDone = 100, Text = "Complete" });
  394. return true;
  395. }
  396. catch (Exception ex)
  397. {
  398. throw;
  399. }
  400. finally
  401. {
  402. //Progress
  403. //this.OnProgress(new ProgressEventArgs() { PercentDone = 100, Text = "Complete" });
  404. }
  405. }
  406. public static IEnumerable<string> GetTableListFromDatabase(string connectionString)
  407. {
  408. var retval = new List<string>();
  409. var tableReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlDatabaseTables());
  410. while (tableReader.Read())
  411. {
  412. retval.Add(tableReader["name"].ToString());
  413. }
  414. tableReader.Close();
  415. return retval;
  416. }
  417. public static IEnumerable<Column> GetTableDefinitionFromDatabase(string connectionString, string tableName, ModelRoot root)
  418. {
  419. try
  420. {
  421. var retval = new List<Column>();
  422. //Columns
  423. var connection = DatabaseHelper.GetConnection(connectionString);
  424. var columnReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, GetSqlColumnsForTable(tableName));
  425. while (columnReader.Read())
  426. {
  427. var columnName = columnReader["columnName"].ToString();
  428. if (StringHelper.Match(columnName, root.Database.CreatedByColumnName) || StringHelper.Match(columnName, root.Database.CreatedDateColumnName))
  429. {
  430. //Do Nothing
  431. }
  432. else if (StringHelper.Match(columnName, root.Database.ModifiedByColumnName) || StringHelper.Match(columnName, root.Database.ModifiedDateColumnName) ||
  433. StringHelper.Match(columnName, "updated_by") || StringHelper.Match(columnName, "updated_date"))
  434. {
  435. //Do Nothing
  436. }
  437. else if (StringHelper.Match(columnName, root.Database.TimestampColumnName))
  438. {
  439. //Do Nothing
  440. }
  441. else
  442. {
  443. var currentColumn = new Column(root);
  444. currentColumn.Name = columnName;
  445. if (!ValidationHelper.ValidDatabaseIdenitifer(currentColumn.Name))
  446. {
  447. currentColumn.CodeFacade = ValidationHelper.MakeDatabaseIdentifier(currentColumn.Name);
  448. }
  449. //currentColumn.ParentTableRef = currentTable.CreateRef();
  450. currentColumn.AllowNull = bool.Parse(columnReader["allowNull"].ToString());
  451. if (bool.Parse(columnReader["isIdentity"].ToString()))
  452. currentColumn.Identity = IdentityTypeConstants.Database;
  453. else
  454. currentColumn.Identity = IdentityTypeConstants.None;
  455. if (columnReader["isPrimaryKey"] != System.DBNull.Value)
  456. currentColumn.PrimaryKey = true;
  457. //currentColumn.PrimaryKey = bool.Parse(columnReader["isPrimaryKey"].ToString());
  458. try
  459. {
  460. //string columnTypename = columnReader["datatype"].ToString();
  461. //if (StringHelper.Match(columnTypename, "numeric", true))
  462. // currentColumn.DataType = SqlDbType.Decimal;
  463. //else
  464. // currentColumn.DataType = (SqlDbType)Enum.Parse(typeof(SqlDbType), columnTypename, true);
  465. currentColumn.DataType = DatabaseHelper.GetSQLDataType((SqlNativeTypes)int.Parse(columnReader["xtype"].ToString()));
  466. }
  467. catch { }
  468. var defaultvalue = columnReader["defaultValue"].ToString();
  469. SetupDefault(currentColumn, defaultvalue);
  470. currentColumn.Length = (int)columnReader["length"];
  471. if (CanUseExtendedProperty(connectionString))
  472. {
  473. var columnAttributeReader = (SqlDataReader)DatabaseHelper.ExecuteReader(connection, CommandType.Text, "SELECT name, value FROM ::fn_listextendedproperty (default,'user', 'dbo', 'table', '" + tableName + "', 'column', '" + currentColumn + "')");
  474. while (columnAttributeReader.Read())
  475. {
  476. var attribName = string.Empty;
  477. attribName = columnAttributeReader["name"].ToString();
  478. if (attribName.ToLower().Equals("ms_description"))
  479. {
  480. currentColumn.Description = columnAttributeReader["value"].ToString();
  481. }
  482. }
  483. columnAttributeReader.Close();
  484. }
  485. retval.Add(currentColumn);
  486. } //Create New Column
  487. }
  488. columnReader.Close();
  489. return retval;
  490. }
  491. catch (Exception ex)
  492. {
  493. throw;
  494. }
  495. }
  496. private static void SetupDefault(Column field, string defaultvalue)
  497. {
  498. if (defaultvalue == null) defaultvalue = string.Empty;
  499. //This is some sort of default pointer, we do not handle this.
  500. if (defaultvalue.Contains("create default ["))
  501. defaultvalue = string.Empty;
  502. //Just in case some put 'null' in to the default field
  503. if (field.AllowNull && defaultvalue.ToLower() == "null")
  504. defaultvalue = string.Empty;
  505. if (field.IsNumericType || field.DataType == SqlDbType.Bit || field.IsDateType || field.IsBinaryType)
  506. {
  507. field.Default = defaultvalue.Replace("(", string.Empty).Replace(")", string.Empty); //remove any parens
  508. }
  509. else if (field.DataType == SqlDbType.UniqueIdentifier)
  510. {
  511. if (!string.IsNullOrEmpty(defaultvalue) && defaultvalue.Contains("newid"))
  512. field.Default = "newid";
  513. if (!string.IsNullOrEmpty(defaultvalue) && defaultvalue.Contains("newsequentialid"))
  514. field.Default = "newsequentialid";
  515. else
  516. field.Default = defaultvalue.Replace("(", string.Empty).Replace(")", string.Empty).Replace("'", string.Empty); //Format: ('000...0000')
  517. }
  518. else if (field.IsTextType)
  519. {
  520. while (defaultvalue.StartsWith("('")) defaultvalue = defaultvalue.Substring(2, defaultvalue.Length - 2);
  521. while (defaultvalue.EndsWith("')")) defaultvalue = defaultvalue.Substring(0, defaultvalue.Length - 2);
  522. field.Default = defaultvalue;
  523. }
  524. else
  525. field.Default = defaultvalue;
  526. }
  527. #region Private Methods
  528. public static int GetTableCount(string connectionString)
  529. {
  530. var ds = DatabaseHelper.ExecuteDataset(connectionString, "select count(*) from sysobjects where Type = 'U'");
  531. return (int)ds.Tables[0].Rows[0][0];
  532. }
  533. private static void LoadViews(nHydrateGeneratorProject project, string connectionString)
  534. {
  535. var root = (ModelRoot)project.RootController.Object;
  536. var dsView = DatabaseHelper.ExecuteDataset(connectionString, GetSqlForViews());
  537. var dsViewColumn = DatabaseHelper.ExecuteDataset(connectionString, GetSqlForViewsColumns());
  538. //Add the Views
  539. if (dsView.Tables.Count > 0)
  540. {
  541. foreach (DataRow rowView in dsView.Tables[0].Rows)
  542. {
  543. var name = (string)rowView["name"];
  544. var sql = (string)rowView["definition"];
  545. var customView = root.Database.CustomViews.FirstOrDefault(x => x.Name == name);
  546. if (customView == null)
  547. {
  548. customView = ((ModelRoot)project.RootController.Object).Database.CustomViews.Add();
  549. customView.Name = name;
  550. var regEx = new Regex(@"CREATE VIEW.*[\r\n]*AS.*[\r\n]*([\s\S\r\n]*)");
  551. var match = regEx.Match(sql);
  552. if (match != null && match.Groups != null && match.Groups.Count == 2)
  553. sql = match.Groups[1].Value;
  554. customView.SQL = sql;
  555. }
  556. }
  557. }
  558. //Add the columns
  559. if (dsViewColumn.Tables.Count > 0)
  560. {
  561. foreach (DataRow rowView in dsViewColumn.Tables[0].Rows)
  562. {
  563. var viewName = (string)rowView["viewname"];
  564. var columnName = (string)rowView["columnname"];
  565. var length = int.Parse(rowView["max_length"].ToString());
  566. var customView = root.Database.CustomViews.FirstOrDefault(x => x.Name == viewName);
  567. if (customView != null)
  568. {
  569. var column = root.Database.CustomViewColumns.Add();
  570. column.Name = columnName;
  571. column.DataType = DatabaseHelper.GetSQLDataType((SqlNativeTypes)int.Parse(rowView["system_type_id"].ToString()));
  572. column.Length = length;
  573. column.Scale = int.Parse(rowView["scale"].ToString());
  574. customView.Columns.Add(column.CreateRef());
  575. column.ParentViewRef = customView.CreateRef();
  576. }
  577. }
  578. }
  579. }
  580. private static void LoadStoredProcedures(nHydrateGeneratorProject project, string connectionString)
  581. {
  582. try
  583. {
  584. var root = (ModelRoot)project.RootController.Object;
  585. var dsSP = DatabaseHelper.ExecuteDataset(connectionString, GetSqlForStoredProcedures((project.Model as ModelRoot).StoredProcedurePrefix));
  586. var dsSPColumn = DatabaseHelper.ExecuteDataset(connectionString, GetSqlForStoredProceduresParameters((project.Model as ModelRoot).StoredProcedurePrefix));
  587. //Add the Stored Procedures
  588. foreach (DataRow rowSP in dsSP.Tables[0].Rows)
  589. {
  590. var id = (int)rowSP["id"];
  591. var name = (string)rowSP["name"];
  592. var customStoredProcedure = root.Database.CustomStoredProcedures.FirstOrDefault(x => x.Name == name);
  593. if (customStoredProcedure == null)
  594. {
  595. customStoredProcedure = ((ModelRoot)project.RootController.Object).Database.CustomStoredProcedures.Add();
  596. customStoredProcedure.Name = name;
  597. customStoredProcedure.SQL = GetSqlForStoredProceduresBody(name, connectionString);
  598. }
  599. }
  600. ////Add the columns
  601. //foreach (DataRow rowSP in dsSPColumn.Tables[0].Rows)
  602. //{
  603. // int id = (int)rowSP["id"];
  604. // string spName = (string)rowSP["name"];
  605. // string name = (string)rowSP["ColName"];
  606. // string typeName = (string)rowSP["ColType"];
  607. // CustomStoredProcedure customStoredProcedure = root.Database.CustomStoredProcedures.FirstOrDefault(x => x.Name == spName);
  608. // if (customStoredProcedure != null)
  609. // {
  610. // CustomStoredProcedureColumn column = root.Database.CustomStoredProcedureColumns.Add();
  611. // column.Name = name;
  612. // column.DataType = DatabaseHelper.GetSQLDataType(typeName);
  613. // customStoredProcedure.Columns.Add(column.CreateRef());
  614. // column.ParentRef = customStoredProcedure.CreateRef();
  615. // }
  616. //}
  617. //Add the parameters
  618. foreach (DataRow rowSP in dsSPColumn.Tables[0].Rows)
  619. {
  620. var id = (int)rowSP["id"];
  621. var spName = (string)rowSP["name"];
  622. var name = (string)rowSP["ColName"];
  623. var typeName = (string)rowSP["ColType"];
  624. var length = int.Parse(rowSP["length"].ToString());
  625. var customStoredProcedure = root.Database.CustomStoredProcedures.FirstOrDefault(x => x.Name == spName);
  626. if (customStoredProcedure != null)
  627. {
  628. var parameter = root.Database.CustomRetrieveRuleParameters.Add();
  629. parameter.Name = name.Replace("@", string.Empty);
  630. parameter.DataType = DatabaseHelper.GetSQLDataType((SqlNativeTypes)int.Parse(rowSP["xtype"].ToString()));
  631. parameter.Length = length;
  632. customStoredProcedure.Parameters.Add(parameter.CreateRef());
  633. parameter.ParentTableRef = customStoredProcedure.CreateRef();
  634. }
  635. }
  636. }
  637. catch (Exception ex)
  638. {
  639. throw;
  640. }
  641. }
  642. public static void LoadRelations(nHydrateGeneratorProject project, bool assumeInheritance, string connectionString)
  643. {
  644. var root = (ModelRoot)project.RootController.Object;
  645. var dsRelationship = DatabaseHelper.ExecuteDataset(connectionString, GetSqlForRelationships());
  646. foreach (DataRow rowRelationship in dsRelationship.Tables[0].Rows)
  647. {
  648. var constraintName = rowRelationship["FK_CONSTRAINT_NAME"].ToString();
  649. var parentTableName = (string)rowRelationship["UQ_TABLE_NAME"];
  650. var childTableName = (string)rowRelationship["FK_TABLE_NAME"];
  651. var parentTable = root.Database.Tables[parentTableName];
  652. var childTable = root.Database.Tables[childTableName];
  653. if ((parentTable != null) && (childTable != null))
  654. {
  655. Relation relation = null;
  656. var isAdd = false;
  657. if (!root.Database.Relations.Contains(constraintName))
  658. {
  659. var roleName = string.Empty;
  660. relation = root.Database.Relations.Add();
  661. relation.ParentTableRef = parentTable.CreateRef();
  662. relation.ChildTableRef = childTable.CreateRef();
  663. relation.ConstraintName = constraintName;
  664. var search = ("_" + childTable.DatabaseName + "_" + parentTable.DatabaseName).ToLower();
  665. roleName = constraintName.ToLower().Replace(search, string.Empty);
  666. if (roleName.Length >= 3) roleName = roleName.Remove(0, 3);
  667. var v = roleName.ToLower();
  668. if (v != "fk") relation.RoleName = v;
  669. isAdd = true;
  670. }
  671. else
  672. {
  673. relation = root.Database.Relations.GetByName(constraintName);
  674. }
  675. //add the column relationship to the relation
  676. var columnRelationship = new ColumnRelationship(relation.Root);
  677. var parentColumnName = (string)rowRelationship["UQ_COLUMN_NAME"];
  678. var childColumnName = (string)rowRelationship["FK_COLUMN_NAME"];
  679. var parentColumns = parentTable.GetColumns().ToList();
  680. var childColumns = childTable.GetColumns().ToList();
  681. if (parentColumns.Count(x => x.Name == parentColumnName) == 1 && (childColumns.Count(x => x.Name == childColumnName) == 1))
  682. {
  683. var parentColumn = parentTable.Columns[parentColumnName].Object as Column;
  684. var childColumn = childTable.Columns[childColumnName].Object as Column;
  685. columnRelationship.ParentColumnRef = parentColumn.CreateRef();
  686. columnRelationship.ChildColumnRef = childColumn.CreateRef();
  687. relation.ColumnRelationships.Add(columnRelationship);
  688. //ONLY ADD THIS RELATION IF ALL WENT WELL
  689. if (isAdd)
  690. parentTable.Relationships.Add(relation.CreateRef());
  691. }
  692. else
  693. {
  694. System.Diagnostics.Debug.Write(string.Empty);
  695. }
  696. } //Not Contains constraint
  697. }
  698. //Map parent tables if there is 1-1 relation and PK match
  699. //Make sure we have choosen to assume inheritance
  700. if (assumeInheritance)
  701. {
  702. foreach (Relation relation in root.Database.Relations)
  703. {
  704. if (relation.IsOneToOne)
  705. {
  706. var parentTable = (Table)relation.ParentTableRef.Object;
  707. var childTable = (Table)relation.ChildTableRef.Object;
  708. if (parentTable.PrimaryKeyColumns.Count == childTable.PrimaryKeyColumns.Count)
  709. {
  710. var pkMatch = true;
  711. foreach (var k in parentTable.PrimaryKeyColumns)
  712. {
  713. pkMatch |= (childTable.PrimaryKeyColumns.Count(x => x.Name == k.Name) == 1);
  714. }
  715. if (pkMatch && childTable.CanInherit(parentTable))
  716. {
  717. childTable.ParentTable = parentTable;
  718. }
  719. }
  720. }
  721. }
  722. }
  723. //Check for associative tables
  724. foreach (Relation relation in root.Database.Relations)
  725. {
  726. var parentTable = (Table)relation.ParentTableRef.Object;
  727. var childTable = (Table)relation.ChildTableRef.Object;
  728. //If there are 2 PK in the child table and that is all the columns
  729. //and it is a base table
  730. if ((childTable.PrimaryKeyColumns.Count == 2) &&
  731. (childTable.Columns.Count == 2) &&
  732. childTable.ParentTable == null)
  733. {
  734. //If child table has 2 relations comming in
  735. var allRelations = childTable.GetRelationsWhereChild();
  736. if (allRelations.Count() == 2)
  737. {
  738. //Relation relation2 = allRelations.FirstOrDefault(x => x != relation);
  739. //Table parentTable2 = (Table)relation2.ParentTableRef.Object;
  740. childTable.AssociativeTable = true;
  741. }
  742. }
  743. }
  744. }
  745. public static bool IsValidConnectionString(string connectionString)
  746. {
  747. var valid = false;
  748. var conn = new System.Data.SqlClient.SqlConnection();
  749. try
  750. {
  751. conn.ConnectionString = connectionString;
  752. conn.Open();
  753. valid = true;
  754. }
  755. catch (Exception ex)
  756. {
  757. valid = false;
  758. }
  759. finally
  760. {
  761. conn.Close();
  762. }
  763. return valid;
  764. }
  765. public static bool IsSupportedSQLVersion(string connectionString)
  766. {
  767. var ds = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('productversion')");
  768. var version = (string)ds.Tables[0].Rows[0][0];
  769. if (version.StartsWith("10."))
  770. return true;
  771. else if (version.StartsWith("9."))
  772. return true;
  773. else
  774. return false;
  775. }
  776. public static SQLServerTypeConstants GetSQLVersion(string connectionString)
  777. {
  778. var ds = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('productversion')");
  779. var version = (string)ds.Tables[0].Rows[0][0];
  780. if (version.StartsWith("10."))
  781. {
  782. var ds2 = DatabaseHelper.ExecuteDataset(connectionString, "SELECT SERVERPROPERTY('Edition')");
  783. var version2 = (string)ds2.Tables[0].Rows[0][0];
  784. if (version2 == "SQL Azure")
  785. return SQLServerTypeConstants.SQLAzure;
  786. else
  787. return SQLServerTypeConstants.SQL2008;
  788. }
  789. else
  790. {
  791. return SQLServerTypeConstants.SQL2005;
  792. }
  793. }
  794. private static bool? extendedPropertyEnabled = null;
  795. private static bool CanUseExtendedProperty(string connectionString)
  796. {
  797. if (extendedPropertyEnabled == null)
  798. {
  799. var conn = new System.Data.SqlClient.SqlConnection();
  800. try
  801. {
  802. conn.ConnectionString = connectionString;
  803. conn.Open();
  804. var cmdGetExtProp = new SqlCommand();
  805. cmdGetExtProp.CommandText = "SELECT value FROM ::fn_listextendedproperty('', '', '', '', '', '', '')";
  806. cmdGetExtProp.CommandType = System.Data.CommandType.Text;
  807. cmdGetExtProp.Connection = conn;
  808. cmdGetExtProp.ExecuteNonQuery();
  809. extendedPropertyEnabled = true;
  810. }
  811. catch (Exception ex)
  812. {
  813. extendedPropertyEnabled = false;
  814. }
  815. finally
  816. {
  817. if (conn != null)
  818. conn.Close();
  819. }
  820. }
  821. return extendedPropertyEnabled.Value;
  822. }
  823. public static string GetProjectName(string connectionString)
  824. {
  825. string retval = null;
  826. if (CanUseExtendedProperty(connectionString))
  827. {
  828. var reader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, "SELECT value FROM ::fn_listextendedproperty ( N'projectName', NULL, NULL,NULL, NULL,NULL,NULL)");
  829. if (reader.Read()) retval = reader["value"].ToString();
  830. reader.Close();
  831. }
  832. return retval;
  833. }
  834. public static string GetCompanyName(string connectionString)
  835. {
  836. string retval = null;
  837. if (CanUseExtendedProperty(connectionString))
  838. {
  839. try
  840. {
  841. var reader = (SqlDataReader)DatabaseHelper.ExecuteReader(connectionString, CommandType.Text, "SELECT value FROM ::fn_listextendedproperty ( N'companyName',NULL, NULL,NULL, NULL,NULL,NULL)");
  842. if (reader.Read()) retval = reader["value"].ToString();
  843. reader.Close();
  844. }
  845. catch (Exception ex)
  846. {
  847. nHydrateLog.LogError(ex);
  848. throw ex;
  849. }
  850. }
  851. return retval;
  852. }
  853. public static string GetDatabaseName(string connectionString)
  854. {
  855. return (new System.Data.SqlClient.SqlConnection(connectionString)).Database;
  856. }
  857. private static string GetSqlDatabaseTables()
  858. {
  859. var sb = new StringBuilder();
  860. sb.AppendLine("DECLARE @bar varchar(150)");
  861. sb.AppendLine("DECLARE @val varchar(150)");
  862. sb.AppendLine("DECLARE @tab table");
  863. sb.AppendLine("(");
  864. sb.AppendLine("xName varchar(150) NOT NULL,");
  865. sb.AppendLine("xValue varchar(150) NULL,");
  866. sb.AppendLine("xSchema varchar(150) NOT NULL");
  867. sb.AppendLine(")");
  868. sb.AppendLine("INSERT INTO @tab SELECT so.name, null, sc.name [schema] FROM sys.tables so INNER JOIN sys.schemas sc ON so.schema_id = sc.schema_id WHERE so.name <> 'dtproperties' AND (so.name <> 'sysdiagrams') AND (so.name <> '__nhydrateschema') AND NOT (so.name like '__AUDIT__%')");
  869. //sb.AppendLine("SET @bar = (SELECT TOP 1 xName FROM @tab ORDER BY xName ASC)");
  870. //sb.AppendLine("WHILE @bar is not null");
  871. //sb.AppendLine("BEGIN");
  872. //sb.AppendLine("SET @val = (SELECT CONVERT(varchar(150), value) FROM ::fn_listextendedproperty ( N'selectionCriteria', N'user', N'dbo', N'table',@bar,NULL,NULL))");
  873. //sb.AppendLine("UPDATE @tab SET xValue = @val where xName = @bar");
  874. //sb.AppendLine("SET @bar = (SELECT TOP 1 xName FROM @tab where xName > @bar ORDER BY xName ASC)");
  875. //sb.AppendLine("END");
  876. sb.AppendLine("select xName as name, xSchema as [schema], xValue selectionCriteria from @tab WHERE xName <> 'dtproperties' ORDER BY xName");
  877. return sb.ToString();
  878. }
  879. private static string GetSqlColumsDescription(string tableName)
  880. {
  881. var sb = new StringBuilder();
  882. sb.AppendLine("SELECT sys.objects.name AS TableName, sys.columns.name AS ColumnName,");
  883. sb.AppendLine(" ep.value AS Description");
  884. sb.AppendLine("FROM sys.objects");
  885. sb.AppendLine("INNER JOIN sys.columns ON sys.objects.object_id = sys.columns.object_id");
  886. sb.AppendLine("CROSS APPLY fn_listextendedproperty(default,");
  887. sb.AppendLine(" 'SCHEMA', schema_name(schema_id),");
  888. sb.AppendLine(" 'TABLE', sys.objects.name, 'COLUMN', sys.columns.name) ep");
  889. sb.AppendLine("WHERE sys.objects.name = '" + tableName + "'");
  890. return sb.ToString();
  891. }
  892. public static string GetDatabaseCollation(string connectionString)
  893. {
  894. System.Data.SqlClient.SqlConnection connection = null;
  895. try
  896. {
  897. var sql = "SELECT DATABASEPROPERTYEX('" + GetDatabaseName(connectionString) + "', 'Collation') SQLCOLLATION";
  898. connection = new System.Data.SqlClient.SqlConnection(connectionString);
  899. var command = new SqlCommand(sql, connection);
  900. connection.Open();
  901. var retval = (string)command.ExecuteScalar();
  902. return retval;
  903. }
  904. catch (Exception ex)
  905. {
  906. throw;
  907. }
  908. finally
  909. {
  910. if (connection != null && connection.State == ConnectionState.Open)
  911. connection.Close();
  912. }
  913. }
  914. private static string GetSqlColumnInfoAuxForTable()
  915. {
  916. var sb = new StringBuilder();
  917. sb.AppendLine("select o.name as tablename, c.name as columnname, c.definition from sys.computed_columns c inner join sys.objects o on c.object_id = o.object_id");
  918. return sb.ToString();
  919. }
  920. private static string GetSqlIndexesForTable()
  921. {
  922. var sb = new StringBuilder();
  923. sb.AppendLine("select t.name as tablename, i.name as indexname, c.name as columnname, i.is_primary_key");
  924. sb.AppendLine("from sys.tables t");
  925. sb.AppendLine("inner join sys.indexes i on i.object_id = t.object_id");
  926. sb.AppendLine("inner join sys.index_columns ic on ic.object_id = t.object_id");
  927. sb.AppendLine("inner join sys.columns c on c.object_id = t.object_id and");
  928. sb.AppendLine("ic.column_id = c.column_id");
  929. //sb.AppendLine("select o.name as tablename, i.name as indexname, i.is_primary_key from sys.objects o inner join sys.indexes i on o.object_id = i.object_id where o.[type] = 'U'");
  930. return sb.ToString();
  931. }
  932. private static string GetSqlColumnsForTable()
  933. {
  934. return GetSqlColumnsForTable(null);
  935. }
  936. private static string GetSqlColumnsForTable(string tableName)
  937. {
  938. var sb = new StringBuilder();
  939. sb.AppendLine(" SELECT ");
  940. sb.AppendLine(" c.ORDINAL_POSITION as colorder,");
  941. sb.AppendLine(" c.TABLE_NAME as tablename,");
  942. sb.AppendLine(" c.COLUMN_NAME as columnname,");
  943. sb.AppendLine("(");
  944. sb.AppendLine("select top 1 c1.name");
  945. sb.AppendLine("from sys.indexes i");
  946. sb.AppendLine("join sysobjects o ON i.object_id = o.id");
  947. sb.AppendLine("join sysobjects pk ON i.name = pk.name");
  948. sb.AppendLine("AND pk.parent_obj = i.object_id");
  949. sb.AppendLine("AND pk.xtype = 'PK'");
  950. sb.AppendLine("join sys.index_columns ik on i.object_id = ik.object_id");
  951. sb.AppendLine("and i.index_id = ik.index_id");
  952. sb.AppendLine("join syscolumns c1 ON ik.object_id = c1.id");
  953. sb.AppendLine("AND ik.column_id = c1.colid");
  954. sb.AppendLine("AND c1.name = c.COLUMN_NAME");
  955. sb.AppendLine("where o.name = c.TABLE_NAME");
  956. sb.AppendLine(") as [isPrimaryKey],");
  957. sb.AppendLine(" case WHEN");
  958. sb.AppendLine(" (");
  959. sb.AppendLine(" SELECT ");
  960. sb.AppendLine(" count(*) ");
  961. sb.AppendLine(" FROM ");
  962. sb.AppendLine(" INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE foreignkeyccu");
  963. sb.AppendLine(" INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS foreignkeytc on foreignkeyccu.CONSTRAINT_NAME = foreignkeytc.CONSTRAINT_NAME AND");
  964. sb.AppendLine(" foreignkeyccu.CONSTRAINT_SCHEMA = foreignkeytc.CONSTRAINT_SCHEMA AND");
  965. sb.AppendLine(" foreignkeytc.CONSTRAINT_TYPE = 'FOREIGN KEY'");
  966. sb.AppendLine(" WHERE");
  967. sb.AppendLine(" foreignkeyccu.TABLE_SCHEMA = c.TABLE_SCHEMA AND");
  968. sb.AppendLine(" foreignkeyccu.TABLE_NAME = c.TABLE_NAME AND");
  969. sb.AppendLine(" foreignkeyccu.COLUMN_NAME = c.COLUMN_NAME ");
  970. sb.AppendLine(" ) > 0 THEN 'true' ELSE 'false' END as isForeignKey,");
  971. sb.AppendLine(" c.DATA_TYPE as datatype,");
  972. sb.AppendLine(" s.xtype,");
  973. sb.AppendLine(" c.numeric_precision AS [precision], c.numeric_scale AS [scale],");
  974. sb.AppendLine(" case when c.CHARACTER_MAXIMUM_LENGTH is null or c.CHARACTER_MAXIMUM_LENGTH > 8000 then s.length else c.CHARACTER_MAXIMUM_LENGTH end as length,");
  975. sb.AppendLine(" case when c.IS_NULLABLE = 'No' then 'false' else 'true' end as allowNull, ");
  976. //sb.AppendLine(" case when c.COLUMN_DEFAULT is null then '' else REPLACE(REPLACE(REPLACE(REPLACE(c.COLUMN_DEFAULT,'(N''',''),')',''),'(',''),'''','') end as defaultValue,");
  977. sb.AppendLine(" case when c.COLUMN_DEFAULT is null then '' else c.COLUMN_DEFAULT end as defaultValue,");
  978. sb.AppendLine(" case when COLUMNPROPERTY(OBJECT_ID(c.TABLE_SCHEMA+'.'+c.TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 then 'true' else 'false' end as isIdentity,");
  979. sb.AppendLine(" collation");
  980. sb.AppendLine(" FROM ");
  981. sb.AppendLine(" INFORMATION_SCHEMA.COLUMNS c ");
  982. sb.AppendLine(" INNER JOIN systypes s on s.name = c.DATA_TYPE");
  983. if (!string.IsNullOrEmpty(tableName))
  984. sb.AppendLine(" WHERE c.TABLE_NAME = '" + tableName + "'");
  985. sb.AppendLine(" ORDER BY");
  986. sb.AppendLine(" c.TABLE_NAME,");
  987. sb.AppendLine(" c.COLUMN_NAME");
  988. return sb.ToString();
  989. }
  990. private static string GetSqlForRelationships()
  991. {
  992. var sb = new StringBuilder();
  993. sb.AppendLine("SELECT ");
  994. sb.AppendLine(" KCU1.CONSTRAINT_NAME AS 'FK_CONSTRAINT_NAME'");
  995. sb.AppendLine(" , KCU1.TABLE_NAME AS 'FK_TABLE_NAME'");
  996. sb.AppendLine(" , KCU1.COLUMN_NAME AS 'FK_COLUMN_NAME' ");
  997. sb.AppendLine(" , KCU2.TABLE_NAME AS 'UQ_TABLE_NAME'");
  998. sb.AppendLine(" , KCU2.COLUMN_NAME AS 'UQ_COLUMN_NAME' ");
  999. sb.AppendLine("FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC");
  1000. sb.AppendLine("JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1");
  1001. sb.AppendLine("ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG ");
  1002. sb.AppendLine(" AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA");
  1003. sb.AppendLine(" AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME");
  1004. sb.AppendLine("JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2");
  1005. sb.AppendLine("ON KCU2.CONSTRAINT_CATALOG = ");
  1006. sb.AppendLine("RC.UNIQUE_CONSTRAINT_CATALOG ");
  1007. sb.AppendLine(" AND KCU2.CONSTRAINT_SCHEMA = ");
  1008. sb.AppendLine("RC.UNIQUE_CONSTRAINT_SCHEMA");
  1009. sb.AppendLine(" AND KCU2.CONSTRAINT_NAME = ");
  1010. sb.AppendLine("RC.UNIQUE_CONSTRAINT_NAME");
  1011. sb.AppendLine(" AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION");
  1012. sb.AppendLine("ORDER BY");
  1013. sb.AppendLine(" KCU1.CONSTRAINT_NAME,");
  1014. sb.AppendLine(" KCU1.ORDINAL_POSITION");
  1015. return sb.ToString();
  1016. }
  1017. private static string GetSqlForViews()
  1018. {
  1019. var sb = new StringBuilder();
  1020. sb.AppendLine("select v.name, m.definition from sys.views v inner join sys.sql_modules m on v.object_id = m.object_id");
  1021. return sb.ToString();
  1022. }
  1023. private static string GetSqlForViewsColumns()
  1024. {
  1025. var sb = new StringBuilder();
  1026. sb.AppendLine("select v.name as viewname, c.name as columnname, c.system_type_id, c.max_length, c.precision, c.scale, c.is_nullable from sys.views v inner join sys.columns c on v.object_id = c.object_id order by v.name, c.name");
  1027. return sb.ToString();
  1028. }
  1029. private static string GetSqlForStoredProceduresParameters(string spPrefix)
  1030. {
  1031. var sb = new StringBuilder();
  1032. sb.AppendLine("SELECT dbo.syscolumns.xtype, dbo.sysobjects.name, dbo.sysobjects.id,");
  1033. sb.AppendLine(" dbo.syscolumns.name AS ColName,");
  1034. sb.AppendLine(" dbo.systypes.name AS ColType,");
  1035. sb.AppendLine(" dbo.syscolumns.length");
  1036. sb.AppendLine("FROM dbo.sysobjects INNER JOIN");
  1037. sb.AppendLine(" dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id INNER JOIN");
  1038. sb.AppendLine(" dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype");
  1039. sb.AppendLine("WHERE (dbo.sysobjects.category = 0) AND");
  1040. sb.AppendLine(" (dbo.sysobjects.xtype = 'P') AND");
  1041. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE '" + spPrefix + "_%') AND");
  1042. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'sp[_]%diagram%') AND");
  1043. sb.AppendLine(" dbo.systypes.name <> 'sysname' AND");
  1044. sb.AppendLine(" (dbo.sysobjects.uid in (select uid from dbo.sysusers))");
  1045. sb.AppendLine("ORDER BY");
  1046. sb.AppendLine(" dbo.sysobjects.name, dbo.syscolumns.name");
  1047. return sb.ToString();
  1048. }
  1049. private static string GetSqlForStoredProceduresBody(string spName, string connectionString)
  1050. {
  1051. var sb = new StringBuilder();
  1052. var ds = DatabaseHelper.ExecuteDataset(connectionString, "sp_helptext [" + spName + "]");
  1053. if (ds.Tables.Count > 0)
  1054. {
  1055. foreach (DataRow dr in ds.Tables[0].Rows)
  1056. {
  1057. sb.Append((string)dr[0]);
  1058. }
  1059. var arr = sb.ToString().Split('\n');
  1060. sb = new StringBuilder();
  1061. var inBody = false;
  1062. foreach (var lineText in arr)
  1063. {
  1064. if (inBody)
  1065. {
  1066. sb.AppendLine(lineText);
  1067. }
  1068. else if (!inBody && lineText.ToLower() == "as")
  1069. {
  1070. inBody = true;
  1071. }
  1072. }
  1073. }
  1074. return sb.ToString();
  1075. }
  1076. private static string GetSqlForStoredProcedures(string spPrefix)
  1077. {
  1078. var sb = new StringBuilder();
  1079. sb.AppendLine("SELECT dbo.sysobjects.id, dbo.sysobjects.xtype, dbo.sysobjects.name");
  1080. sb.AppendLine("FROM dbo.sysobjects");
  1081. sb.AppendLine("WHERE (dbo.sysobjects.category = 0) AND");
  1082. sb.AppendLine(" (dbo.sysobjects.xtype = 'P') AND");
  1083. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE '" + spPrefix + "_%') AND");
  1084. sb.AppendLine(" NOT (dbo.sysobjects.name LIKE 'sp[_]%diagram%') AND");
  1085. sb.AppendLine(" (dbo.sysobjects.uid in (select uid from dbo.sysusers))");
  1086. sb.AppendLine("ORDER BY dbo.sysobjects.name");
  1087. return sb.ToString();
  1088. }
  1089. //private static string GetSqlForForeignKeys(string parentTable, string childTable, string constraintName)
  1090. //{
  1091. // var sb = new StringBuilder();
  1092. // sb.Append("DECLARE @parent_table varchar(256) ");
  1093. // sb.Append("DECLARE @child_table varchar(256) ");
  1094. // sb.Append("DECLARE @constraint varchar(256) ");
  1095. // sb.Append("SET @parent_table = '").Append(parentTable).Append("' ");
  1096. // sb.Append("SET @child_table = '").Append(childTable).Append("' ");
  1097. // sb.Append("SET @constraint = '").Append(constraintName).Append("' ");
  1098. // sb.Append("DECLARE @FKeys TABLE (parentTable varchar(100) NOT NULL, childTable varchar(100) NOT NULL, childColumn varchar(100) NOT NULL, constid int NOT NULL, keyno smallint NOT NULL ) ");
  1099. // sb.Append("DECLARE @PKeys TABLE (parentTable varchar(100) NOT NULL, childTable varchar(100) NOT NULL, parentColumn varchar(100) NOT NULL, constid int NOT NULL, keyno smallint NOT NULL ) ");
  1100. // sb.Append("INSERT INTO @FKeys SELECT DISTINCT parent.name parentTable, child.name childTable, ");
  1101. // sb.Append(" syscolumns.name as childColumn, sysforeignkeys.constid, sysforeignkeys.keyno FROM sysforeignkeys ");
  1102. // sb.Append(" inner join sysobjects child on fkeyid = child.id ");
  1103. // sb.Append(" inner join sysobjects parent on rkeyid = parent.id ");
  1104. // sb.Append(" inner join syscolumns on syscolumns.id = sysforeignkeys.fkeyid AND syscolumns.colorder = sysforeignkeys.fkey ");
  1105. // sb.Append("INSERT INTO @PKeys ");
  1106. // sb.Append("SELECT parent.name parentTable, child.name childTable, syscolumns.name as parentColumn, sysforeignkeys.constid, sysforeignkeys.keyno ");
  1107. // sb.Append("FROM ");
  1108. // sb.Append(" sysforeignkeys ");
  1109. // sb.Append(" inner join sysobjects child on fkeyid = child.id ");
  1110. // sb.Append(" inner join sysobjects parent on rkeyid = parent.id ");
  1111. // sb.Append(" inner join syscolumns on syscolumns.id = sysforeignkeys.rkeyid AND syscolumns.colorder = sysforeignkeys.rkey ");
  1112. // sb.Append("SELECT ");
  1113. // sb.Append(" p.parentTable , ");
  1114. // sb.Append(" p.parentColumn, ");
  1115. // sb.Append(" f.childTable, ");
  1116. // sb.Append(" f.ChildColumn , ");
  1117. // sb.Append(" so.name as roleName ");
  1118. // sb.Append(" FROM @…

Large files files are truncated, but you can click here to view the full file