2012-09-25 43 views
12

के साथ सी # सीएलआर संग्रहीत प्रक्रिया के लिए एक वैकल्पिक पैरामीटर के रूप में एक शून्य पैरामीटर घोषित करने के लिए कैसे करें मैं एक सी # संग्रहीत प्रक्रिया लिख ​​रहा हूं जो SQL Server 2008 R2 (इसलिए .NET 3.5) पर तैनात है और वैकल्पिक घोषित करना चाहता है एक नालीदार गाइड के रूप में पैरामीटर। यहाँ क्या मैं पहली बार कोशिश की है:SQL सर्वर

यह संकलन समय त्रुटि के साथ विफल:

Default parameter value for 'sID' must be a compile-time constant

जो है, क्योंकि DBNull.Value जो एक दर्द है एक स्थिर नहीं है,।

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(
    SqlGuid pID 
    , Guid? sID = null 
    ) 

यह संकलित लेकिन अब मैं इस तैनाती त्रुटि मिलती है:

Deploy error : Could not create a type for parameter System.Nullable

कोशिश कर रहा है:

, SqlGuid sID = null 

इस संकलन समय त्रुटि देता है

तो मैं करने के लिए घोषणा को बदलने की कोशिश की :

A value of type '< null >' cannot be used as a default parameter because there are no standard conversions to type 'System.Data.SqlTypes.SqlGuid'

तो बल्कि अटक महसूस कर मैं इस का सहारा लिया:

, SqlGuid sID = "00000000-0000-0000-0000-000000000000" 

कौन सा मैं कोड में कि स्ट्रिंग के लिए परीक्षण के रूप में करने के लिए नहीं करना चाहता था एक kludge तरह लगता है। हालांकि वह काम नहीं करता है या तो मैं इस संकलन त्रुटि मिलती है के रूप में:

A value of type 'string' cannot be used as a default parameter because there are no standard conversions to type 'System.Guid'

गाह, 4 अलग दृष्टिकोण और कोई भी उन्हें काम करते हैं। श्वास

कृपया अपने विचारों या सही दिशा में धक्का की सराहना करेंगे।

+0

क्या आपने बस "गुड? एसआईडी" की कोशिश की है, बिना = शून्य? – H27studio

उत्तर

0

क्या आपके द्वारा डिफॉल्ट किए गए मानों के लिए नल में बसने में कुछ गड़बड़ है?
माना जाता है कि यह हर स्थिति में काम नहीं कर सकता है।
कभी-कभी आप जानना चाहेंगे कि वास्तविक मान वास्तव में शून्य है, और इसलिए डिफ़ॉल्ट का उपयोग करने से बचें।
यदि यह मामला है, तो मैं एक अतिरिक्त "डिफ़ॉल्ट" पैरामीटर जोड़ने का सहारा लेगा।

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void MySproc(SqlGuid pID, SqlGuid sID, SqlBoolean UseDefault_sID) 
{ 
    sID = (UseDefault_sID == SqlBoolean.True && sID == SqlGuid.Null) 
     ? SomeDefaultPIDValue : sID; 
} 

यह मूलभूत मूल्यों है कि उसके बाद अपने CLR sproc फोन के साथ वैकल्पिक पैरामीटर में लेने के लिए sprocs अतिरिक्त लिखने के लिए "आवरण" होने पर बचत होती है।

उपयोग करने के लिए डिफ़ॉल्ट-मूल्य जब अशक्त में पारित: UseDefault_pID = 1
रखने के लिए वास्तविक-मान जब अशक्त में पारित:

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(
    SqlGuid pID 
    , SqlGuid sID 
    ) 

: UseDefault_pID = 0

0

बस इसे के रूप में घोषित और फिर इसे मैन्युअल रजिस्टर एसक्यूएल सर्वर में:

ALTER PROCEDURE [dbo].[spCalcPerc] 
    @pID [uniqueidentifier], 
    @sID [uniqueidentifier] = null 
WITH EXECUTE AS CALLER 
AS 
EXTERNAL NAME [SqlServerProject3].[StoredProcedures].[spCalcPerc] 

और फिर आप IsNull संपत्ति का परीक्षण करने के लिए उपयोग कर सकते whet उसके sID तथ्य अशक्त में है:

SqlContext.Pipe.Send(sID.IsNull.ToString()); 

मैं एक तरह से अपने सी # कोड में डिफ़ॉल्ट की घोषणा करने के बारे में पता, मुझे डर लग रहा नहीं हूँ।

0

मैं इसे की कोशिश नहीं की है, लेकिन आप

Guid.Empty 

कोशिश की थी?

+3

पहले की तरह ही त्रुटि उत्पन्न करेगा: "एसआईडी के लिए डिफ़ॉल्ट पैरामीटर मान एक संकलन-समय स्थिर होना चाहिए" - चूंकि 'GUID.Empty' संकलन-समय स्थिर नहीं है। –

0

जैसा कि आपने बताया, ऐसा इसलिए है क्योंकि सी # 2.0 वैकल्पिक पैरामीटर का समर्थन नहीं करता है।

एक वर्कअराउंड नियमित टी-एसक्यूएल संग्रहीत प्रक्रियाओं में .NET संग्रहीत प्रक्रियाओं को लपेटने के लिए हो सकता है जो डिफ़ॉल्ट पैरामीटर स्वीकार करते हैं।

उदाहरण के लिए:

CREATE PROCEDURE TestProcWrapper 
(
    @TestIntWrapperParam int = null 
) 
AS 
EXEC TestProc @TestInt = @TestIntWrapperParam 
4

, SqlGuid sID = New Guid() 

प्रयास करें आप

if (sID == Guid.Empty) 

का उपयोग करता है, तो यह एक मूल्य नहीं सौंपा गया है की जाँच करने के कर सकते हैं।

0

निम्नानुसार शून्य के लिए जाँच करें।

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void spCalcPerc(SqlGuid pID) 
{ 
    // check for null or set default 
    Guid refId = pID.IsNull ? Guid.NewGuid() : pID.Value; 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^