PageRenderTime 60ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/branches/HP10.0-Release/Source/nHydrate.Generator/SqlSchemaToModel.cs

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

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