2010年7月29日 星期四

WPF 學習:EventRouting

這次學到的是 WPF 的 EventRouting

有一個 Window,xaml 如下

<Window x:Class="WpfApplication1.MainForm"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainForm" Height="300" Width="300" >
    <Grid>
        <StackPanel Name="MyPanel"></StackPanel>
    </Grid>
</Window>

而 code 如下。

public MainForm()
{
    InitializeComponent();

    for (int i = 0; i < 5; i++)
    {
        var button = new Button() {Content = "Button " + i};
        MyPanel.Children.Add(button);
        button.Click += new RoutedEventHandler(button_Click);
    }
}

void button_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    MessageBox.Show(button.Content.ToString());
}

執行時,會產生5個 button。每一個 button 被Click 後,會拋出所click 的按鍵訊息。

這樣的寫作方式與以前的 windows form 並沒有什麼兩樣。每個 button 的 click event 都註冊了相同的 event handler,似乎有點笨。

Event Bubbling

由於 event bubbling 的關係,button 的也會傳到其 Parent Container,在這個例子是名為 MyPanel 的 StackPanel。因此理論上MyPanel 可以收的到 Click Event.

問題來了,StackPanel 並沒有 Click Event,因此無法註冊 EventHandler. 如下圖。

image

RountEvent

雖然 MyPanel 無法直接註冊 Click Event, 但在 WPF 中由於 DependecyProperty 的幫助,我們可以使用 MyPanel.AddHandler方法的協助來註冊 Button 的 Click Event 的 Event Handler

public MainForm()
{
    InitializeComponent();

    for (int i = 0; i < 5; i++)
    {
        var button = new Button() {Content = "Button " + i};
        MyPanel.Children.Add(button);
        //button.Click += new RoutedEventHandler(button_Click);
    }
    MyPanel.AddHandler(Button.ClickEvent, new RoutedEventHandler(button_Click));            
}

void button_Click(object sender, RoutedEventArgs e)
{
    var button = e.Source as Button; //我也改了這一行
    MessageBox.Show(button.Content.ToString());
}
注意到我改了 e.Source。e.Source 是指真正發生 Event 的物件,即 Button。而sender 會指到 MyPanel,並不是我們想要的。

2010 年 TPC-E Benchmark,微軟 SQL Server 全面勝出??

繼上次 2007 的 SQL Server 2005 vs Oracle 效能評比,這次我隔了三年才再看 TPC 的資料。

這次多了 TPC-E 的測試標準。在 TPC-E 的測試標準下,無論是效能(Top Ten TPC-E Results by Performance)或是效能/價格(Top Ten TPC-E Results by Price/Performance),微軟的 SQL Server 大獲全勝,包辦了前十名。

image

image

而舊版的 TPC-C 測試標準,Top Ten TPC-C Results by Performance: 則完全看不到微軟 SQL Server 的身影,而Top Ten TPC-C Results by Price/Performance:的效能/價格,則 SQL Server 才勉強地擠到第三名。

image

image

TPC-E 與 TPC-C 到底差在哪裡啊!怎麼兩者會差這麼多。當然 TPC 網站有對兩者的解釋。英文說明太長(TPC-C, TPC-E) 。

實在看不懂。查一下 Google,看到了 新伺服器效能評測標準TPC-E出爐這一篇。原來 TPC-E 模擬目前複雜的交易環境,十足的 B2B。而舊版 TPC-C 則只單純地模擬一家零售銷售商店經理向倉庫下達訂單,模擬系統的交易效能。

簡單地說,以現在的網路交易環境,TPC-E 比較準啦!微軟可樂壞了吧!

那Oracle 與  DB2 呢?看來這兩個資料庫不喜 TPC-E 的 Benchmark,尚未提出任何測試報告呢。

參考

TPC-E和TPC-C测试结果比较之我见

新伺服器效能評測標準TPC-E出爐

昔日贵族TPC-C今成"鸡肋" TPC-E欲篡位

Microsoft Still the Only Database Vendor Posting TPC-E Scores

