2016-01-14 81 views
0

我有一種方法,我想根據輸入類型使用不同的方法。這是我有:c#識別sql uniqueidentifier

public static DataTable GetS(string source = null, string customer = null) 
    { 
     if (source != null && customer == null) 
     { 
      return GetDataTableFromQuery("db.GetS", new object[] { "@source", source }); 
     } 
     else if (source == null && customer != null) 
     { 
      return GetDataTableFromQuery("db.GetS", new object[] { "@customer", customer }); 
     } 
     else 
     { 
      throw new Exception("Bad input. Call GetS with GetS(source) or GetS(null,customer)."); 
     } 
    } 

SP的是這樣的:

CREATE PROCEDURE [db].[GetS] 

    @source as nvarchar(128) = NULL, 
    @customer as nvarchar(128) = NULL 

AS 
BEGIN 
IF @customer IS NULL 
BEGIN 
    SELECT 
     * 
    FROM 
     db.S 
    WHERE 
     [Source] = @source 
END 
IF @source IS NULL 
BEGIN 
    SELECT 
     * 
    FROM 
     db.S 
    WHERE 
     customer = @customer 
END 

END 

這工作正常GetS(source)GetS(null,customer),但我有2個問題。

  1. 它變壞,如果有人用GetS(customer)
  2. 它看起來並不很漂亮調用..

有沒有做這樣的事情(僞代碼)的一些方法:

public static DataTable GetS(string input) 
{ 
    if(input is sql-uniqueidentifier) 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@source", input}); 
    } 
    else 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]); 
    } 
} 

還是有更好的辦法嗎? (當然,我可以製作兩種不同的方法,但我想只用一個Get-方法來工作。如果我製作了GetSBySource或其他東西,感覺很奇怪)。

+0

什麼是確切的問題?開發者錯誤?你爲什麼想把這個放在一個單一的方法中?會不會有一個你想要通過這兩個值的情況? sql-identifier有什麼用? –

+0

我認爲這更多關於架構 – BendEg

+2

如果'source'被認爲是一個不可識別的標識符,那爲什麼它是一個'string'而不是'Guid'? – juharr

回答

3

在你的情況下,爲什麼不寫兩個方法,這不是奇怪的?我用兩種方法是最好的方法。

  1. public static DataTable GetSBySource(Guid source)
  2. public static DataTable GetSByCustomer(string customer)

這將使您的API的方式更可用清晰。

如果你知道,這一次你需要它傳遞一個Uniqueidentifier,你也可以使它通用:

public static DataTable GetS<T>(string input) 
{ 
    if(T is Guid) 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@source", input}); 
    } 
    else 
    { 
     return GetDataTableFromQuery("db.GetS", new object[] { "@customer", input]); 
    } 
} 

但是你也應該讓你輸入通用的,因爲通過Guid S作爲string小號周圍,​​不是很好...

使用不好的方法定義,當更改代碼時會引起很多問題。例如,您需要將Guid傳遞給只接受字符串的方法,而不是重構或更改代碼將非常困難。還有一種方法的定義,應該描述它的用法...

+0

好的。感謝您的回覆,我實際上在最後使用了2個獨立的方法=) –