एसिंक्रोनस प्रोसेसिंग करने के लिए आप सेवा ब्रोकर का उपयोग कर सकते हैं, लेकिन यह एकमात्र विकल्प नहीं है, आप सीएलआर ऑब्जेक्ट्स का भी उपयोग कर सकते हैं।
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Runtime.Remoting.Messaging;
using System.Diagnostics;
public delegate void AsyncMethodCaller(string data, string server, string dbName);
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void AsyncProcedure(SqlXml data)
{
AsyncMethodCaller methodCaller = new AsyncMethodCaller(ExecuteAsync);
string server = null;
string dbName = null;
using (SqlConnection cn = new SqlConnection("context connection=true"))
using (SqlCommand cmd = new SqlCommand("SELECT @@SERVERNAME AS [Server], DB_NAME() AS DbName", cn))
{
cn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
reader.Read();
server = reader.GetString(0);
dbName = reader.GetString(1);
}
}
methodCaller.BeginInvoke(data.Value, server, dbName, new AsyncCallback(Callback), null);
//methodCaller.BeginInvoke(data.Value, server, dbName, null, null);
}
private static void ExecuteAsync(string data, string server, string dbName)
{
string connectionString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=SSPI", server, dbName);
using (SqlConnection cn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("SyncProcedure", cn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@data", SqlDbType.Xml).Value = data;
cn.Open();
cmd.ExecuteNonQuery();
}
}
private static void Callback(IAsyncResult ar)
{
AsyncResult result = (AsyncResult)ar;
AsyncMethodCaller caller = (AsyncMethodCaller)result.AsyncDelegate;
try
{
caller.EndInvoke(ar);
}
catch (Exception ex)
{
// handle the exception
//Debug.WriteLine(ex.ToString());
}
}
}
यह अतुल्यकालिक प्रतिनिधियों का उपयोग करता है कॉल करने के लिए SyncProcedure:
CREATE PROCEDURE SyncProcedure(@data xml)
AS
INSERT INTO T(Data) VALUES (@data)
बुला का उदाहरण
निम्नलिखित एक संग्रहीत प्रक्रिया (AsyncProcedure) का एक उदाहरण है कि अतुल्यकालिक एक और प्रक्रिया (SyncProcedure) कहता है AsyncProcedure:
EXEC dbo.AsyncProcedure N'<doc><id>1</id></doc>'
दुर्भाग्य से, असेंबली को यूएनएसएएफई अनुमति की आवश्यकता है।
स्रोत
2015-03-21 09:43:12
बदलें ट्रैकिंग एक अंतर्निहित फीचर बीटीडब्ल्यू है :) https://msdn.microsoft.com/en-us/library/bb933874.aspx – moander