WPF 學習:Binding

WPF 除了 Declaration Programming 外,還有一個最強的功能就屬於 Binding 了。

假設現在有個需求,有一個 Button 與 TextBox。TextBox 所輸入的文字必須即時地設定為 Button 的 Text。

Window Form

如果以 WinForm 來實作的話,就必須以 Event Handler 的方式來處理。程式碼如下.

private void textBox1_TextChanged(object sender, EventArgs e)
{
    button1.Text = textBox1.Text;
}
好處是相當簡易清楚。但想一想,程式中充滿了這類的 Event Handler 也是相當雜亂的事。

WPF

WPF 則是使用 Binding 的技術來克服這樣的需求,不必一項項的以 Event Handler 來實作。

<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
  <Button    Content="{Binding ElementName=HelloTextBox, Path=Text}" Height="100" Margin="0,12,0,198" />
  <Button    Height="100" Margin="0,128,0,83" >
    <Button.Content>
    <Binding ElementName="HelloTextBox" Path="Text" />
    </Button.Content>
  </Button>
  <TextBox Text="Hello" Name="HelloTextBox" Margin="0,234,374,49" />
</Grid>
</Window>

第一個 Button ,其 Content 說明了其資料來源的Element 為 HelloTextBox,讀取路徑(Path)為Text。

第二個 Button 則使用了另一種相等的寫法,更清楚但語法稍嫌太長。

結論

這兩種WPF 的方法使用了 Binding(繫結),簡單地以宣告的方式取代了 Event Handling。更棒的是,這類的 Binding 可以使用到非常多的屬性,如Style, Icon 等。

2010年7月22日 星期四

LINQ to Entities: 可使用的 CLR Functions

我們知道 LINQ to Entities 很好用。但並非所有的 c# 習慣都可以寫到 LINQ to Entities 的 expression 中。

例如:下面的語法就會出錯。

var q = from i in ctx.MyObjects
        where i.GuidField == Guid.Parse("xxxx-xxxx-xxxxxxx-xxxx")
        select i;

解決的方法呢,就是將 Guid.Parse(”xxxx-xxx”) 這一樣拿出去 LINQ 外即可。如下

var guid = Guid.Parse("xxxx-xxxx-xxxxxxx-xxxx");
var q = from i in ctx.MyObjects
        where i.GuidField == guid
        select i;

LINQ to Entities 看到了語法中有不支援的 CLR Function,就不知道該怎麼辦。

那LINQ to Entities支擾哪些 CLR Fuction呢?見 CLR Method to Canonical Function Mapping

LINQ to Entity: 出現 Only parameterless constructors and initializers are supported in LINQ to Entities 錯誤

問題

使用 LINQ to Entities 時,出現了如下的錯誤。

Only parameterless constructors and initializers are supported in LINQ to Entities

原因

原來,我使用了 ReSharper 的 Convert Anonymous Type to Named Type 的功能,它會建立一個新的 Type,並沒有預設建構子。程式寫起來如下

