窗口服务 - 等待存储过程以获得结果

时间:2012-09-25 12:54:15

标签: c# sql-server-2008 sql-server-2005 c#-4.0 windows-services

我正在从C# Window Service运行存储过程。存储过程是一个非常繁重的查询,需要很长时间。

我想等到存储的proc完成并返回值。

有没有办法确定存储过程已完成?

3 个答案:

答案 0 :(得分:4)

使用Threading.Tasks。以下代码将使您的线程等待任务完成。

public void CallStoredProcMethod()
{
    var task1 = System.Threading.Tasks.Task.Factory.StartNew(() => RunStoredPro());

    // thread will wait there till the operation finish
    task1.Wait();
}

public void RunStoredPro()
{
    using (var connection = new SqlConnection(sqlConnString))
    {
        // your database call
    }
}

答案 1 :(得分:2)

System.Data.Common.DbCommand具有CommandTimeout属性。

  

获取或设置终止执行a的尝试之前的等待时间   命令并生成错误。等待命令执行的时间(以秒为单位)。实施者注意,建议0表示没有超时。

请注意,SqlCommand的默认值为30秒。如果将CommandTimeout属性设置为0,则只要存储过程执行,您的调用就会占用。 SqlCommand上ExecuteScalar实现的msdn页面有以下示例,稍加修改以设置CommandTimeout

static public int AddProductCategory(string newName, string connString)
{
    Int32 newProdID = 0;
    string sql =
        "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
        + "SELECT CAST(scope_identity() AS int)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);

        // this will cause the command to wait until the sproc is finished
        cmd.CommandTimeout = 0; 

        cmd.Parameters.Add("@Name", SqlDbType.VarChar);
        cmd.Parameters["@name"].Value = newName;
        try
        {
            conn.Open();
            newProdID = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return (int)newProdID;
}

答案 2 :(得分:1)

  

在存储过程中使用return语句并获取值

例如作为存储过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[Validate]
@inputdata varchar(50),
@outputdata varchar(50) output

AS
SET @outputdata = (
SELECT TOP 1 Password FROM dbo.tblUser WHERE Login = @a)

RETURN @outputdata
GO

我在这里简要介绍C#中的核心代码

       string returnValue = string.Empty;
         ...............
        SqlConn.Open();
        sqlcomm.CommandType = CommandType.StoredProcedure;
        SqlParameter param = new SqlParameter("@inputdata", SqlDbType.VarChar);
        param.Direction = ParameterDirection.Input;
        param.Value = Username;
        sqlcomm.Parameters.Add(param);

        SqlParameter retval = sqlcomm.Parameters.Add("@outputdata", SqlDbType.VarChar);
        retval.Direction = ParameterDirection.Output;
        string retunvalue = (string)sqlcomm.Parameters["@outputdata"].Value;
         ......................
         .........