सबसे पहले, मुझे वर्तमान स्थिति की व्याख्या करने दें: मैं डेटाबेस से रिकॉर्ड पढ़ रहा हूं और उन्हें बाद में उपयोग के लिए किसी ऑब्जेक्ट में डाल रहा हूं; आज डेटाबेस प्रकार के बारे में एक सवाल सी # प्रकार रूपांतरण (कास्टिंग?) उठ गया।कैसे (कुशलतापूर्वक) कन्वर्ट (कास्ट?) एक SqlDataReader फ़ील्ड को इसके संबंधित सी # प्रकार में कैसे करें?
एक उदाहरण देखते हैं:
namespace Test
{
using System;
using System.Data;
using System.Data.SqlClient;
public enum MyEnum
{
FirstValue = 1,
SecondValue = 2
}
public class MyObject
{
private String field_a;
private Byte field_b;
private MyEnum field_c;
public MyObject(Int32 object_id)
{
using (SqlConnection connection = new SqlConnection("connection_string"))
{
connection.Open();
using (SqlCommand command = connection.CreateCommand())
{
command.CommandText = "sql_query";
using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleRow))
{
reader.Read();
this.field_a = reader["field_a"];
this.field_b = reader["field_b"];
this.field_c = reader["field_c"];
}
}
}
}
}
}
यह (जाहिर है) में नाकाम रहने की वजह से तीन this.field_x = reader["field_x"];
कॉल Cannot implicitly convert type 'object' to 'xxx'. An explicit conversion exists (are you missing a cast?).
संकलक त्रुटि फेंक रहे है।
सही करने के लिए इस मैं वर्तमान में दो तरीके (के field_b
उदाहरण का उपयोग करते हैं) का पता: नंबर एक this.field_b = (Byte) reader["field_b"];
है और नंबर दो this.field_b = Convert.ToByte(reader["field_b"]);
है।
DBNull
क्षेत्रों अपवाद फेंक रहे हैं के रूप में कास्ट (यहां तक कि String
के रूप में नल प्रकार के साथ), दो नंबर के साथ समस्या यह चींटी विफल हो रहा है कि यह शून्य मान संरक्षण नहीं कर रहा है है (Convert.ToString(DBNull)
पैदावार एक String.Empty
), और मैं उन्हें enums के साथ भी उपयोग नहीं कर सकता।
तो, इंटरनेट पर लुकअप के एक जोड़े के बाद और यहाँ StackOverflow, क्या मैं के साथ आया था पर है:
public static class Utilities
{
public static T FromDatabase<T>(Object value) where T: IConvertible
{
if (typeof(T).IsEnum == false)
{
if (value == null || Convert.IsDBNull(value) == true)
{
return default(T);
}
else
{
return (T) Convert.ChangeType(value, typeof(T));
}
}
else
{
if (Enum.IsDefined(typeof(T), value) == false)
{
throw new ArgumentOutOfRangeException();
}
return (T) Enum.ToObject(typeof(T), value);
}
}
}
इस तरह से मैं हर मामले को संभाल चाहिए।
प्रश्न है: क्या मुझे कुछ याद आ रही है? क्या मैं एक WOMBAT कर रहा हूं (पैसा, मस्तिष्क और समय का अपशिष्ट) क्योंकि ऐसा करने के लिए एक तेज और साफ तरीका है? यह सब सही है? फायदा?
यह सुंदर व्यापक और मेरे लिए सामान्य लग रहा है। SqlDataReader क्लास में कुछ .GetInt32(), .GetBytes() प्रकार परिवर्तित करने के लिए प्रकार हैं जो आपके लिए कुछ ऐसा करेंगे, लेकिन मुझे लगता है कि आपको अभी भी नल की जांच करने की आवश्यकता है। मैं LINQ या ORM में भी देखता हूं, वे आपके लिए इस तरह के विवरण का ख्याल रखते हैं। –
डेटा रीडर के विभिन्न GetXXX विधियों को देखें। शायद वे वही हैं जो आप खोज रहे हैं। –
आपने *** FromDatabase *** का उपयोग करने का प्रयास किया था? *** int, int ?, स्ट्रिंग, डेटटाइम का उपयोग करके इसके बारे में अंतिम सरल ?, एनम *** मान? – Kiquenet