from u in _entities.UserInfoes
select new UserViewModel(u.Displayname, u.UserId, u.Email

而 Entity Framework 竟然不支援這樣的寫法?真怪。

解法

解法呢?就把UserViewModel改成有預設建構子。呼叫方式如下

from u in _entities.UserInfoes
select new UserViewModel
{
    Displayname = u.Displayname,
    UserId = u.UserId,
    Email = u.Email
}

2010年7月18日 星期日

對 .NET Framweork 進行除錯

有時候,我們程式寫著寫著效能不佳,就可能怪起微軟的 .NET Framework了。微軟看來也怕了這一點,趕緊公佈 .NET Framework 的 Source Code,並且還可以在 Visual Studio 2010 進行除錯。

以下就介紹如何設定。

步驟1:下載

請到 http://referencesource.microsoft.com/netframework.aspx , 下載 .NET 4 的 Source Code 及 Symbol.

image

步驟2:安裝

下載回來的是 Net_4.msi。安裝時設定指定路徑為個人檔案的路徑,如 C:\Users\yourname\Documents\RefSrc,我就用了這一個路徑。

步驟3:設定

設定的步驟比較多。打開 Visual Studio 2010,執行功能表Tools/Options,選擇 General 頁。
不要勾選 "Enable Just My Code (Managed only)"。
勾選 "Enable .NET Framework source stepping"。
勾選 "Enable source server support"。
不要勾選"Require source files to exactly match the original version"


如下圖:

image

再選到 Symbols 路徑

按新增目錄,輸入 C:\Users\yourname\Documents\RefSrc\symbols
在 Cache symbols in this directory 中輸入 C:\Users\yourname\Documents\RefSrc\symbols\SymbolCache

完成後按確定。
image

大功告成。之後您就可以使用 F11來除錯了。

微軟公開的 Source Code

微軟已經儘量的公開 Source Code 了。大部份是與協力廠商。換句話說,是要簽保密協定的。

而一些比較沒有商業機密的,如 .net framework,早就公開了。見 Available Source Code Components

2010年7月16日 星期五

C# 的使用率首度超過 Visual Bacic

根據TIOBE Programming Community Index for July 2010 的資訊,Visual Basic (含 VB6.0, VB.NET) 的使用率在今年快速地下降,並且在這個月首度地低於 C#

Position
Jul 2010

Position
Jul 2009

Delta in Position

Programming Language

Ratings
Jul 2010

Delta
Jul 2009

Status

1

1

clip_image002

Java

18.673%

-1.78%

  A

2

2

clip_image002[1]

C

18.480%

+1.16%

  A

3

3

clip_image002[2]

C++

10.469%

+0.05%

  A

4

4

clip_image002[3]

PHP

8.566%

-0.70%

  A

5

6

clip_image004

C#

5.730%

+1.19%

  A

6

5

clip_image006

(Visual) Basic

5.516%

-2.27%

  A

7

7

clip_image002[4]

Python

4.217%

-0.22%

  A

8

8

clip_image002[5]

Perl

3.099%

-1.10%

  A

9

21

clip_image004[1]clip_image004[2]clip_image004[3]clip_image004[4]clip_image004[5]clip_image004[6]clip_image004[7]clip_image004[8]clip_image004[9]clip_image004[10]

Objective-C

2.498%

+1.99%

  A

image

在多個欄位中找出最大值

問題

  我個有 Table, 內有5個欄位 A,B,C,D,E,皆為整數。如何判斷 E 的值是最大值

解答

 

use tempdb;
go
create table Test ( A int, B int, C int, D int, E int)
go
insert into Test values ( 1, 2, 3, 4, 5)
go

with CTE (A , B , C , D , E , MaxVal )
as
(
 select A, B, C, D, E, (select max(Val)
                     from   (select A as Val
                             union all
                             select B
                             union all
                             select C
                             union all
                             select D
                             union all
                             select E) as Val) as MaxVal
from Test
)
select A, B, C, D, E, CONVERT(BIT,CASE WHEN E = MaxVal THEN 1
ELSE 0
END) as EIsMax
from CTE

2010年7月12日 星期一

Performance, Load, Stress Testing

之前我一直把這三者弄混了。這裡做個筆記。

Performance Testing

測試的目的在收集「系統在穩定狀況時的行為」,如Response Time (回應時間),資源的消秏,輸出量等。另一個目的也在於了解「何為系統正常」。

Performance Testing 時,可以只有一個 Process 進行。

Ex:

  1. 同樣的搜尋,在兩台伺服器何者搜尋較快。
  2. 正常情形下,該伺服器平均速度為 200 request per second(RPS)。

Load Testing

主要目的在了解「在正常及尖峰的狀況下系統的行為」,包括可靠度及效能。常常會以遞增的load size (number of concurrent users)來了解這樣的行為。

Load Testing 時,通常有多個 Process 進行。

Ex:

  1. 反應時間在 1 秒內時,可同時搜尋的查詢數。
  2. 該應用程式在該伺服器能承載的最大concurrent users 數為200人。

Stress Testing

對要目的在了解「極端的狀況下系統是如何 Crash 掉的」,進而知道在極端狀況發生時應如何處理。

故系統一定要測到掛了,並了解系統的瓶頸,如 CPU滿載,RAM 不足,硬碟效能不足,大量資料等。

Stress Testing 時,一定會有多個 Process 同時進行測試。

Ex:

  1. 目前這個系統,未來會先面臨 CPU 不足,還是 RAM 不足。發生時應如何補足資源?
  2. 系統在3000 萬筆的訂單,5億筆訂單歷史時,系統還能承受100個線上使用者,且平均網頁還能在4秒內呈現。

2010年7月7日 星期三

Data Driven Test

寫了一個類別

public class Class1
{
    public int Add(int a, int b)
    {
      return a + b;
    }
}
作了一個單元測試 (Unit Test)
[TestMethod]
public void TestMethod1()
{
  var o = new Class1();
  int a = 1;
  int b = 2;
  int c = o.Add(a, b);
  Assert.AreEqual<int>(3, c);
}

當然,這個測試通過了。但可惜的是,只能測一個 1 + 2 = 3 的測試案例。如果要測數個案例,要怎麼做呢?

此時,需要一些步驟。

步驟1:增加測試資料

增加一個文字檔 Data.csv, 並加入 TestProject, 內容如下

Val1, Val2, Result
1,2,3
4,6,10
5,7,12
10,-10,0
儲存時,使用 Chinese Trandional (Big5) 的編碼存檔
image
image

步驟2:設定部署

執行 Test/Edit Test Settings/Local(local.testsettings)

image

選取 Test Settings/Deployment 中的 Enable deploymnet 選項。此選項在 Visual Studio 2008 中預設為選取的,但在 Visual Studio 2010 中預設為不選取。

image

接下來,要在 Test Method 中加上 Deployment 及DataSource屬性,指示進行測試時,需要部署該 Data.csv 檔案。如下

[TestMethod, DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "data.csv", "data#csv", DataAccessMethod.Sequential)]
[DeploymentItem("Data.csv")]
public void TestMethod1()

