diff --git a/src/Umbraco.Core/DatabaseContext.cs b/src/Umbraco.Core/DatabaseContext.cs index 1311593e90..ed9b7c5a9d 100644 --- a/src/Umbraco.Core/DatabaseContext.cs +++ b/src/Umbraco.Core/DatabaseContext.cs @@ -303,6 +303,8 @@ namespace Umbraco.Core connString = ConfigurationManager.ConnectionStrings[GlobalSettings.UmbracoConnectionName].ConnectionString; } Initialize(providerName, connString); + + DetermineSqlServerVersion(); } else if (ConfigurationManager.AppSettings.ContainsKey(GlobalSettings.UmbracoConnectionName) && string.IsNullOrEmpty(ConfigurationManager.AppSettings[GlobalSettings.UmbracoConnectionName]) == false) { @@ -339,6 +341,8 @@ namespace Umbraco.Core //Remove the legacy connection string, so we don't end up in a loop if something goes wrong. GlobalSettings.RemoveSetting(GlobalSettings.UmbracoConnectionName); + + DetermineSqlServerVersion(); } else { @@ -372,6 +376,49 @@ namespace Umbraco.Core Initialize(providerName); } + /// + /// Set the lazy resolution of determining the SQL server version if that is the db type we're using + /// + private void DetermineSqlServerVersion() + { + + var sqlServerSyntax = SqlSyntaxContext.SqlSyntaxProvider as SqlServerSyntaxProvider; + if (sqlServerSyntax != null) + { + //this will not execute now, it is lazy so will only execute when we need to actually know + // the sql server version. + sqlServerSyntax.VersionName = new Lazy(() => + { + try + { + var database = this._factory.CreateDatabase(); + + var version = database.ExecuteScalar("SELECT SERVERPROPERTY('productversion')"); + var firstPart = version.Split('.')[0]; + switch (firstPart) + { + case "11": + return SqlServerVersionName.V2012; + case "10": + return SqlServerVersionName.V2008; + case "9": + return SqlServerVersionName.V2005; + case "8": + return SqlServerVersionName.V2000; + case "7": + return SqlServerVersionName.V7; + default: + return SqlServerVersionName.Other; + } + } + catch (Exception) + { + return SqlServerVersionName.Invalid; + } + }); + } + } + internal DatabaseSchemaResult ValidateDatabaseSchema() { if (_configured == false || (string.IsNullOrEmpty(_connectionString) || string.IsNullOrEmpty(ProviderName))) @@ -463,6 +510,8 @@ namespace Umbraco.Core message = message + "

Upgrade completed!

"; } + //now that everything is done, we need to determine the version of SQL server that is executing + LogHelper.Info("Database configuration status: " + message); return new Result { Message = message, Success = true, Percentage = "100" }; diff --git a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs index c962224689..eb10bf7f87 100644 --- a/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs +++ b/src/Umbraco.Core/Persistence/PetaPocoExtensions.cs @@ -51,7 +51,10 @@ namespace Umbraco.Core.Persistence try { - if (SqlSyntaxContext.SqlSyntaxProvider is SqlCeSyntaxProvider) + //if it is sql ce or it is a sql server version less than 2008, we need to do individual inserts. + var sqlServerSyntax = SqlSyntaxContext.SqlSyntaxProvider as SqlServerSyntaxProvider; + if ((sqlServerSyntax != null && (int)sqlServerSyntax.VersionName.Value < (int)SqlServerVersionName.V2008) + || SqlSyntaxContext.SqlSyntaxProvider is SqlCeSyntaxProvider) { //SqlCe doesn't support bulk insert statements! diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs index 2de2209ab4..3e37674ddf 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs @@ -13,6 +13,20 @@ namespace Umbraco.Core.Persistence.SqlSyntax public static ISqlSyntaxProvider Provider { get { return new SqlServerSyntaxProvider(); } } } + /// + /// Represents the version name of SQL server (i.e. the year 2008, 2005, etc...) + /// + internal enum SqlServerVersionName + { + Invalid = -1, + V7 = 0, + V2000 = 1, + V2005 = 2, + V2008 = 3, + V2012 = 4, + Other = 5 + } + /// /// Represents an SqlSyntaxProvider for Sql Server /// @@ -36,6 +50,11 @@ namespace Umbraco.Core.Persistence.SqlSyntax InitColumnTypeMap(); } + /// + /// Gets/sets the version of the current SQL server instance + /// + internal Lazy VersionName { get; set; } + public override string GetQuotedTableName(string tableName) { return string.Format("[{0}]", tableName);