最近這段時間寫個系統,一些可以記錄下來的東西整理(1)

2010-06-03

其實這個系統也是接了一段時間了,不過因為太忙的關係,說實在都沒有空做。最近因為火燒屁股了,只得硬著頭皮做下去。這段期間內大部分是溝通、流程設計、與程式的苦工。學到不少東西,特別來記錄一下,並且隨時更新。

1. Web Services的asmx頁內容處理:因為寫這個系統的時候,說實在是沒有什麼Spec的(那時候是說某人要設計寫Spec,我要來寫Code的耶,淚),也就是隨時開發,隨時測試,隨時修改。當然開發人員只有我一人的狀態下,文件是不太可能產生的。所以asmx說明頁的內容就變成一開始跟使用者溝通的橋樑。例如下面的東西要如何產生?


這時候可以用WebService與WebMethod的Attribute Name與Description 來做修改,如下:

1
2
3
4
5
6
7
8
9
10
11
[WebService(Namespace = "http://www.mtnet.gov.tw/", Name = "MTNet小額支付平台Web Services")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
[WebMethod (Description = "新增訂單主檔,每筆訂單只需執行一次。")]
public string AddOrderMaster(...)
{
...
}
...
}

2. 如何知道呼叫Web Services的IP:這個系統需要鎖對方的IP,因此要取得IP,再跟資料庫的權限比對,就可以知道要不要讓他用了,取得IP的方法如下:

1
string AccessIP = HttpContext.Current.Request.UserHostAddress;

3. String太長可以用@來分段,不用辛辛苦苦的用+來自己斷行了:這個Web Services用到大量的資料庫處理,通常那些SQL語法都是落落長,加上一些參數以後,就更長了。如果用@就省去自己斷行的麻煩。

1
2
3
4
5
6
//原來的方法
sqlcmd.CommandText = " INSERT INTO OrderMasterTable (PortId, OrgFormIdx, ROCID, CompanyID, ActualPaymentMethod, TotalAmount, NotifyEmails, Comment, isValidated, crID, crDate, OrderStatusId, UserName) ";
sqlcmd.CommandText += "VALUES (@PortId, @OrgFormIdx, @ROCID, @CompanyID,'1', 0, @NotifyEmails, @Comment, 'True', @crID, getdate(), '134', @UserName)";
//方便的方法
sqlcmd.CommandText = @" INSERT INTO OrderMasterTable (PortId, OrgFormIdx, ROCID, CompanyID, ActualPaymentMethod, TotalAmount, NotifyEmails, Comment, isValidated, crID, crDate, OrderStatusId, UserName)
VALUES (@PortId, @OrgFormIdx, @ROCID, @CompanyID,'1', 0, @NotifyEmails, @Comment, 'True', @crID, getdate(), '134', @UserName)"

4. 新增一筆資料,想知道他的Index(Ident Insert):在新增完以後,使用SQL的IDENT_CURRENT變數,看看現在的計數值。

1
2
3
sqlcmd.CommandText = "SELECT IDENT_CURRENT('OrderMasterTable')";
index = sqlcmd.ExecuteScalar().ToString();
sqlcmd.Close();

2010/6/5補充:PTT C_Sharp的blestadsl推文,有不錯的作法。

1
2
3
sqlcmd.CommandText = "INSERT INTO ....; SELECT SCOPE_IDENTITY()";
index = sqlcmd.ExecuteScalar().ToString();
sqlcmd.Close();

5. DataSet的後製整理:這個Web Services提供了取出資料集的方法,但是因為使用的系統很多,大家想要的Query方法也不一樣,因此只好先停住搜尋條件,請各應用系統取回資料集以後,自己在做處理(To Lisa,真的不是我不想幫你們做,是因為這個是整合平台,而且…我已經快做不完了,淚)。處理的方法是先把DataSet裡的Table轉成DataView,再用DataView.RowFilter去設定篩選條件,最後再看需要綁定在可綁定的東西上面。

1
2
3
4
5
6
7
8
9
10
11
12
13
MTNetPGWS.MTNet小額支付平台WebServices MTPGNS = new MTNetPGWS.MTNet小額支付平台WebServices();
//取得DataSet
DataSet ds = MTPGNS.QueryOrderMasters("PAYMENTWEB", "", "", "", "", "");
//轉成DataView
DataView dv = new System.Data.DataView(ds.Tables["OrderMasterTable"]);
//設定條件
dv.RowFilter = "isRefund = true";
...
//排序
dv.Sort = "OrderIdx DESC";
//設定並綁定
GridView1.DataSource = dv;
GridView1.DataBind();

待續…


Blog comments powered by Disqus