[英]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.