接著,在 Solution Explorer 中選取 Data.csv,按 F4 打開 Properties Windows,將 Copy to Output Directory 設成 Copy always

image

步驟3:修改測試程式

這個動作將執行測試時,輸入 Class1.Add 的參數改由測試資料來讀取

[TestMethod, DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "data.csv", "data#csv", DataAccessMethod.Sequential)]
[DeploymentItem("Data.csv")]
public void TestMethod1()
{
  var o = new Class1();
  int a = Convert.ToInt32(TestContext.DataRow["Val1"]);
  int b = Convert.ToInt32(TestContext.DataRow["Val2"]);
  int c = o.Add(a, b);
  int checkValue = Convert.ToInt32(TestContext.DataRow["Result"]);
  Assert.AreEqual<int>(checkValue, c);
}

結果

測試結果如下。注意到雖然我們只寫了一個 TestMethod,但資料有4組,使用 Debug 模式追蹤,也的確跑了4次。但為什麼會顯示5個測試呢?我也不清楚。

image

image

 

Sample code download

2010年7月5日 星期一

AppFabric 學習:第一個 Caching 的程式

Windows Server AppFabric 最新的功能,就是 Caching 了。
天啊!Caching 不早就有了嗎?在 System.Web.Caching 有一票的 API,而 Enterprise Library 也早就有 Cache Application Block,為何微軟還要多此一舉地再加一個 AppFabric Caching 呢?

原來,System.Web.Caching 是最單純的 API 內建於 .NET Framework 中,但在使用上並不方便。而 Enterprise LibraryCache Application Block 將它方便地以設定的方式建立Cache,並以簡單的方式來存取 Cache。雖然如此,上述兩者仍然逃不出「只能在同一個 Process中存取」的命運。簡單的來說:「自己建的Cache 只能自己用」的限制。

