22/07/11

Convertire un oggetto in istruzione SQL di Insert/update

Nello scorso articolo abbiamo visto come convertire un DataTable in una collezione di oggetti tipizzata:
Convertire un datatable in oggetti

Questa volta vediamo invece come convertire una collezione di oggetti in istruzioni di insert / update SQL.

Ribadiamo il concetto che esistono degli ORM quali NHibernate,Entity Framework che fanno già queste operazioni in modo eccellente, questo post vuole dare una soluzione semplice per quei progetti dove non è necessario (proprio per il fatto che non sono progetti complessi) oppure per progetti legacy di salvare degli oggetti tramite ADO.Net.

Diamo x scontato queste convenzioni:
- l'oggetto/tabella prevede in campo Id come chiave primaria
- le proprietà che vorremo mappare saranno di tipo Virtual, tutte le altre verranno ignorate
- il metodo eseguirà una insert (se id=0) o una update (se id!=0)
- il metodo accetta in input una IList che verrà valorizzato e vi servirà poi per eseguire il comando SQl
- il metodo ritorna la query sql che vi servirà poi per eseguire il comando di insert/update

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Reflection;
using MpsManager.Controllers.Helper;

namespace MpsManager.Models
{

    public static class MapDataAndBusinessEntityHelper
    {
      

        public static T SaveOrUpdateBusinessEntityToSqlData(T entity, string tableName,bool isUpdate) where T : new()
        {

            var hashtable = new Dictionary();
            PropertyInfo[] properties = typeof(T).GetProperties();

               
            foreach (PropertyInfo info in properties)
            {

                if (info.GetGetMethod().IsVirtual || (isUpdate && info.Name=="Id"))
                {
                    
                    hashtable[info.Name.ToUpper()] = info;
                }
            }

            IList list = new List();

            SQLADOHelper.ExecuteScalarQueryCommand(isUpdate ? UpdateObject(hashtable, entity, tableName, list) : InsertObject(hashtable, entity, tableName, list), list);

            return entity;
        }

        private static string UpdateObject(Dictionary hashtable, object entity, string tableName, IList list)
        {

            var isFirst = true;

            var sql = "update " + tableName + " SET ";
            foreach (var item in hashtable)
            {
                list.Add(new SqlParameter("@" + item.Key, ((PropertyInfo)item.Value).GetValue(entity, null) ?? DBNull.Value));

                if (item.Key.ToString().ToUpper() != "ID")
                {
                    sql += (isFirst ? "" : ",") + "[" + item.Key + "]=" + "@" + item.Key;
                    isFirst = false;
                }
            }
            sql += " where Id =@ID";

            return sql;
        }


        private static string InsertObject(Dictionary hashtable, object entity, string tableName,IList list )
        {
            var isFirst = true;

            var sql = "insert into " + tableName + " (";
            foreach (var item in hashtable)
            {
                sql += (isFirst ? "" : ",") + "[" + item.Key + "]";
                isFirst = false;
            }
            sql += ") values (";

            isFirst = true;
            foreach (var item in hashtable)
            {
                list.Add(new SqlParameter("@" + item.Key, ((PropertyInfo)item.Value).GetValue(entity, null) ?? DBNull.Value));

                sql += (isFirst ? "" : ",") + "@" + item.Key;
                isFirst = false;
            }

            sql += ")";
            return sql;
        }
    }

}
Questo invece è l'helper per poter effettuare operazioni Ado.net
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace MpsManager.Controllers.Helper
{
    public class SQLADOHelper
    {
        public static string ConnectionString
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
            }
        }

        public static object ExecuteScalarQueryCommand(string sql)
        {
            return ExecuteScalarQueryCommand(sql, new List());
        }
        public static void ExecuteNonQueryCommand(string sql)
        {
            using (IDbConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();
                using (IDbCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                    cmd.ExecuteNonQuery();
                }
            }
        }
        public static DataTable ExecuteQueryCommand(string sql)
        {
            return ExecuteQueryCommand(sql, new List());
        }
        public static DataTable ExecuteQueryCommand(string sql, IList list)
        {
            var dt = new DataTable();
            using (var connection = new SqlConnection(ConnectionString))
            {

                var cmd = new SqlCommand(sql, connection);
                foreach (var sqlParameter in list)
                {
                    cmd.Parameters.Add(sqlParameter);
                }
                connection.Open();

                SqlDataReader dr = cmd.ExecuteReader();

                dt.Load(dr);

                connection.Close();
            }
            return dt;
        }

        public static object ExecuteScalarQueryCommand(string sql, IList list)
        {
            using (IDbConnection connection = new SqlConnection(ConnectionString))
            {
                connection.Open();

                using (IDbCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = sql;
                    foreach (var sqlParameter in list)
                    {
                        cmd.Parameters.Add(sqlParameter);    
                    }
                    try
                    {
                        object result = cmd.ExecuteScalar();
                        return result;
                    }
                    catch (Exception e)
                    {
                        throw new ApplicationException("ExecuteScalarQueryCommand", e);
                    }
                }
            }
        }
    }
}

0 commenti:

Posta un commento

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Grants For Single Moms