Wynik procedury SQL do zmiennej typu klasa, nie Entity Framework

0

Cześć, potrzebuję pomocy.

Mam klasę:

    public partial class DANE_LISTA
    {
        public int ID { get; set; }
        public string NAZWA { get; set; }
        public string NAZWA2 { get; set; }
        public string NAZWA3 { get; set; }
    }

Tworzę sobie obiekt:

DANE_LISTA dane = new DANE_LISTA();

i mam procedurę składowaną SQL dbo.ZWROC_DANE_LISTA()

Nie mogę użyć Entityframework a chcę wynik procedury (zwracane kolumny identyczne jak w klasie DANE_LISTA) jakoś generycznie zapisać do mojego obiektu dane.

Generalnie wywołuję procedurę w ten sposób:

            DataSet ds = new DataSet();
            DataTable dt = new DataTable();
            using (SqlConnection con = new SqlConnection("..."))
            {
                using (SqlCommand cmd = new SqlCommand("[dbo].[ZWROC_DANE_LISTA]", con))
                {
                    try
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.Add("@P_ID", SqlDbType.Int).Value = id;
                        con.Open();
                        cmd.ExecuteNonQuery();
                        SqlDataAdapter adp = new SqlDataAdapter(cmd);
                        adp.Fill(ds);
                        dt = ds.Tables[0];
                        con.Close();
                    }

Jak to zrobić nie korzystając z Entityframework?

0
john_klamka napisał(a):

Ja tu nie widzę Entity Framework....

I bardzo dobrze że nie widzisz, bo go tu nie ma.
To fragment kodu, który napisałem z pominięciem Entity i brakuje mi jakiegoś powiązania zmiennej dane z wynikiem procedury.

Za pomocą Entity byłoby to banalne ale nie mogę go użyć.

0

Za pomocą gołego SQL'a też jest proste: http://stackoverflow.com/questions/31357337/data-adapter-select-command-connection
Patrz odfajkowany post.

0
grzesiek51114 napisał(a):

Za pomocą gołego SQL'a też jest proste: http://stackoverflow.com/questions/31357337/data-adapter-select-command-connection
Patrz odfajkowany post.

Zwracanie procedury do DataSet już przecież mam napisane - niemal identyczne jak w Twoim przykładzie.

Problemem jest dla mnie przeniesienie zawartości DataSet/DataTable do zmiennej dane która jest obiektem klasy.
Nie chcę kolumna po kolumnie przepisywać tylko jakoś automatycznie przekonwertować skoro wynik procedury zwraca identyczne pola co moja klasa.

0

Przeczytaj sobie ten temat, o ile dobrze Cię zrozumiałem to chcesz DataTable przekonwertować do listy danej klasy w twoim przypadku DANE_LISTA.
http://codereview.stackexchange.com/questions/30714/converting-datatable-to-list-of-class

0

No to skoro nie możesz skorzystać z EF, to pozostaje albo napisanie własnego mapera (refleksje i te sprawy), albo skorzystanie z gotowego takiego jak Dapper https://github.com/StackExchange/dapper-dot-net.

0
neves napisał(a):

No to skoro nie możesz skorzystać z EF, to pozostaje albo napisanie własnego mapera (refleksje i te sprawy), albo skorzystanie z gotowego takiego jak Dapper https://github.com/StackExchange/dapper-dot-net.

A najpierw zlutować własny procesor. ;)

W .NET od początku są klasy do operowania na bazie, trzeba ich tylko użyć. Niepotrzebne też są żadne DataSety, DataTable ani DataAdaptery.

List<SomeData> list = new List<SomeData>();
using (SqlConnection con = new SqlConnection("..."))
{
    using (SqlCommand cmd = new SqlCommand("[dbo].[ZWROC_DANE_LISTA]", con))
    {
        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@P_ID", SqlDbType.Int).Value = id;
            con.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                SomeData sd = new SomeData();
                sd.Prop1 = Convert.ToInt32(dr["Col1"]);
                sd.Prop2 = dr["Col2"].ToString();
                sd.Prop3 = dr["Col3"].ToString();
                list.Add(sd);
            }
            con.Close();
        }
    }
}
0
  public static List<T> DataTableToListObjects<T>(this DataTable table) where T : class, new()
    {
        try
        {
            List<T> list = new List<T>();

            foreach (var row in table.AsEnumerable())
            {
                T obj = new T();

                foreach (var prop in obj.GetType().GetProperties())
                {
                    try
                    {
                        PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                        propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                    }
                    catch
                    {
                        continue;
                    }
                }

                list.Add(obj);
            }

            return list;
        }
        catch
        {
            return null;
        }
    }
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1