2014-11-06 54 views
2

我一直在使用Insight.Database大約一年來調用存儲過程,但我只是遇到了一種情況,即存儲過程有一個Insight默認無法處理的默認可空參數。在Insight.Database中處理可空參數的權利/最佳方式是什麼?

簡而言之,參數定義爲paramName nvarchar(10) = ''。調用這個proc的代碼是老式的SqlCommand/SqlParam代碼,根本沒有設置參數。我用.NET對象替換此:

Class MyObject 
    Public Property paramName As String 
    .... 
End Class 

假設你創建這個類型的對象,不要設置paramName並把它傳遞給PROC。我會預期proc會使用默認值。但是反過來說,Insight會向proc發送NULL值,這與發送任何內容不同,proc會看到指定的參數,因此不會使用默認值,並且此特定proc實際上處理的是NULL 不同於從默認的方式,這打破了應用程序。

我會爭辯說,錯誤是在proc中,但我仍然需要一種方法來控制可空參數的行爲,所以我可以調用這種我不能修改的特效。

+0

這一個工作不打開的問題嗎? CREATE PROCEDURE dbo。abc ( \t @ Parm1 VARCHAR(50)= NULL ) – 2014-11-06 14:23:53

+0

我確定它可以工作,但這不是這個過程的定義。我需要按照原樣調用proc,並且無法更改它以使我更方便地調用。 – 2014-11-06 14:30:40

+0

好吧對不起,我要刪除我的回答 – 2014-11-06 14:39:23

回答

2

我很高興您已經與Insight.Database取得了一年的成功。

當Insight將對象綁定到參數列表時,它將映射任何匹配的屬性。

所以:

class Foo { string Param; } 
CREATE PROC MyProc (@Param varchar(50)) 

Foo.Param映射到@Param

在大多數簡單的情況下,程序員希望NULL映射到DBNull.Value。因此,如果Param爲NULL,則Insight將綁定該參數並將@Param設置爲(DB)NULL。

當您使用ADO.NET調用帶缺省參數的存儲過程時,通常會忽略參數或不設置該值。 ADO.NET然後告訴服務器使用默認值。

CREATE PROC MyProc (@Param varchar(50) = NULL) 

您可以完全省略該參數與Insight做到這一點:

class Foo { /* Param not bound */ } 

洞察然後離開綁定的價值和ADO.NET將使用默認值。

我還沒有運行的情況下,你必須在同一個過程中使用默認參數和NULL值。

所以最簡單的解決方案是省略參數,但如果這不起作用,我可能會添加一個功能,讓您控制NULL的含義。像:

class Foo { [NullMeansUseDefault] string Param; } 

當然,我想要一個更好的屬性名稱。

如果你覺得功能將解決您的問題,請在以上https://github.com/jonwagner/Insight.Database/issues

+0

我也很高興,因爲這是一個偉大的圖書館,爲我節省了大量的工作。我不認爲問題是proc使用「默認參數和NULL值」,這是proc不會期望null。該參數有一個默認值(空字符串''),並且其中的代碼像'if @paramName ='''一樣。由於Insight傳遞NULL,因此失敗。我認爲任何時候proc的默認值都不是NULL都是一個問題,調用代碼不能簡單地忽略參數 - 在這種情況下,因爲有時您想要指定它。 – 2014-11-07 15:07:03

+0

Insight是否以這種方式工作,因爲它不知道proc * other *而不是屬性,所以它必須假設你想傳遞它們,因爲它不知道哪些參數有默認值? – 2014-11-07 15:11:03

+0

它知道類型和哪些有默認值,但我不確定我會將null的含義更改爲默認值。 – 2014-11-07 21:25:10

相關問題