在SQL Sever复制数据库时出现启动、执行SQL Server代理作业错误的解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在SQL Sever复制数据库时出现启动、执行SQL Server代理作业错误的解决方法相关的知识,希望对你有一定的参考价值。

参考技术A 如下图所示:

不过问题二解决后,会影响SQL Server代理的状态,需要重新开启SQL Server代理。

第一步:由于我的SQL Sever是2012版的,所以在此电脑里输入
C:\Windows\SysWOW64\SQLServerManager11.msc
找到配置管理器。(不同版本的SQL Sever配置管理器的地址可能有所差异,可在官网上找到对应的地址。)。
第二步:分别将SQL Server和SQL Server代理两个服务都更改为Local System 。

第三步:开启SQL Server代理(问题一的解决方法)。

第一步:启动SQL Server时更改身份验证为SQL Server验证。登录名为sa(自带),自己设置一个密码,可勾选记住密码。

第二步:开启SQL Server代理(问题一的解决方法)。
第三步:在选择源服务器和目标服务器时,选择使用SQL Server验证,输入(确认)登录名和密码。

第三步:选择传输方法时,选择使用SQL管理对象方法(M)。

执行 SQL 查询时出现 Wix 错误 -2147217900

【中文标题】执行 SQL 查询时出现 Wix 错误 -2147217900【英文标题】:Wix Error -2147217900 while executing SQL query 【发布时间】:2016-06-29 13:09:40 【问题描述】:

我正在使用 WIX 3.10 构建安装项目。我需要从安装程序创建一个 SQL Server 数据库,因为我使用的是由 Visual Studio 数据库项目生成的脚本。

我的 WIX 代码是:

<Binary Id="SQLCreateScript" SuppressModularization="no"  SourceFile="$(var.TestInstallDBProject.TargetDir)$(var.TestInstallDBProject.ProjectName)_Create.sql" />

<Component Guid="3B413DBB-603B-42BA-80A6-BA8ED5216ACE" Id="FornetDB" Directory="DirIIS" KeyPath="yes">

  <sql:SqlScript BinaryKey="SQLCreateScript" ExecuteOnInstall="yes" SqlDb="MasterDB"  Id="CreateScript" />
</Component>
<sql:SqlDatabase Database="Master"
                       Server="TUSHAR"
                       Instance="SQLSERVER2008R2"
                       Id="MasterDB"
                       ></sql:SqlDatabase>

它会抛出这个错误:

我打开了在 Notepad++ 中生成的文件,但看不到字符。错误信息有

【问题讨论】:

Visual Studio 数据库项目生成的创建脚本具有编码 UTF-8-BOM,这导致使用 UTF-8 编码的脚本运行时没有输出有什么问题。 我可以更改项目的编码吗? 【参考方案1】:

为了解决我的问题,我使用自定义 MSbuild 任务,从文本 (SQL) 文件中删除 BOM 信息。这是代码:

using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace CustomBuildTasks

    public class RemoveBOMInfo : Task
    
        private  ITaskItem[] _FilesToRemoveBOMInfo;

        [Required]
        public  ITaskItem[] FilesToRemoveBOMInfo  get  return _FilesToRemoveBOMInfo;  set  _FilesToRemoveBOMInfo = value;   

        public override bool Execute()
        
            if (FilesToRemoveBOMInfo == null || FilesToRemoveBOMInfo.Count() < 1)
            
                Log.LogError("FilesToRemoveBOMInfo can't be null or Empty.");
                return false; 
            
            //var Files = FilesToRemoveBOMInfo.Split(';');
            foreach (var File in FilesToRemoveBOMInfo) 
            
                var str = File.GetMetadata("Identity");
                if (!System.IO.File.Exists(str)) 
                
                    Log.LogError("File 0 not found.", str);
                    continue;
                
                using (var file = System.IO.File.Open(str, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                
                    int fByte = file.ReadByte();
                    if (fByte != 239)
                        continue;
                    fByte = file.ReadByte();
                    if (fByte != 187)
                        continue;
                    fByte = file.ReadByte();
                    if (fByte != 191)
                        continue;
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    
                        for (int i = 0; i > -1; ) 
                        
                            i = file.ReadByte();
                            if (i > 0)
                            
                                ms.WriteByte((byte)i);
                            
                        
                        file.Close();
                        System.IO.File.Delete(str);
                        using (var oFile = System.IO.File.Create(str))
                        
                            ms.WriteTo(oFile);
                            oFile.Close();
                        
                    
                
            
            return true;
        
    

并在 MSBuild 脚本中用作:

<Target Name="AfterResolveReferences" >
    <RemoveBOMInfo FilesToRemoveBOMInfo="%(_ResolvedProjectReferencePaths.RelativeDir)%(_ResolvedProjectReferencePaths.Name)_Create.sql" Condition="'%(_ResolvedProjectReferencePaths.IsSQLProj)' == 'True'" ></RemoveBOMInfo>    
</Target>

【讨论】:

但是脚本仍然没有运行,因为脚本需要 SQLCMD。所以必须编写自定义操作。

以上是关于在SQL Sever复制数据库时出现启动、执行SQL Server代理作业错误的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

设置数据库复制时启动快照代理时出现异常

我用SQL sever2008的时候出现连接服务器的错误,请大家帮助

为啥在运行我的系统时出现 java.sql.SQLException? [复制]

sql sever 2008数据库的还原备份问题

MySQL 数据库集群 - 将 SQL 节点 (mysqld) 连接到其他节点时出现问题

如何用命令行打开sql sever