而 AppFabric 的 Caching 功能,就完整地介紹了整個 Cache 的生命週期,包含 Cache 的管理、授權、統計、存取等方面。以下就簡單的介紹 Cache 基本的操作。

  • 啟動 Cache Cluster
  • 授權
  • 建立 Cache
  • 加入項目到 Cache
  • 讀取 Cache
  • 在 Cache 中移除項目

在這些實作之前,請記得做 安裝 AppFabric 步驟

啟動 Cache Cluster

AppFabric Caching 也是一個 Cluster (叢集)的概念,見Windows Server AppFabric Caching Physical Architecture Diagram。雖然我們只建立了一個 Cache Server,但在維運上仍然需要啟動 Cluster。

請在程式集中,以管理員權限執行 Caching Adminstration Windows PowerShell。

image

輸入下列指令,可以列出 PowerShell 中含有 cache 的指令

get-command *cache*
輸入下列指令,以啟動 Cluster
Start-CacheCluster

授權

在微軟新的設計中,安全性考量已經是週詳地被考慮過了,預設沒有人可以存取。因此我們需要授權給適當的帳號。如下面的指令:

Grant-CacheAllowedClientAccount domain\username

建立 Cache

我們可以建立多個 DataCache,每個DataCache 內可以有多個 CacheItem。我們必須先建立一個 DataChche 並指定其名稱為 emps。指令:New-Cache

PS C:\Windows\system32> New-Cache

cmdlet New-Cache at command pipeline position 1
Supply values for the following parameters:
CacheName: emps

加入項目到 Cache

接下來,就是程式的部份了。首先建立一個Console Application,並以瀏覽目錄的方式選到“%windir%\Sysnative\AppFabric” 這個目錄,加上參考

Microsoft.ApplicationServer.Caching.Client
Microsoft.ApplicationServer.Caching.Core

我建立個一個為 Employee 的類別。注意到為了將資料放到不同 Process 中,類別必須是 Serializable。

using System;

namespace AppFabric_CachingTest1
{
  [Serializable]
  class Employee
  {
    public string   Name { get; set; }
    public int Salary { get; set; }
  }
}
接下來,建立一個 Employee 的 instance 並放到 cache 中。

 

private static void PutToCache()
{
  var myCacheFactory = new DataCacheFactory();
  var emps = myCacheFactory.GetCache("emps"); //取得 emps 的 DataCache
  emps.Put("EmpCharles", new Employee() { Name = "Charles", Salary = 30000 });
  Console.WriteLine("Put emp Charles to cache");
}

而 Cache Cluster 的位置,Port 等資訊,可以在 config 中設定即可。

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="dataCacheClient"
          type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
            Microsoft.ApplicationServer.Caching.Core, Version=1.0.0.0, 
            Culture=neutral, PublicKeyToken=31bf3856ad364e35"
           allowLocation="true"
           allowDefinition="Everywhere"/>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <dataCacheClient>
    <hosts>
      <host name="localhost" cachePort="22233"/>
    </hosts>
  </dataCacheClient>
</configuration>

讀取 Cache

下面的程式相當簡單,與一般的處理 Cache 邏輯並沒有差別,就不廢言了。

private static void GetFromCache()
{
  var myCacheFactory = new DataCacheFactory();
  var emps = myCacheFactory.GetCache("emps");
  var charles = (Employee)emps.Get("EmpCharles");
  Console.WriteLine("Name:{0}, Salay:{1}", charles.Name, charles.Salary);
}

在 Cache 中移除項目

 

private static void RemoveFromCahce()
{
  Console.WriteLine("remove cache");
  var myCacheFactory = new DataCacheFactory();
  var emps = myCacheFactory.GetCache("emps");
  emps.Remove("EmpCharles");
  var o = emps.Get("EmpCharles");
  Console.WriteLine(" o is null ? {0}", o == null);
}

統計

好玩的是,AppFabric Caching 還有統計的功能。

Get-CacheStatistics

統計輸出如下

PS C:\Windows\system32> Get-CacheStatistics

cmdlet Get-CacheStatistics at command pipeline position 1
Supply values for the following parameters:
CacheName: emps


