2013-10-14 4 views
10

मुझे the Dapper .NET project home page पर निम्न टिप्पणी मिली।डैपर और वर्कर्स

Dapper supports varchar params, if you are executing a where clause on a varchar column using a param be sure to pass it in this way:

Query<Thing>("select * from Thing where Name = @Name", new {Name = 
    new DbString { Value = "abcde", IsFixedLength = true, Length = 10, IsAnsi = true }); 

On Sql Server it is crucial to use the unicode when querying unicode and ansi when querying non unicode

मैं एक विरासत डेटाबेस (एसक्यूएल सर्वर 2008), varchar मानकों के साथ संग्रहित प्रक्रियाओं के बहुत सारे के साथ साथ प्रयोग के लिए साफ-सुथरी का मूल्यांकन कर रहा हूँ, और मैं एक छोटे से इस प्रतिबंध से संदेह में हूँ।

हाथ से तैयार किए ADO.NET कोड के साथ

, मैं ऊपर क्वेरी के लिए निम्न का उपयोग करेंगे:

new SqlParameter("@Name", "abcde") 

को निर्दिष्ट है कि क्या यह यूनिकोड या नहीं, और न ही लंबाई है बिना।

  • मैं डैप्पर के साथ इस वर्बोज़ DbString वाक्य रचना की आवश्यकता क्यों है, स्तंभ लंबाई, IsFixedLength और IsAnsi को निर्दिष्ट?

  • क्यों एक वर्चर कॉलम के लिए IsFixedLength = सत्य है (मुझे उम्मीद है कि यह एक char या nchar कॉलम के लिए सच होगा)?

  • क्या मुझे संग्रहीत प्रक्रिया पैरामीटर के लिए इस तरह डीबीस्ट्रिंग का उपयोग करना है?

मैं अपने DAL कोड अधिक संक्षिप्त बनाने के लिए साफ-सुथरी उम्मीद कर रहा था, लेकिन यह इसे और अधिक varchar मापदंडों के लिए वर्बोज़ बनाने जा रहा है।

अद्यतन

मैं थोड़ा आगे पर गौर किया है, यही कारण है कि साफ-सुथरी इस varchar प्रतिबंध है, जो मैं अपने हाथ से तैयार कोड में है करने के लिए है, जहां मैं आमतौर पर करते हैं प्रकट नहीं होते हैं होता समझने की कोशिश करने के लिए इस प्रकार एक इनपुट पैरामीटर बनाएँ:

var parameter = factory.CreateParameter(); // Factory is a DbProviderFactory 
parameter.Name = ...; 
parameter.Value = ...; 

और आमतौर पर प्रदाता अपने नियम का उपयोग कर, जब तक कि मैं विशेष रूप से यह मजबूर करने के लिए चाहते हैं DbType अनुमान लगाने के लिए छोड़ दें।

var dbType = param.DbType; // Get dbType and value 
var val = param.Value;  // from 

... 
// Coerce dbType to a non-null value if val is not null !!!!! 
if (dbType == null && val != null) dbType = SqlMapper.LookupDbType(val.GetType(),name); 
... 
var p = command.CreateParameter(); 
... 
if (dbType != null)      
{       
    p.DbType = dbType.Value;      
} 

यानी:

डैप्पर के DynamicParameters वर्ग को देखते हुए, यह एक तरीका है AddParameters जो पैरामीटर बनाता है इस प्रकार है यह स्पष्ट रूप से प्रदाता को अपने नियमों का उपयोग करने के बजाय, अपने स्वयं के एल्गोरिदम के साथ दिखने वाले मूल्य के लिए IDataParameter.DbType को सहारा देता है।

क्या इसके लिए कोई अच्छा कारण है? यह मेरे लिए गलत लगता है, खासकर वर्चर्स पैरामीटर के लिए डैपर के समर्थन के बारे में टिप्पणी के प्रकाश में।

उत्तर

-1
var param = new { Varchar1 = "", Varchar2 = "" }; 
db.Query("SP", param, commandType:CommandType.StoredProcedure); 
+0

स्टैक ओवरफ़्लो में आपका स्वागत है! कोड केवल उत्तर ही स्वयं पर बहुत उपयोगी नहीं हैं। इससे मदद मिलेगी यदि आप कुछ विवरण जोड़ सकते हैं कि यह कैसे प्रश्न/उत्तर देता है। – SiHa

+0

यह थोड़ा अस्पष्ट सवाल है, लेकिन दूसरों के लिए वर्चर्स और संग्रहीत प्रक्रियाओं का उपयोग करने के लिए पर्याप्त संकेत होना चाहिए। – dbol

0

ओडीबीसी के साथ काम करते समय आपको इस वाक्यविन्यास की आवश्यकता है।

आपको डैपर के लिए सी # में डीबीस्ट्रिंग के रूप में एक CHAR (30) फ़ील्ड को परिभाषित करने की आवश्यकता होगी और ड्रैपर को टेक्स्ट/ब्लॉब प्रकार मानने से रोकने के लिए लंबाई (30) और ansi (true) मान भी सेट करना होगा। अन्यथा आपको त्रुटि प्राप्त होगी: "टेक्स्ट/बाइट ब्लॉब प्रकार को बदलने का अवैध प्रयास"।

मुझे ओडीबीसी का उपयोग करके इन त्रुटि को इनफॉर्मिक्स से कनेक्ट करने के लिए मिल रहा था जब तक कि मैंने अपने पैरा को डीबीस्ट्रिंग() के रूप में परिभाषित नहीं किया और लंबाई और ansi मान निर्धारित किए।

More info here

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