2008年7月25日 星期五

VS2005為什麼沒有ASP .Net Web應用程式專案可選

在這個月中旬到新竹總公司報到時 ,公司就發了一台新的ASUS W7 Notebook給我,所以這次報表開發的工作就是在新的NB上作的。

昨天把報表程式改成C#版寄出去後我就下班了,我老闆Call我說,專案的窗口發mail問怎麼沒看到.designer.cs的檔案,這個問題我遇過,知道好像是Web應用程式才會有*.designer.*的檔案,可是我在我的VS2005中要新建專案都沒看到Web應用程式的專案類型可選,所以就先回mail說我的程式裡沒有這些檔案。

早上專案的窗口回mail說是website專案不會有*.designer.cs的檔案,他已經檔案轉成WebApplication就OK了。

所以我又去拜Google大神了,原來是我週一才灌的VS2005還沒上Service Pack,上了SP1,ASP .Net Web應用程式專案範本就出現囉!

C#如何轉換VB.NET的ReDim Preserve

之前一直是用VB.NET作開發,最近換公司老闆的第一個交付的任務就是叫我寫報表,寫好後交出去,專案經理才說要用C#...

那就只好改囉!自己改嗎?我C#又不熟,當然是用工具。下面這個網站可以提供VB.NET和C#程式碼雙向轉換。http://labs.developerfusion.co.uk/convert/vb-to-csharp.aspx

前幾支報表轉的還都順利,只有在取出DataTable內資料時要手動改一下,如:
dtResult.Rows(i).("Item") 要改成 dtResult.Rows[i]["Item"]
但是轉到後面幾支比較複雜的報表,要計算表格的RowSpan,我的程式中有用到ReDim的地方就出現訊息
    // ERROR: Not supported in C#: ReDimStatement

所以就參考網路資料寫了一個Function ReDim:
參考網址:http://www.cnblogs.com/skyiv/archive/2005/09/19/ReDim.html
static int[] ReDim(int[] array, int newLength)
{
    if (array == null)
    {
        throw new ArgumentNullException("array");
    }
    if (array.Rank != 1)
    {
        throw new ArgumentException("只允許一維陣列", "array");
    }
    if (newLength < 0)
    {
        throw new ArgumentOutOfRangeException("newLength", "newLength需大於0");
    }
    if (newLength == array.Length) return array;

    int[] newArray = new int[newLength];
    Array.Copy(array, 0, newArray, 0, Math.Min(array.Length, newLength));
    return newArray;
}

因為我用到的是整數陣列,所以我就將範例中原本宣告為Array的部份都直接改成int[],不然我還要找要怎麼作型別轉換,將傳回的Array轉回int[],我C#還不熟,趕專案先,以後再研究。

2008年7月22日 星期二

又是停用服務惹的禍!

環境:
Win XP SP2+Office 2007

問題:
1.開啟Word檔時會出現"此文件無法註冊,無法在其他文件建立與此文件的連結。"錯誤訊息
2.Windows Live Writer程式無法開啟
3.Outlook選項內的"建立簽名"及"信箋和字形"等按鈕,按下無反應

解決方式:
原來又是我亂停用服務的毛病所致,啟動DCOM Server Process Launcher就好了!

2008年5月29日 星期四

SQL 2000 如何關閉 xp_cmdshell

有個客戶最近他們公司網站被駭客入侵,懷疑駭客是用xp_cmdshell寫木馬到主機,發mail問我要如何關閉SQL 2000 的xp_cmdshell 指令。

 

這個FAQ的解答如下:
Use Master
Exec sp_dropextendedproc N'xp_cmdshell'

2008年5月27日 星期二

書摘及心得-千萬年薪的房仲高手

看這本書不是我要去賣房子了,而是我想買房子很久了,一直下不決心,和仲介也打過不少次交道,感覺都不是很好,在PTT上聽說,這本書是某些新進仲介指定教材,特地去圖書館借來看看,了解仲介們在想些什麼!

==========以下為本書摘要===========
開發為業績之父,議價為業績之母,銷售為業績之子

委託:
拉五同:同好、同姓、同鄉、同校、同事
沒有賣不掉的房子,只有賣不掉的價格

議價:
議價比調價容易-請屋主調價總比要買方加價容易
沒有賣不掉的房子,只有賣不掉的價格

銷售:
天龍八部:了解、試探、出價、堅持、調價、接近、要約、成交
了解-買方及賣方買屋賣屋的原因、了解案源、異議處理
試探-買屋的急迫性、促銷手段以顯示案子搶手
出價-請買方表示意見(嫌厝的人就是買厝的人)、問買方認為的合理價(回報屋主)
堅持-卡價位
調價-買方不加我不降,買方有加我少降
接近-出價接近底價要找台階下,不要讓買方誤以為差距過大
要約-要有一定要收斡的決心,否則將淪為帶看導遊
成交-如屋主不願再降價,買方也加價到極限,可衡量利潤以服務費折讓方式讓買賣雙方成交