Size         : 0
ItemCount    : 0
RegionCount  : 1
RequestCount : 14
MissCount    : 5
當然,還有效能計數器可以看。

image

結論

在 Windows Server AppFabric 中,看起來好像複雜了很多。但事實上,真正複雜的是架構與管理的部份。在程式碼的部份來看,相對來說簡單很多,與其他的 Cache Framework 並沒有差別。

範例程式下載

參考

Introduction to Caching with Windows Server AppFabric (Beta 1)

Adding a Reference to AppFabric Cache Client-Cache assemblies

保哥的 Windows Server AppFabric Caching (Velocity) 心得筆記

AppFabric學習日記:安裝 AppFabric 步驟

常有人問到,IBM 有 Websphere 作為應用伺服器(Application Server),而 Red Hat 也買下了 JBoss 作為產品線中的應用伺服器。相對的,微軟為第一大軟體供應商,卻從來沒有對應的產品。為什麼?

之前微軟的回應都是:那就是 IIS 啊!的確,IIS 的確強大,也可以作為應用伺服器。但是,IIS 總讓人與網頁伺服器 (Web Server)畫上等號,對於微軟的說詞頗難以接受。

現在,微軟終於有個 Application Server 的服務了。但是,不用錢。
今天,我就來安裝一下吧。

安裝

http://msdn.com/appfabric使用 Web Platform Installer 安裝. 建議使用 Web Platform Installer 來安裝,它會檢查必須要安裝的一些元件及更新,如 IIS 7 Manager for Remote Administration,省去自行下載的麻煩。

image

如果資料庫要使用 SQL Express ,則必須是 SQL Express 2008 版本。請下載安裝。

設定

以下兩個 Configure 分別進入 Monitoring store 及 Persistence store 的設定。

image

設定 Monitoring store

image

輸入資料庫為 AppFabricMonitoring

設定  Persistence store

image

輸入資料庫為 AppFabricPersistence

設定  Caching service

image

輸入 AppFabricCaching

image

設定防火牆的例外

image

最後,啟動 IIS 管理員,就可看到新的介面

image
當然,目前都是空的。

image

Coded UI Test 無法以 64 bits 方式執行

在測試 Coded UI Test 的執行過程中,出現了下面會錯誤

Error calling Initialization method for test class MyClass.Tests.CodedUIPermissionsTest: Microsoft.VisualStudio.TestTools.UITest.Extension.UITestException: The Coded UITest cannot be run as a 64 bit process. You must change your test settings in the Hosts tab to run your test in a 32 bit process.

原因

Couded UI Test 無法以 64 bits 方式執行。

解法

在測試設定中,改用 32 bits 方式。如下圖。

image

並且,需要重新啟動 Visual Studio 2010。(我也不知道為什麼,但這樣做重開才會動)

2010年7月3日 星期六

寫出爛程式的懷習慣

繼上次的 寫出好程式的好習慣後,也不得不寫一下我看到常見的壞習慣。

1 複製,貼上

複製,貼上是每位工程師每天至少做100遍上事情,但如果該習慣拿來寫程式,那就非常不妙。

記得大學時交作業,班上有一堆的同學把我的程式 copy 過去,改一改變數名稱,換一換行號,讓助教看不出來是出自同一個人的手筆後,就魚目混珠地交完作業。如此速成的習慣也發現在許多 programmer 上。

很多人只是想要儘快地完成功能,可以準時下班,因此當需求一來,就連想到哪裡有類似已實作過的地方,就快速地複製其程式(甚至一模一樣的程式)。結果,相同的程式就像病毒地以不可思意的速度擴散到任意的地方。這樣違反了 Don’t repeat yourself (DRY) 準則,類似的程式當然有類似的邏輯,這些邏輯一旦因需求變更而必須修改時,修改者會發現程式改不完,而且擔心是否有沒有改到的地方。

這樣的困擾會不斷地發生,而且通常會發生在「很有效率」的人。我之前也被稱為「程式快手」,也是這樣來的。後來,才知道是被同事取笑,「程式快手」,複製 bug 也很快。

