2012-07-06 29 views
4

我重寫使用看起來像這樣這麼久的INSERT語句和參數VB.Net IIf函數:中添加的SqlParameter

cmd.Parameters.AddWithValue("@Website", General.fnSQLNullValues(tWebsite.Text)) 

哪裏General.fnSQLNullValues是這樣的:

 Public Shared Function fnSQLNullValues(ByVal sValue As Object, Optional ByVal Len As Integer = 999999) As Object 
      If sValue Is Nothing Then Return DBNull.Value 
      fnSQLNullValues = IIf(sValue.ToString.Length = 0, DBNull.Value, Left(sValue.ToString(), Len)) 
     End Function 

我不t等這樣可言的,這似乎是很多的代碼都採取同樣的措施,

 cmd.Parameters.AddWithValue("@Website" , If(tWebsite.Text , DBNull.Value)) 

從我的理解,即一行代碼有DBNull.Value將取代tWebsite.Text的值,如果tWebsite.Text爲空或不接受,在我看來,做同樣的事情,在一般的其他功能。這是正確的,是另一種方式比另一種更好嗎?

此外,我從第二種方式得到警告:「無法推斷普通類型;對象假設」,但在我看來,第一種方式反正是使用泛型對象,所以我不知道是否應該忽略在代碼數據庫的參數時,此警告

+0

請更新標題/問題/標記爲*這真的沒有任何關係與ADO/SQL *和一切與'Iff' VS'If'(合併)。 (但是,應該很有可能使用'null'而不是'DBNull.Value',它可以在涉及引用或可空類型的情況下「靜默地投射」到該類型。) – 2012-07-06 22:28:53

回答

5

字符串是有點棘手。如果您有一個空字符串,它將傳遞一個空字符串值進行插入。但是,如果您設置您將您的字符串設置爲Nothing值,則它將向數據庫中插入一個NULL值。否則,它將設置一個空字符串。

理想情況下,您將在數據層的頂部有某種業務層,它將檢查您的tWebsite.Text值,並將Nothing或Text值傳遞給設置參數的函數。這與你上面的第一個代碼示例略有不同。這樣您的數據層只需執行以下命令:

cmd.Parameters.AddWithValue("@Website" , valueWebsite)) 

...並且沒有麻煩是必要的。

對於其它數據類型(例如整數,小數,等),檢查出Nullable Types並與其合作。他們使事情變得非常容易。默認情況下,它們初始化爲Nothing,因此,如果你不給它分配(從你的輸入框)的值值保持沒有什麼,並會做一個適當的NULL插入到數據庫中。

+0

說@Website期待浮動,I可以做昏暗的網站作爲可空(浮動) - 然後把網站在那裏? – 2012-07-06 22:50:53

+0

您可以,但我認爲當您嘗試將google.com置入Float時會崩潰?哈哈 – 2012-07-06 22:51:56

+0

@ScottSelby正確。一般來說,我的邏輯是: 昏暗的網站作爲可空(浮動)? 如果不String.IsNullOrEmpty(tWebsite.Text)網站= Float.Parse(tWebSite.Text)ENDIF – 2012-07-06 22:54:36