微軟又推出了Microsoft Urlscan Filter v3.0,可用來防止 SQL Injection attack
當然,已經不支援 Windows 2000 了。請 Windows 2000 的維護人員自行撰寫程式。
之前我是使用 HttpModule 來加強 asp.net 對SQL Injection 的攻擊。
如今,使用微軟的方法,也可以使用在 asp了。
微軟又推出了Microsoft Urlscan Filter v3.0,可用來防止 SQL Injection attack
當然,已經不支援 Windows 2000 了。請 Windows 2000 的維護人員自行撰寫程式。
之前我是使用 HttpModule 來加強 asp.net 對SQL Injection 的攻擊。
如今,使用微軟的方法,也可以使用在 asp了。
關於 Refactoring(重構),我一直並不了解其意義。
後來,讀了這本書後才發現,原來我也大致地遵循著相同的原則不斷的改善我的程式碼。
我將書中的第一二章節,做成了投影片,並且也改寫成 c# 3.0的版本。看來 c# 3.0 真的比 Java 來的好,程式碼又簡潔了不少。
投影片可於這裡下載
微軟與中華電信最近推出了 live pages 。很好用。
搜尋公司的名稱,可以找到哦!可是電話有些怪怪的,不是我熟悉的 87121298。
問了一下,原來是晶片卡部門在使用。
與 google maps 比較一下,見maps ,地圖的服務,無論是放大縮小的流暢度,或者是地圖的解析度,看來目前還是 Google 做的比較好。
而國內做的最久的 urmap ,可以說被雙面夾攻,輸入「金財通」是找不到東西的。看來龍頭地位不保。
看來網路地圖的應用,潛力十足,創意無限。是未來的web 服務的主流之一。
一直以來,我們都希望開發網站時,能以模組的型式來開發。部署時,只要部署所需要的模組即可。
列如說,asp.net 應用程式Root 能容納多個模組,分別是公告、訂單、發票三個模組。
開發時,四個專案分別開發(包含asp.net應用程式Root及三個模組)
部署時,可以只部署所需要的模組,如 root + 公告,其餘的不要。
其實,方法已經有了。可見 Creating sub-projects in IIS with Web Application Projects 。
這樣的方式好處是簡單,而且可以分開部署。
可是,如果要談到資料交換(root 與 模組,模組與模組) 的資料交換,就又顯得複雜了。
只能靠 Session 或 database 來交換資料,並不是很好的做法。
目前我知道最好的做法,是 Web Client Software Factory, WCSF。
它不但可以模組與模組之間交換,甚至可以有依賴關係,例如公告模組依賴於權限模組。
並且又加上了 page flow (可取代之前的 User Interface Process (UIP) Application Block),還設計了權限、ObjectContainerDataSource、realtime search
連 source code 都給你了,真是物超所值。
http://labs.developerfusion.co.uk/convert/csharp-to-vb.aspx ,看該來不錯。
一個簡單的例子,
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Web.Configuration; using BankPro.EI2.BusinessComponents; namespace EI2.Utility { public class CommonUtil { ///經過轉換後,可以轉成 VB.NET 無慮。/// 虛擬目錄名稱 /// public static string EInvoiceVDName { get { return WebConfigurationManager.AppSettings["VDName"]; } } ////// 登入者所屬公司的 CompanyOid /// public static int LoginUserCompanyOid { get { return UserBC.GetUserCompanyOidByAccount( HttpContext.Current.User.Identity.Name).Value; } } } }
Imports System Imports System.Data Imports System.Configuration Imports System.Linq Imports System.Web Imports System.Web.Security Imports System.Web.UI Imports System.Web.UI.HtmlControls Imports System.Web.UI.WebControls Imports System.Web.UI.WebControls.WebParts Imports System.Xml.Linq Imports System.Web.Configuration Imports BankPro.EI2.BusinessComponents Namespace EI2.Utility Public Class CommonUtil '''但是,碰到新的 c# 3.0 (linq 的語法就會失敗了) 例如''' 虛擬目錄名稱 ''' Public Shared ReadOnly Property EInvoiceVDName() As String Get Return WebConfigurationManager.AppSettings("VDName") End Get End Property '''''' 登入者所屬公司的 CompanyOid ''' Public Shared ReadOnly Property LoginUserCompanyOid() As Integer Get Return UserBC.GetUserCompanyOidByAccount(HttpContext.Current.User.Identity.Name).Value End Get End Property End Class End Namespace
protected void gvInvoices_DataBound(object sender, EventArgs e) { foreach (GridViewRow row in gvInvoices.Rows) { for (int i = 0; i < gvInvoices.Columns.Count; i++) { DataControlField item = gvInvoices.Columns[i]; BoundField boundField = item as BoundField; if ((boundField != null) && string.IsNullOrEmpty(boundField.DataField)) { string headerText = item.HeaderText; int oid = Convert.ToInt32(gvInvoices.DataKeys[row.RowIndex].Value); var tmpType = tmpTypes.SingleOrDefault(t => t.OID == oid && t.GroupName == headerText); if ((tmpType != null) && (!string.IsNullOrEmpty(tmpType.ObjectValue))) { row.Cells[i].Text = tmpType.ObjectValue; } } } } }會產生 Conversion was attempted, however the following errors were reported: -- line 1 col 11: invalid TypeDecl
Oracle 的 rownum 是一個 pseudocolumn,意思是不存在的 column,是經由計算得來的.
先建立範例資料 .
create table emp(id int, sid char(10) not null, name char(10) not null); insert into emp(id, sid, name) values (1, 'Charles', 'F111222333'); insert into emp(id, sid, name) values (2, 'Jerry', 'A121121121'); insert into emp(id, sid, name) values (3, 'Abel', 'H114567898');執行下面的語法,可得到所有資料,且得到 rownum 代表的「列號」
select id, sid, name, rownum from emp;結果如下,很正常。
select id, sid, name, rownum from emp order by name;
結果如下,RowNum 是先經過編號後,才再 order by name 的。
所以,如果要先 order by name 才編號,就必須下這樣的sql script
select t.*, rownum from ( select id, sid, name from emp order by name ) t
結果如下
相同的問題,如果在 SQL Server 2005 上,就設計地好多了,因為語法上很清楚地說明了「編號是針對order by name」來編號。
select *, ROW_NUMBER() over (order by name) from emp;結果如下圖。看來 sql server 的設計是較貼近 developer 的.
select * from ( select *, ROW_NUMBER() over(order by invoicenumber) as rn from B2CInvoice ) a where a.rn between 21 and 30SQL Server 2000的語法就不說了,是很差的,而且並沒有通用的版本。
SELECT * FROM ( SELECT A.*, rownum r FROM ( SELECT * FROM B2CINVOICE ORDER BY invoiceNumber ) A WHERE rownum <= 30 ) B WHERE r >= 21;注意到,下面的是沒有資料回傳的,也就是錯誤的查詢結果。雖然看起來比較直覺而且易懂
SELECT A.*, rownum r FROM ( SELECT * FROM B2CINVOICE ORDER BY invoiceNumber ) A WHERE rownum >= 21 and rownum <=30