現在這類的人,我的同事取為「程式貼貼師」。

2 把範例當唯一方法

首先,微軟的 MSDN 網站上有大量的範例,網路上也有為數不少的 sample。這些範例都是用來說明該類別\方法的使用方式,但未必適合使用在正式商業用途。例如Entity Framework 的連線方式,通常範例,如ObjectContext.SaveChanges 方法,使用

var context = new XXXModel();
// 使用 context 作一些 entity 的操作
context.SaveChanges();

只使用預設建構子來建立連線?不必使用多個不同權限等級的帳號連線到資料庫,就符合資料庫的安全設計嗎?當然不是。

為了讓資料庫更安全,我們通常會使用不同的帳號,存取不同的資料表/預存程序/View,當然需要不同的連線字串。範例只是為了示範如何使用該類別或方式的使用方式,並不會在每個範例上都符合安全設計的原則。

因此,範例請把它當範例吧。不要拿過來只會照抄,通常不會恰巧地符合您的商業需求的。

3 沒有功勞,也有苦勞

這是心態問題了。這樣的人通常會表現工作的很辛苦,如果工作不如預期,就無法怪到他的身上。這一招通常有效,而且有效得長官也認為責任不在該員身上。

4 只(想)會一種技術

存取資料庫的方式,只會使用 SqlCommand 的方式。新出來的 TableAdapter,Enterprise Library 中的 DAABLINQ to SQLADO.NET Entity Framework 一律不碰。這樣的人不在少數,原因呢?新技術不斷地推出,誰學得完呢?反正土法煉鋼,總有一天能完成,加上「沒有功能也有苦勞」原則,就能以不變應萬變了。

5 只會寫程式

程式除了需要開發之外,其餘有更多的東西需要了解,才能成為一名好的開發/設計人員。諸如 Queue、Cache、IIS、Remote desktop、NLB、Cluster 等數也數不完的東西,都並不與程式直接相關。因此,我也見過太多人並不想了解間接相關的IT知識。

因此,網頁工程師不懂如何部署程式到 IIS,也不了解Application Pool 如何回收/身份識別如何設定等光怪陸離的事情也多見不怪了。

最經典的,我見過一名十多年經驗的系統分析師,其系統分析書以Word 來製作,但其排版方法與 PE2 時代無異。

6 只想當上班族

發現了嗎?前5個原因,都是「上班族症候群」的結果。上班族來上班,只為了取得薪水。太傷腦筋的事,無論如何都會推掉。因此,再怎樣簡單的道理,「上班族」也不願想透。

結論

其實,大部份的人都只是「上班族」,對於真正想要作出一番事業的人,無法避免地一定會與「上班族」接觸。因此,事業心重的人,也必須善待這些上班族。

如何與上班族共處呢?我也正在實習中。

2010年7月1日 星期四

Entity Framework Oracle Provider?

微軟的宣傳工作一向做的很好,而開發工具也做非常棒,每一次都帶給我無限的驚奇。ADO.NET Entity Framework (EF)的好處,在於先設計模型後再開發程式。而且該模型是 Entity Model,而非傳統的 Data Model。

這樣的好處不少,但 ADO.NET Entity Framework (EF)目前可使用的 provider 只有 SQL Server。換句話說,EF 只能連自家的 SQL Serve,其他如 Oracle, MySQL 等都不行。

CodePlex 上有幾個開源碼,但都只在 Alpha 階段,並不成熟, 如 Oracle Data Provider for Entity Frameworkeforacleodpprovider。3rd 公司有不錯的產品,如 devart 的 dotConnects

Oracle 自家的 ODP.NET 目前尚未支援 EF。未來計畫呢?在 Statement of Direction 中,宣告預計在2010年底 ODP.NET Beta with Entity Framework 會有 beta 版,而預計於 2011 年推出。當然,不保證。

後記

[20110329]

在 2011/02/10 Entity Framwork 終於有官方版了,目前是 BETA 版。見 ODAC 11.2.0.2.30 Beta for Entity Framework and LINQ to Entities

Share with Facebook