=============我的心得=============
沒有賣不掉的房子,只有賣不掉的價格,書中重覆提了好幾次,絕對是重點,知易行難吧!
這就是為什麼不是每個房仲業務都能千萬年薪的原因吧!

2008年3月24日 星期一

關於WebService開發的個人經驗

去年幫客戶和某超商作欠費的即時查詢及代收的整合,剛開始試寫了幾種方法,但是超商都說我回的Message他們驗證不過吃不進去,最後是超商提供的一個C#範例程式,我拿來改成VB.Net,所以當時有一些Attribute的語法被不明就裡的拿來套用,剛好最近兩天有空就拿來研究,終於都搞通了,以下就是這兩天的研究成果

以VS2005開發Web Service來傳遞自訂物件時,如下例
Public Class Service1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function Operation(ByVal obj As MyObj) As MyObj
.....
End Function
End Class

Public Class MyObj
.....
End Class


預設Request和Response的SOAP Message會長的像這樣:
=======Request=======
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope ...>
<soap:Body>
<obj>
....
</obj>
</soap:Body>
</soap:Envelope>

=======Response=======
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope ...>
<soap:Body>
<OperationResult>
....
</OperationResult>
</soap:Body>
</soap:Envelope>

但超商希望的是無論在Request和Response的訊息都是在SOAP BODY內包一個<OLTP>...</OLTP>就好,長的像這樣:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope ...>
<soap:Body>
<OLTP>
....
</OLTP>
</soap:Body>
</soap:Envelope>

要怎麼作呢?
要修改Request時的Message容易!
Public Class Service1
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function Operation(ByVal objOLTP As MyObj) As MyObj
.....
End Function
End Class

要改Response時的Message就要在我們的自訂物件上多加一些Attribute的東西
Imports System.Xml.Serialization
<XmlRootAttribute(ElementName:="OLTP")> _
Public Class MyObj
.....
End Class

不過這樣(加上Attribute)改過之後,如果您是在VS2005直接用加入Web參考的方式,去呼叫這個Web Service會發現收不到傳回值,而且您的測試專案可能就會有一個運算式沒有產生值的錯誤訊息,去看Reference.vb(在專案的.\Web References\Web參考資料夾名稱下)會發現您呼叫的是一個Sub而不是Function,當然您可以直接修改這隻程式,不過我強烈建議絶對不要這樣作,因為那一天您不小心去更新Web參考時就毀了,VS2005會重新產生這個檔案,您所作的修改就不見了。所以我建議如果會有要自己修改Reference.vb這個檔案的人,請照這樣作!

  1. 先移去剛剛加的<XmlRootAttribute(ElementName:="OLTP")> _,存檔並重新建置(重建一定要作,不然後面就白作了)
  2. 先開啟VS2005命令提示字元
  3. 輸入 WSDL /l:VB http://伺服器IP/WebService名稱.asmx
  4. 在現行資料夾下會產生一個 WebService名稱.vb 的檔案
  5. 將這個.vb的檔案複製到測試專案資料夾下並加入到測試專案中
  6. 修改測試專案程式碼,將原本程式碼中的 Web參考資料夾名稱.ServiceName 改成 ServiceName,Web參考資料夾名稱.MyObj 改成 MyObj
  7. 作到這裡,看起來已經沒有錯誤訊息了,但是實際執行時,您會發現雖然是Function但傳回值卻永遠是Nothing,那是因為VS2005只會去讀SOAP BODY內的<XXXXResult>...</XXXXResult>內容當作傳回值(XXXX就是您WebMethod的Function名稱)
  8. 打開 WebService名稱.vb ,修改Function宣告式的傳回值部份,在XmlElementAttribute中加入ElementName:="OLTP" 讓VS2005會去讀SOAP BODY中的<OLTP>...</OLTP>內容當作傳回值即可

Public Function Operation( <System.Xml.Serialization.XmlElementAttribute( _
[Namespace]:="http://tempuri.org/")> ByVal OLTP As MyObj) _
As <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://tempuri.org/", ElementName:="OLTP")> MyObj
Dim results() As Object = Me.Invoke("Operation", New Object() {OLTP})
Return CType(results(0),MyObj)
End Function


2008年3月2日 星期日

如何自動開啟Oracle資料庫

在Windows環境下只要設定服務:Oracle_SID的啟動類型為自動即可,在UNIX環境下則是修改/var/opt/ovacle/oratab,將SID那一行的N改為Y即可