/************************************************************************************ * * Umbraco Data Layer * MIT Licensed work * ©2008 Ruben Verborgh * ***********************************************************************************/ using System; using System.Collections.Generic; using System.Data; using System.Data.SqlServerCe; using System.Linq; using System.Xml; using System.Diagnostics; using umbraco.DataLayer; using umbraco.DataLayer.SqlHelpers.SqlServer; namespace SqlCE4Umbraco { /// /// Sql Helper for an SQL Server database. /// public class SqlCEHelper : SqlHelper { /// /// Initializes a new instance of the class. /// /// The connection string. public SqlCEHelper(string connectionString) : base(connectionString) { m_Utility = new SqlCEUtility(this); } /// /// Checks if the actual database exists, if it doesn't then it will create it /// internal void CreateEmptyDatabase() { var localConnection = new SqlCeConnection(ConnectionString); if (!System.IO.File.Exists(localConnection.Database)) { var sqlCeEngine = new SqlCeEngine(ConnectionString); sqlCeEngine.CreateDatabase(); } } /// /// Most likely only will be used for unit tests but will remove all tables from the database /// internal void ClearDatabase() { var localConnection = new SqlCeConnection(ConnectionString); var dbFile = localConnection.Database; if (System.IO.File.Exists(dbFile)) { var tables = new List(); using (var reader = ExecuteReader("select table_name from information_schema.tables where TABLE_TYPE <> 'VIEW'")) { while (reader.Read()) { tables.Add(reader.GetString("TABLE_NAME")); } } while(tables.Any()) { for (var i = 0; i < tables.Count; i++) { var dropTable = "DROP TABLE " + tables[i]; try { ExecuteNonQuery(dropTable); tables.Remove(tables[i]); } catch (SqlHelperException ex) { //this will occur because there is no cascade option, so we just wanna try the next one } } } } } /// /// Creates a new parameter for use with this specific implementation of ISqlHelper. /// /// Name of the parameter. /// Value of the parameter. /// A new parameter of the correct type. /// Abstract factory pattern public override IParameter CreateParameter(string parameterName, object value) { return new SqlCEParameter(parameterName, value); } /// /// Executes a command that returns a single value. /// /// The command text. /// The parameters. /// The return value of the command. protected override object ExecuteScalar(string commandText, SqlCeParameter[] parameters) { #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteScalar: " + commandText); #endif return SqlCeApplicationBlock.ExecuteScalar(ConnectionString, CommandType.Text, commandText, parameters); } /// /// Executes a command and returns the number of rows affected. /// /// The command text. /// The parameters. /// /// The number of rows affected by the command. /// protected override int ExecuteNonQuery(string commandText, SqlCeParameter[] parameters) { #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteNonQuery: " + commandText); #endif return SqlCeApplicationBlock.ExecuteNonQuery(ConnectionString, CommandType.Text, commandText, parameters); } /// /// Executes a command and returns a records reader containing the results. /// /// The command text. /// The parameters. /// /// A data reader containing the results of the command. /// protected override IRecordsReader ExecuteReader(string commandText, SqlCeParameter[] parameters) { #if DEBUG && DebugDataLayer // Log Query Execution Trace.TraceInformation(GetType().Name + " SQL ExecuteReader: " + commandText); #endif return new SqlCeDataReaderHelper(SqlCeApplicationBlock.ExecuteReader(ConnectionString, CommandType.Text, commandText, parameters)); } } }