0

カスタムアクティビティを作成して、CRMワークフローを使用してSQLジョブを実行しようとしています。私のコードでは、オンラインチュートリアルで次のように作成しました(c#で):

[CrmWorkflowActivity("A test activity to run SQL Jobs")]
public sealed class ExecuteSQLJob : System.Activities.CodeActivity
{

    #region Inputs
    [Input("Job Name")]
    [Default("BMS_ExtractTransformLoad")]
    public InArgument<String> JobName { get; set; }

    [Input("Server Connection")]
    [Default("HBSSQL2008/MSSQLSERVER")]                  //<--This String
    public InArgument<String> ServerName { get; set; }

    [Input("User Name")]
    [Default("-----")]
    public InArgument<String> UserName { get; set; }

    [Input("Password")]
    [Default("-----")]
    public InArgument<String> Password { get; set; }
    #endregion

    protected override void Execute(CodeActivityContext context)
    {
        Server server = new Server(ServerName.Get(context));   //<--Is used here
        try
        {
            server.ConnectionContext.LoginSecure = false;
            server.ConnectionContext.Login = UserName.Get(context);
            server.ConnectionContext.Password = Password.Get(context);
            server.ConnectionContext.Connect();
            Job job = server.JobServer.Jobs[JobName.Get(context)];
            job.Start();
        }
        finally
        {
            if (server.ConnectionContext.IsOpen)
            {
                server.ConnectionContext.Disconnect();
            }
        }
    }
}

ただし、このワークフローを実行しようとすると、サーバーに接続できなかったというエラーがスローされます。(具体的には、エラーはserver.ConnectionContext.Connect()メソッド呼び出しでスローされます)。

問題はserverName文字列ですか?もしそうなら、どうすれば使用する正しいserverNameを見つけることができますか?

助けてくれてありがとう!

編集: ここにいくつかの追加情報があります...

これが、サーバーとインスタンスの名前を初めて取得した方法です。 私のSQLクエリ

そして、CRMワークフローのエラーは次のとおりです。

Workflow suspended temporarily due to error: Unhandled Exception: Microsoft.SqlServer.Management.Common.ConnectionFailureException: Failed to connect to server HBSSQL2008.
   at Microsoft.SqlServer.Management.Common.ConnectionManager.Connect()
   at ExecuteSQLJob.ExecuteSQLJob.Execute(CodeActivityContext context)
   at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)
Inner Exception: System.Data.SqlClient.SqlException: Login failed for user 'rnkelch'.
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK)
   at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout)
   at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, TimeoutTimer timeout, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.SqlServer.Management.Common.ConnectionManager.InternalConnect(WindowsIdentity impersonatedIdentity)
   at Microsoft.SqlServer.Management.Common.ConnectionManager.Connect()

申し訳ありませんが、これは元々含まれていませんでした。これまでのところ、ご協力いただきありがとうございます。

4

2 に答える 2

2

質問に完全に関連しているわけではありませんが、それでも、接続文字列を正しく取得するのに役立つブックマークに役立つサイトです。

SQL Server 2008については、同じサイトのこのリンクを参照してください

サーバー文字列の一部は次のとおりです。

Server = myServerName \ theInstanceName

上記の宣言でスラッシュを使用しました

[Input("Server Connection")]
[Default("HBSSQL2008/MSSQLSERVER")]                  //<--This String
public InArgument<String> ServerName { get; set; }

これに変更します:

[Input("Server Connection")]
[Default("HBSSQL2008\\MSSQLSERVER")]                  //<--This String
public InArgument<String> ServerName { get; set; }

それを逃れるためにそれをダブルスラッシュする必要があるかもしれません。

于 2012-06-25T15:30:31.850 に答える
0

わかりました、私は今それを理解したと思います。

サーバーで実行されているSQLのインスタンスは1つしかないため、実際にはServerName\InstanceName形式を使用する必要はありません。hbssql2008とHBSSQL2008の両方で接続できます。さらに、IPも同様に機能します。

また、私が遭遇した別の問題は、使用していたユーザー名とパスワードが、SQLサーバーのセキュリティではなくWindows統合セキュリティからのものであったことでした。そのため、適切な権限とSQLセキュリティ情報を使用してサーバー上に新しいアカウントを作成し、接続できるようにしました。

よろしくお願いします!

于 2012-06-29T13:27:26.267 に答える