0

私はdbテーブルからデータリーダーにデータを入力しました、そして私は次のようなクラスを持っています

public class CandidateApplication
{
                public string EmailID { get; set; }
                public string Name { get; set; }
                public string PhoneNo { get; set; }
                public string CurrentLocation { get; set; }
                public string PreferredWorkLocation { get; set; }
                public int RoleApplingFor { get; set; }
                public string CurrentJobTitle { get; set; }
                public int EducationLevel { get; set; }
                public decimal SalaryExpected { get; set; }
                public string AvailableTime { get; set; }
                public int AdvertID { get; set; }
                public bool SignForAlert { get; set; }
                public string CVInText { get; set; }
                public string CVFileName { get; set; }
                public bool IsDownloaded { get; set; }
                public string specialization { get; set; }
                public bool isallocated { get; set; }
                public int id { get; set; }
                public string AdvertAdditionalInfo { get; set; }
}

上記のクラスをループで設定できます。データリーダーで反復してクラスにデータを入力することはできますが、データリーダーからクラスにデータを入力するためのショートカット方法があるかどうかを知りたいです。

データリーダーからクラスへのデータの逆シリアル化が可能な場合は、データリーダーにないフィールドがクラスにあるかどうか、その状況を処理する方法も教えてください。

4

2 に答える 2

2

あなたの質問に対する答えではありませんがSqlDataAdapter、データリーダーの代わりに使用する次の回避策を検討することをお勧めします。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main(string[] args)
    {

        var cs = "YourConnectionString";
        var xml = "";
        using (var con = new SqlConnection(cs))
        using (var c = new SqlCommand("SELECT * FROM CandidateApplication", con))
        {
            con.Open();
            using (var adapter = new SqlDataAdapter(c))
            {
                var ds = new DataSet("CandidateApplications");
                ds.Tables.Add("CandidateApplication");
                adapter.Fill(ds, ds.Tables[0].TableName);
                xml = ds.GetXml();
            }
        }

        // We need to specify the root element
        var rootAttribute = new XmlRootAttribute();

        // The class to use as the XML root element (should match the name of 
        // the DataTable in the DataSet above)
        rootAttribute.ElementName = "CandidateApplications";

        // Initializes a new instance of the XmlSerializer class that can 
        // serialize objects of the specified type into XML documents, and 
        // deserialize an XML document into object of the specified type. 
        // It also specifies the class to use as the XML root element.
        // I chose List<CandidateApplication> as the type because I find it
        // easier to work with (but CandidateApplication[] will also work)
        var xs = new XmlSerializer(typeof(List<CandidateApplication>), rootAttribute);

        // Deserialize the XML document contained by the specified TextReader, 
        // in our case, a StringReader instance constructed with xml as a parameter.
        List<CandidateApplication> results = xs.Deserialize(new StringReader(xml));
    }
}

取得したデータにないプロパティについては、デフォルト値でプライベートフィールドを宣言できます。

string _advertAdditionalInfo = "default";
public string AdvertAdditionalInfo
{
    get
    {
        return _advertAdditionalInfo;
    }
    set
    {
        _advertAdditionalInfo = value;
    }
}

取得したデータが特定のプロパティを入力しないようにする場合は、次を使用します。

[XmlIgnoreAttribute]
public string AdvertAdditionalInfo { get; set; }
于 2013-02-28T12:53:46.460 に答える
1

データリーダーを使用する必要はありません。データをDataTableに入力し、以下のメソッドを使用してCandidateApplicationクラスのリストを作成できます。

呼び出し :-

List<CandidateApplication> CandidateList = GetCandidateInformation();

リストを生成するメソッド:-

public List<CandidateApplication> GetCandidateInformation()
        {
            DataTable dt = new DataTable();

            using (OleDbConnection con = new OleDbConnection(ConfigurationManager.AppSettings["con"]))
            {
                using (OleDbCommand cmd = new OleDbCommand("SELECT * FROM [TableName]", con))
                {
                    var adapter = new OleDbDataAdapter();
                    adapter.SelectCommand = cmd;

                    con.Open();
                    adapter.Fill(dt);

                    var CandApp = (from row in dt.AsEnumerable()

                    select new CandidateApplication
                    {

                    EmailID = row.Field<string>("EmailID"),
                    Name  = row.Field<string>("Name"),
                    PhoneNo = row.Field<string>("PhoneNo"),
                    CurrentLocation = row.Field<string>("CurrentLocation"),
                    PreferredWorkLocation = row.Field<string>("PreferredWorkLocation"),
                    RoleApplingFor = row.Field<int>("RoleApplingFor"),
                    CurrentJobTitle = row.Field<string>("CurrentJobTitle"),
                    EducationLevel = row.Field<int>("EducationLevel "),
                    SalaryExpected = row.Field<decimal>("SalaryExpected"),
                    AvailableTime = row.Field<string>("AvailableTime"),
                    AdvertID = row.Field<int>("AdvertID"),
                    SignForAlert = row.Field<bool>("SignForAlert"),
                    CVInText = row.Field<string>("CVInText"),
                    CVFileName = row.Field<string>("CVFileName"),
                    IsDownloaded = row.Field<bool>("IsDownloaded"),
                    Specialization = row.Field<string>("Specialization"),
                    Isallocated = row.Field<bool>("Isallocated"),
                    Id = row.Field<int>("Id"),
                    AdvertAdditionalInfo = row.Field<string>("AdvertAdditionalInfo")


                    }).ToList();

                    return CandApp;
                }
            }
        }
于 2013-02-28T13:44:27.163 に答える