【问题标题】:Uninstall SQL Server Express 2005 then install SQL Server 2008 R2 Express in C# ClickOnce Winform App卸载 SQL Server Express 2005,然后在 C# ClickOnce Winform App 中安装 SQL Server 2008 R2 Express
【发布时间】:2012-06-14 17:50:50
【问题描述】:

我的应用程序是使用 ClickOnce 在内部部署的,并且具有 SQL Server 2005 Express 的先决条件。

我想将我的用户升级到 SQL Server 2008 R2 Express。我有哪些选择不涉及我“触摸”所有 300 台笔记本电脑?

我的想法,只是理论上,是完全放弃 SQL Server Express 的先决条件,在我的应用程序中放置一个“升级”提示,并给用户几天的时间来点击它,然后重新添加 SQL Server Express 作为先决条件但作为新版本。

我认为这会奏效,尽管我愿意接受其他建议。但是,我的实际问题是如何完成“升级”提示。如何在 C# Winform 应用程序中卸载 SQL Server Express?

谢谢,

【问题讨论】:

  • @JNK:没有冒犯,但我不同意,因为人们没有正确解释我的问题。可能是因为它的措辞很糟糕,但我问的是如何卸载 SQL,然后在 C# Winforms 应用程序中安装更新版本的 SQL。不确定,但我不相信 DBA 网站上有很多 C# Winforms 专家。

标签: c# .net winforms clickonce sql-server-express


【解决方案1】:

请参阅MSDN article,了解如何静默安装 SQL Server 2008 R2(但为什么不改为 2012 呢?:)

一个快速的作弊方法是(我已经用非速成版做到了这一点,但应该是相同的过程)首先通过手动升级来收集配置和设置的所有答案,就在之前 执行实际升级,在最后一步中,您应该在底部看到答案 (ini) 文件的路径(见下图),如果您取消并抓取该文件,您可以在命令行中运行它,例如 Setup.exe /ConfigurationFile=MyConfigurationFile.INI

一旦您对其进行测试,您应该能够创建一些东西,将二进制文件和应答文件拉入用户的 PC,并生成一个进程以在静默模式下运行安装程序。当然,您首先应该确保您的用户是管理员。

要卸载: 使用 Setup.exe /Action=Uninstall /FEATURES=SQL,AS,RS,IS,Tools /INSTANCENAME=MSSQLSERVER 等卸载选项运行安装程序,请参阅 Uninstall Parameters 部分。如果我没记错的话,您实际上可以执行 Setup.exe /Action=Uninstall /INSTANCENAME=MSSQLSERVER 来删除您希望删除的特定实例的所有内容,但我可能错了,所以请测试首先

【讨论】:

  • 感谢您的文章,关于首先卸载我现有的 SQL 2005 Express 实例的任何信息?这是我问题的真正核心。
  • 小修正:SQL Server Express 的默认实例名称为SQLEXPRESS(并且 ClickOnce 引导程序使用默认实例名称)。您可能还想添加/q 以进行安静卸载。所以卸载命令应该是Setup.exe /q /Action=Uninstall /FEATURES=SQL,AS,RS,IS,Tools /INSTANCENAME=SQLEXPRESS
【解决方案2】:

我正在处理类似的要求,以自动从 WinForms 应用程序从 SQL 2005 Express 升级到 SQL 2008 R2 Express。

您实际上不必卸载 SQL 2005 即可进行升级。您可以直接从 2005 升级到 2008R2,无需任何卸载。

我的代码看起来像这样(经过修改以简化和删除专有内容)...

try
{

    //First, find the version of the currently installed SQL Server Instance
    string sqlString = "SELECT SUBSTRING(CONVERT(VARCHAR, SERVERPROPERTY('productversion')), 0, 5)";
    string sqlInstanceVersion = string.Empty;                

    //_database was initialized elsewhere - it's from Enterprise Library
    using (DbCommand cmd = _database.GetSqlStringCommand(sqlString))
    {
        sqlInstanceVersion = cmd.ExecuteScalar().ToString();
    }

    if (sqlInstanceVersion.Equals(String.Empty))
    {
        //TODO throw an exception or do something else
    }

    //11.00 = SQL2012, 10.50 = SQL2008R2, 10.00 = SQL2008, 9.00 = SQL2005, 8.00 = SQL2000
    switch (sqlInstanceVersion)
    {
        case "11.00":
        case "10.50":
        case "10.00":
            //Log that the version is already up to date and return
            return;
        case "9.00":
        case "8.00":
            //We are on SQL 2000 or 2005, so continue with upgrade to 2008R2
            break;
        default:
            //TODO throw an exception for unsupported SQL Server version
            break;
    }

    string upgradeArgumentString = "/Q /ACTION=upgrade /INSTANCENAME={0} /ENU /IACCEPTSQLSERVERLICENSETERMS";
    string instanceName = "YourInstanceNameHere";
    string installerFilePath = AppDomain.CurrentDomain.BaseDirectory + "\\SQLEXPR_x86_ENU.exe"; 

    if (!File.Exists(installerFilePath))
    {
        throw new FileNotFoundException(string.Format("Unable to find installer file: {0}", installerFilePath));
    }

    Process process = new Process
    {
        StartInfo = { FileName = installerFilePath, Arguments = String.Format(upgradeArgumentString, instanceName), UseShellExecute = false }
    };

    process.Start();

    if (process.WaitForExit(SQLSERVER_UPGRADE_TIMEOUT))
    {
        //Do something here when the process completes within timeout.
        //Probably look at exit code, or whatever to determine if it was successful
    }
    else
    {
        //The process exceeded timeout.  Do something about it; like throw exception, or whatever
    }
}
catch(Exception ex)
{
    //Handle your exceptions here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多