簡體   English   中英

用於從同一存儲過程更新數據或從中獲取數據的程序邏輯

[英]Program logic to Update and Get data to/from same stored procedure

我正在該項目上創建Windows服務,該服務每20秒創建一次線程。 該服務從存儲過程中獲取文本和數字,並將SMS發送到這些數字,並且在線程的每一端,它將結果返回給存儲過程。

按照這種邏輯,我必須多次調用存儲過程,所以我想做的是我想同時獲取和更新數據。 代碼流是這樣的:這是稱為服務的onStart的函數。

public void Prepare(object state)
{
    DataTable _dt = new DataTable();
    DataTable _dt_sms_result = new DataTable();

    _dt = GetInfo();

    if (_dt != null)
    {
        _dt_sms_result.Columns.Add("sms_id", typeof(int));
        _dt_sms_result.Columns.Add("send_time", typeof(DateTime));
        _dt_sms_result.Columns.Add("result", typeof(string));

        foreach (DataRow dr in _dt.Rows)
        {
            bool status = sendMsg(dr["smsid"].ToString(), dr["number"].ToString(), dr["messagetxt"].ToString(), dr["from"].ToString(), dr["to"].ToString());
            Thread.Sleep(1000);
            DataRow lvlrow = _dt_sms_result.NewRow();
            lvlrow["sms_id"] = dr["sms_id"];
            lvlrow["send_time"] = DateTime.Now;

            if (status)
                lvlrow["result"] = "Message Sent";
            else
                lvlrow["result"] = "Sending Failed";

            _dt_sms_result.Rows.Add(lvlrow);
        }//end foreach
        PushInfo(_dt_sms_result);
    }

GetInfo()代碼:

public DataTable GetInfo()
{
    cmd.CommandText = "StoreProc_511";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Clear();

    cmd.Parameters.AddWithValue("@username", "******");            
    cmd.Parameters.AddWithValue("@authcode", "******");

    DataTable dt = new DataTable();

    try
    {
        Connect();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);              
    }
    catch (SqlException se)
    {
        MyLog.Write(new LogPacket(se, DateTime.Now));
        return null;
    }
    finally
    {
        Disconnect();
    }
    return dt;        
}

PushInfo()代碼:

public void PushInfo(DataTable dt_sms_result)
{
    int res = -1;
    cmd.CommandText = "StoreProc_511";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@username", "*****");            
    cmd.Parameters.AddWithValue("@authcode", "*****");

    SqlParameter tvpParam = cmd.Parameters.AddWithValue("@sms_result", dt_sms_result);
    tvpParam.SqlDbType = SqlDbType.Structured;

    try
    {
        Connect();
        res = cmd.ExecuteNonQuery();
    }
    catch (SqlException se)
    {
        MyLog.Write(new LogPacket(se, DateTime.Now));            
        Disconnect();           
    }
    finally
    {
        Disconnect();
    }
}

到目前為止,我一直想將_dt_sms_result傳遞給GetInfo()並刪除PushInfo()因為我們將只進行一次調用。 並添加

SqlParameter tvpParam = cmd.Parameters.AddWithValue("@sms_result", dt_sms_result);
tvpParam.SqlDbType = SqlDbType.Structured;

GetInfo()

但是我仍然對應該將GetInfo(with DT)放在Prepare()方法上的邏輯感到困惑。

有人可以幫我這里的邏輯嗎? 謝謝!

基本上,我為解決該問題所做的事情是,我將datatable( _dt_sms_result )聲明為類屬性,並且它是靜態的,現在每個線程都將在本地更新為一個datatable( _dt_sms_result ),因此在20秒后創建新線程並調用GetInfo() ,它還會將_dt_sms_result作為參數發送到存儲過程。 該調用將同時獲取數字,文本和其他信息,並保存到數據表中。 為了處理此調用期間的數據丟失和死鎖,我已鎖定了此數據表,直到存儲過程釋放了新的數據表為止。

更改了GetInfo()代碼:

public DataTable GetInfo()
{
    DataTable dt = new DataTable();

    cmd.CommandText = "StoreProc_511";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Clear();
    cmd.Parameters.AddWithValue("@username", "*****");            
    cmd.Parameters.AddWithValue("@authcode", "*****");

    lock (_dt_sms_result) { 
        SqlParameter tvpParam = cmd.Parameters.AddWithValue("@dt_sms_res", _dt_sms_result);
        tvpParam.SqlDbType = SqlDbType.Structured;


        try
        {
            Connect();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);
            _dt_sms_result.Rows.Clear();

        }
        catch (SqlException se)
        {
            MyLog.Write(new LogPacket(se, DateTime.Now));                
        }
        finally
        {
            Disconnect();
        }
    }
    return dt;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM