2011-11-02 78 views
1

這是我的選擇使用sql查詢使用ado.net時計算年齡?

using (SqlConnection con = new SqlConnection(dc.Con)) 
{ 
    SqlDataAdapter da = new SqlDataAdapter(
      "Select DateOfBirth FROM Patients WHERE HealthNumber='" + cmbHealthNumber.Text+ "'", con); 

如何去計算客戶的年齡改變我上面的代碼

我嘗試,但我從來沒有解決這個問題...

感謝您的幫助我!

+1

「DateOfBirth」的格式與計算年齡無關!你想要的是計算年齡? – Vishal

+0

是的,從我的選擇結果 – FrankSharp

+0

是否有使用SqlDataAdapter的原因? –

回答

5

如果您只需要檢索單個DateTime,爲什麼不使用:

string sqlStmt = "SELECT DateOfBirth FROM dbo.Patients WHERE HealthNumber = @No"; 

using (SqlConnection con = new SqlConnection(dc.Con)) 
using (SqlCommand cmd = new SqlCommand(sqlStmt, con)) 
{ 
    cmd.Parameters.Add("@No", SqlDbType.VarChar, 20).Value = cmbHealthNumber.Text.Trim(); 

    con.Open(); 
    var result = cmd.ExecuteScalar();  
    DateTime dateOfBirth = Convert.ToDateTime(result); 
    con.Close(); 
} 

真的沒有必要去通過具有SqlDataAdapterDataTableDataSet只是一個值的所有麻煩。 ...

另外:始終使用參數化查詢! - 例外。防止SQL注入 - 而且你絕對不希望這樣!

+1

我不知道您是否可以假設查詢只返回一個結果。我不確定「HealthNumber」背後的業務邏輯,但也許不止一個患者具有相同的「HealthNumber」?在使用'SqlCommand.ExecuteScalar()'之前絕對需要考慮。但我同意,如果它只有一個值,那麼'SqlDataAdapter()'有點矯枉過正。 +1,很好的答案。 – 2011-11-02 17:26:47

+1

很好的答案謝謝! – FrankSharp

2

試着改變你的查詢到這一點:

Select datediff(yy, DateOfBirth, getdate()) FROM Patients WHERE HealthNumber = @HealthNumber 

通過利用DateDiff方法可以使數據層上這種計算很容易地。我還在這裏放了一個變量,@HealthNumber,因爲你正在藉助SQL注入攻擊。無論是否會發生這種情況,將值硬編碼到SQL查詢中是不好的做法。

這也假設你想要計算年的年齡。如果你想要更精確的話,你可以把它改成任何常數值而不是yy。查看上面的參考鏈接DateDiff以顯示所有可能的參數配置值。