卸载SQL Server Express 2005,然后在C#ClickOnce Winform应用程序中安装SQL Server 2008 R2 Express

卸载SQL Server Express 2005,然后在C#ClickOnce Winform应用程序中安装SQL Server 2008 R2 Express,c#,.net,winforms,clickonce,sql-server-express,C#,.net,Winforms,Clickonce,Sql Server Express,我的应用程序是使用ClickOnce在内部部署的,并且具有SQL Server 2005 Express的先决条件 我想将用户的升级到SQL Server 2008 R2 Express。我有哪些选择不涉及“触摸”全部300台笔记本电脑 从理论上讲,我的想法是完全删除SQL Server Express预请求,在我的应用程序中添加“升级”提示,给用户几天时间单击它,然后将SQL Server Express重新添加为预请求,但作为新版本 我认为这会起作用,尽管我愿意接受其他建议。然而,我真正的问

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

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

从理论上讲,我的想法是完全删除SQL Server Express预请求,在我的应用程序中添加“升级”提示,给用户几天时间单击它,然后将SQL Server Express重新添加为预请求,但作为新版本

我认为这会起作用,尽管我愿意接受其他建议。然而,我真正的问题是如何完成“升级”提示。如何在C#Winform应用程序中卸载SQL Server Express

谢谢,

有关如何以静默方式安装SQL Server 2008 R2的信息,请参见本文(但为什么不改为2012?:)

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

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


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

我正在处理一个类似的需求,即从WinForms应用程序自动从SQL 2005 Express升级到SQL 2008 R2 Express

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

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


感谢这篇文章,有关于先卸载现有SQL 2005 Express实例的信息吗?这是我问题的核心。小更正:SQLServerExpress的默认实例名是
SQLEXPRESS
(ClickOnce引导程序使用默认实例名)。您可能还想添加
/q
,以便安静地卸载。因此,卸载命令应该是
Setup.exe/q/Action=uninstall/FEATURES=SQL,AS,RS,IS,Tools/INSTANCENAME=SQLEXPRESS
@JNK:无意冒犯,但我不同意,因为人们没有正确解释我的问题。可能是因为它的措词不好,但我问的是如何卸载SQL,然后在C#Winforms应用程序中安装更新版本的SQL。不确定,但我不相信DBA网站上有很多C#Winforms专家。
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
}