public void GenerateWPDataContext(IRepository repository, string connectionString, string dcPath) { if (dcPath.ToUpperInvariant().EndsWith(".CS") || dcPath.ToUpperInvariant().EndsWith(".VB")) { } else { throw new Exception("DataContext file name must end with either .cs or .vb"); } string sqlMetalPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A\WinSDK-NetFx40Tools", "InstallationFolder", null); if (string.IsNullOrEmpty(sqlMetalPath)) { sqlMetalPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A", "InstallationFolder", string.Empty) + "bin\\NETFX 4.0 Tools\\"; if (string.IsNullOrEmpty(sqlMetalPath)) { throw new Exception("Could not find SQLMetal location in registry"); } } sqlMetalPath = Path.Combine(sqlMetalPath, "sqlmetal.exe"); if (!File.Exists(sqlMetalPath)) { throw new Exception("Could not find SqlMetal in the expected location: " + sqlMetalPath); } string model = Path.GetFileNameWithoutExtension(dcPath).Replace(" ", string.Empty).Replace("#", string.Empty).Replace(".", string.Empty).Replace("-", string.Empty); model = model + "Context"; string parameters = " /provider:SQLCompact /code:\"" + dcPath + "\""; parameters += " /conn:\"" + connectionString + "\""; parameters += " /context:" + model; parameters += " /pluralize"; //parameters += " /serialization:Unidirectional"; string sqlmetalResult = RunSqlMetal(sqlMetalPath, parameters); if (!File.Exists(dcPath)) { throw new Exception("Error during SQL Metal run: " + sqlmetalResult); } string sdfFileName = string.Empty; List<KeyValuePair<string, string>> dbInfo = repository.GetDatabaseInfo(); foreach (var kvp in dbInfo) { if (kvp.Key == "Database") { sdfFileName = kvp.Value; break; } } sdfFileName = Path.GetFileName(sdfFileName); if (dcPath.ToUpperInvariant().EndsWith(".VB")) { FixDataContextVB(dcPath, model, null, sdfFileName, repository); } else { FixDataContextCS(dcPath, model, null, sdfFileName, repository); } }
private void Init(IRepository repository, string outFile) { _outFile = outFile; _repository = repository; _sbScript = new StringBuilder(10485760); _tableNames = _repository.GetAllTableNames(); _allColumns = _repository.GetColumnsFromTable(); _allForeignKeys = repository.GetAllForeignKeys(); _allPrimaryKeys = repository.GetAllPrimaryKeys(); if (_repository.IsServer()) { // Check if datatypes are supported when exporting from server // Either they can be converted, are supported, or an exception is thrown (if not supported) // Currently only sql_variant is not supported foreach (Column col in _allColumns) { col.CharacterMaxLength = Helper.CheckDateColumnLength(col.DataType, col); col.DateFormat = Helper.CheckDateFormat(col.DataType); // Check if the current column points to a unique identity column, // as the two columns' datatypes must match bool refToIdentity = false; Dictionary<string, Constraint> columnForeignKeys = new Dictionary<string, Constraint>(); // Fix for multiple constraints with same columns var _tableKeys = _allForeignKeys.Where(c => c.ConstraintTableName == col.TableName); foreach (var constraint in _tableKeys) { if (!columnForeignKeys.ContainsKey(constraint.Columns.ToString())) { columnForeignKeys.Add(constraint.Columns.ToString(), constraint); } } if (columnForeignKeys.ContainsKey(string.Format("[{0}]", col.ColumnName))) { var refCol = _allColumns.Where(c => c.TableName == columnForeignKeys[string.Format("[{0}]", col.ColumnName)].UniqueConstraintTableName && string.Format("[{0}]", c.ColumnName) == columnForeignKeys[string.Format("[{0}]", col.ColumnName)].UniqueColumnName).Single(); if (refCol != null && refCol.AutoIncrementBy > 0) { refToIdentity = true; } } // This modifies the datatype to be SQL Compact compatible col.DataType = Helper.CheckDataType(col.DataType, col, refToIdentity); } _sbScript.AppendFormat("-- Script Date: {0} {1} - Generated by Export2SqlCe version {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); } else { _sbScript.AppendFormat("-- Script Date: {0} {1} - Generated by ExportSqlCe version {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); } _sbScript.AppendLine(); if (!string.IsNullOrEmpty(_outFile) && !_repository.IsServer()) { _sbScript.Append("-- Database information:"); _sbScript.AppendLine(); foreach (var kv in _repository.GetDatabaseInfo()) { _sbScript.Append("-- "); _sbScript.Append(kv.Key); _sbScript.Append(": "); _sbScript.Append(kv.Value); _sbScript.AppendLine(); } _sbScript.AppendLine(); // Populate all tablenames _sbScript.Append("-- User Table information:"); _sbScript.AppendLine(); _sbScript.Append("-- "); _sbScript.Append("Number of tables: "); _sbScript.Append(_tableNames.Count); _sbScript.AppendLine(); foreach (string tableName in _tableNames) { Int64 rowCount = _repository.GetRowCount(tableName); _sbScript.Append("-- "); _sbScript.Append(tableName); _sbScript.Append(": "); _sbScript.Append(rowCount); _sbScript.Append(" row(s)"); _sbScript.AppendLine(); } _sbScript.AppendLine(); } }