其實這個系統也是接了一段時間了,不過因為太忙的關係,說實在都沒有空做。最近因為火燒屁股了,只得硬著頭皮做下去。這段期間內大部分是溝通、流程設計、與程式的苦工。學到不少東西,特別來記錄一下,並且隨時更新。
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 ds = MTPGNS.QueryOrderMasters("PAYMENTWEB" , "" , "" , "" , "" , "" ); DataView dv = new System.Data.DataView(ds.Tables["OrderMasterTable" ]); dv.RowFilter = "isRefund = true" ; ... dv.Sort = "OrderIdx DESC" ; GridView1.DataSource = dv; GridView1.DataBind();
待續…