ড্যাপারের সাথে সন্নিবেশ এবং আপডেটগুলি সম্পাদন করা হচ্ছে


194

আমি ড্যাপার ব্যবহারে আগ্রহী - তবে আমি যা বলতে পারি তা থেকে কেবল ক্যোয়ারি এবং এক্সিকিউটকে সমর্থন করে। আমি দেখতে পাচ্ছি না যে ড্যাপারে অবজেক্টগুলি সন্নিবেশ এবং আপডেট করার একটি উপায় অন্তর্ভুক্ত রয়েছে।

আমাদের প্রকল্পটি (বেশিরভাগ প্রকল্প?) সন্নিবেশ এবং আপডেটগুলি করা দরকার তা বিবেচনা করে, ড্যাপারের পাশাপাশি সন্নিবেশ এবং আপডেটগুলি করার জন্য সেরা অনুশীলনটি কী?

সাধারণত আমাদের পরামিতি বিল্ডিংয়ের ADO.NET পদ্ধতি অবলম্বন করতে হবে না etc.

এই মুহুর্তে আমি যে সর্বোত্তম উত্তরটি সামনে আসতে পারি তা হ'ল সন্নিবেশ এবং আপডেটের জন্য লিনকোটোএসকিউএল ব্যবহার করা। এর চেয়ে ভাল উত্তর আর কী আছে?


3
আমি নিজেই ড্যাপার.এনইটি থেকে এই অবদান এক্সটেনশনটি ব্যবহার করি। github.com/StackExchange/dapper-dot-net/tree/master/…
রাজীব

উত্তর:


201

আমরা কয়েকটি সহায়ক তৈরি করার দিকে তাকিয়ে রয়েছি, এখনও এপিআইয়ের সিদ্ধান্ত নিয়েছি এবং যদি এটি হয় তবে না। দেখুন: https://code.google.com/archive/p/dapper-dot-net/issues/6 অগ্রগতির জন্য।

মধ্য সময়ে আপনি নিম্নলিখিত করতে পারেন

val = "my value";
cnn.Execute("insert into Table(val) values (@val)", new {val});

cnn.Execute("update Table set val = @val where Id = @id", new {val, id = 1});

ইত্যাদি

আমার ব্লগ পোস্টটিও দেখুন: বিরক্তিকর INSERT সমস্যা

হালনাগাদ

মন্তব্যে উল্লেখ করা হয়েছে যে, এই এক্সটেনশন পদ্ধতিগুলির আকারে ড্যাপার.কন্ট্রিব প্রকল্পে এখন বেশ কয়েকটি এক্সটেনশান রয়েছে IDbConnection:

T Get<T>(id);
IEnumerable<T> GetAll<T>();
int Insert<T>(T obj);
int Insert<T>(Enumerable<T> list);
bool Update<T>(T obj);
bool Update<T>(Enumerable<T> list);
bool Delete<T>(T obj);
bool Delete<T>(Enumerable<T> list);
bool DeleteAll<T>();

4
হাই স্যাম, Google এর সাথে আপনার এইরকম উত্তর দেন পাওয়া যায় এবং আমি ভাবছিলাম যদি কোড শেষ লাইন শব্দ অন্তর্ভুক্ত করা উচিত setহিসাবে cnn.Execute("update Table SET val = @val where Id = @id", new {val, id = 1});বা এই সপ্রতিভ নির্দিষ্ট হয়? আমি ড্যাপারে নতুন এবং আপডেটের সন্ধান করছিলাম :)
জেপি হেলিমোনস

1
@ জেপি হেলিমোনস আমি এটি চেষ্টা করেছি var updateCat = connection.Execute("UPDATE tCategories SET sCategory = @val WHERE iCategoryID = @id", new { val = "dapper test", id = 23 });এবং এটি কার্যকর হয়েছে। এসইটি ব্যবহার না করে আমি এস ক্যাটাগরির নিকটে একটি এসকিউএলেক্সেপশন সিনট্যাক্স ত্রুটি পাই।
দামি

3
ডিসেম্বর 2015 এ দ্রুত এগিয়ে: github.com/StackExchange/dapper-dot-net/tree/master/…
রোসদি কাশিম

3
@ রসদিকাসিম এটি কি ডাপার ব্যবহারের উদ্দেশ্যকে পরাভূত করে না? আমি এসকিউএল ব্যবহার করতে চাই এটি এটি বিমূর্ত। আমি কী মিস করছি?
জনি

2
@ জোহনি এটি কেবল সহায়ক শ্রেণি ... কিছু লোক তাদের কোডটি যথাসম্ভব সুসংহতভাবে চায় ... আপনি যদি এটি না চান তবে আপনাকে এটি ব্যবহার করতে হবে না।
রোসদী কাশিম

67

ড্যাপার ব্যবহার করে সিআরইউডি অপারেশন করা সহজ কাজ। আমি নীচের উদাহরণগুলি উল্লেখ করেছি যা আপনাকে সিআরইউডি অপারেশনে সহায়তা করতে পারে।

সি আরডির জন্য কোড :

পদ্ধতি # 1: আপনি বিভিন্ন সত্ত্বা থেকে মান সন্নিবেশ করানোর সময় এই পদ্ধতিটি ব্যবহৃত হয়।

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string insertQuery = @"INSERT INTO [dbo].[Customer]([FirstName], [LastName], [State], [City], [IsActive], [CreatedOn]) VALUES (@FirstName, @LastName, @State, @City, @IsActive, @CreatedOn)";

    var result = db.Execute(insertQuery, new
    {
        customerModel.FirstName,
        customerModel.LastName,
        StateModel.State,
        CityModel.City,
        isActive,
        CreatedOn = DateTime.Now
    });
}

পদ্ধতি # 2: যখন আপনার সত্তার বৈশিষ্ট্যগুলির এসকিউএল কলামগুলির মতো একই নাম থাকে তখন এই পদ্ধতিটি ব্যবহৃত হয়। সুতরাং, ডিপার একটি ওআরএম হ'ল ম্যাচিং এসকিউএল কলামগুলির সাথে সত্তার বৈশিষ্ট্যগুলির মানচিত্র।

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string insertQuery = @"INSERT INTO [dbo].[Customer]([FirstName], [LastName], [State], [City], [IsActive], [CreatedOn]) VALUES (@FirstName, @LastName, @State, @City, @IsActive, @CreatedOn)";

    var result = db.Execute(insertQuery, customerViewModel);
}

সি আর ইউডির জন্য কোড :

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string selectQuery = @"SELECT * FROM [dbo].[Customer] WHERE FirstName = @FirstName";

    var result = db.Query(selectQuery, new
    {
        customerModel.FirstName
    });
}

সিআর ইউ ডি এর জন্য কোড :

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string updateQuery = @"UPDATE [dbo].[Customer] SET IsActive = @IsActive WHERE FirstName = @FirstName AND LastName = @LastName";

    var result = db.Execute(updateQuery, new
    {
        isActive,
        customerModel.FirstName,
        customerModel.LastName
    });
}

সিআরইউ ডি এর জন্য কোড :

using (IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["myDbConnection"].ConnectionString))
{
    string deleteQuery = @"DELETE FROM [dbo].[Customer] WHERE FirstName = @FirstName AND LastName = @LastName";

    var result = db.Execute(deleteQuery, new
    {
        customerModel.FirstName,
        customerModel.LastName
    });
}

26

আপনি এটি এইভাবে করতে পারেন:

sqlConnection.Open();

string sqlQuery = "INSERT INTO [dbo].[Customer]([FirstName],[LastName],[Address],[City]) VALUES (@FirstName,@LastName,@Address,@City)";
sqlConnection.Execute(sqlQuery,
    new
    {
        customerEntity.FirstName,
        customerEntity.LastName,
        customerEntity.Address,
        customerEntity.City
    });

sqlConnection.Close();

36
আপনার ব্যবহার করা উচিত using-statementযাতে কোনও ব্যতিক্রমের ক্ষেত্রেও সংযোগটি বন্ধ হয়ে যায়।
টিম শ্মেলেটার

12
আপনি কেবল বেনামে টাইপ না করে
গ্রাহকতা

@ থমাসলভেস্ক আপনি এর অর্থ কী? আপনি যা বলতে চান তার একটি ক্ষুদ্র কোড উদাহরণ সরবরাহ করতে পারেন?
iaacp

4
@ আইএএসিপি, আমি এর অর্থ:sqlConnection.Execute(sqlQuery, customerEntity);
টমাস

1
@ থমাসলভেস্ক একই প্যাটার্নটি ব্যবহার করে আমরা কী আপডেট করতে পারি? অর্থাত্sqlConnection.Execute(sqlQuery, customerEntity);
শঙ্কর

16

Dapper.Contrib ব্যবহার করা এটি এর মতোই সহজ:

সন্নিবেশ তালিকা:

public int Insert(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Insert(yourClass) ;
    }
}

একক প্রবেশ করান:

public int Insert(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Insert(yourClass) ;
    }
}

আপডেট তালিকা:

public bool Update(IEnumerable<YourClass> yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Update(yourClass) ;
    }
}

একক আপডেট করুন:

public bool Update(YourClass yourClass)
{
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
        conn.Open();
        return conn.Update(yourClass) ;
    }
}

সূত্র: https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib


1
কোনও একক বস্তু সন্নিবেশ করানোর জন্য উপরেরটি ব্যবহার করে আপনি নতুন পরিচয় নম্বরটি আবার খুঁজে পেতে এবং আপনার মডেলটিতে এটি আবার রাখতে পারেন ... তবে আপনি কীভাবে এটি সামগ্রীর তালিকা সন্নিবেশ করানোর জন্য করেন - তালিকার অবজেক্টগুলিতে নেই পরিচয় ক্ষেত্র। আপনি কি তালিকার মধ্য দিয়ে পুনরাবৃত্তি করতে হবে এবং তারপরে প্রতিবার নতুন আইডি বের করে একবারে একটি করে IDোকাতে হবে?
হারাগ

1
@harag আপনার যদি নতুন আইডি দরকার হয় অন্য কোথাও আমার মনে হয় আপনার এটি করা উচিত। সত্তা ফ্রেমওয়ার্ক সন্নিবেশ সংক্রান্ত কোনও সমস্যা ছাড়াই ক্লাসগুলির মতো রেফারেন্সের ধরণগুলি পরিচালনা করে তবে আমি জানি না যে ড্যাপার.কন্ট্রিব এটির সাথে কীভাবে কাজ করে যদি এটি আপনার কোণ ছিল।
ওগ্লাস

5
@ ওগ্লাস, ধন্যবাদ আমি লক্ষ্য করেছি যে "সংযোগ। ইনসার্ট (মায়োবজেক্ট)" "মাইবজেক্ট" "এর" [কী] "সম্পত্তি আপডেট করবে যদি আমি কেবল একটি বস্তু সন্নিবেশ করিয়ে দিই, তবে যদি আমি একই পদ ব্যবহার করে 5 অবজেক্টের একটি তালিকা প্রবেশ করিয়ে দিচ্ছি "সংযোগ.ইনসেট (মাইবজেক্টলিস্ট)" তারপরে [কীগুলি] বৈশিষ্ট্যগুলির কোনওটিই আপডেট হয় না, সুতরাং আমাকে তালিকায় ফোরচ আইটেমটি ম্যানুয়ালি করতে হবে এবং একবারে সেগুলি একটি .োকাতে হবে।
হারাগ

1
ইন conn.Update(yourClass)যদি কিছু বৈশিষ্ট্য নাল হয় , তাহলে শূন্য থেকে ক্ষেত্র আপডেট ? কাজ করছে না. নীল থেকে ক্ষেত্র আপডেট করুনNot partials updates
কিকিনেট

5

আপনি স্টোরেড পদ্ধতি এবং জেনেরিক পদ্ধতিতে ড্যাপার ব্যবহার করতে পারেন যার মাধ্যমে সবকিছু সহজেই পরিচালনাযোগ্য।

আপনার সংযোগটি সংজ্ঞায়িত করুন:

public class Connection: IDisposable
{
    private static SqlConnectionStringBuilder ConnectionString(string dbName)
    {
        return new SqlConnectionStringBuilder
            {
                ApplicationName = "Apllication Name",
                DataSource = @"Your source",
                IntegratedSecurity = false,
                InitialCatalog = Database Name,
                Password = "Your Password",
                PersistSecurityInfo = false,
                UserID = "User Id",
                Pooling = true
            };
    }

    protected static IDbConnection LiveConnection(string dbName)
    {
        var connection = OpenConnection(ConnectionString(dbName));
        connection.Open();
        return connection;
    }

    private static IDbConnection OpenConnection(DbConnectionStringBuilder connectionString)
    {
        return new SqlConnection(connectionString.ConnectionString);
    }

    protected static bool CloseConnection(IDbConnection connection)
    {
        if (connection.State != ConnectionState.Closed)
        {
            connection.Close();
            // connection.Dispose();
        }
        return true;
    }

    private static void ClearPool()
    {
        SqlConnection.ClearAllPools();
    }

    public void Dispose()
    {
        ClearPool();
    }
}

আপনার প্রকৃত প্রয়োজন ডিপার পদ্ধতিগুলি নির্ধারণ করতে একটি ইন্টারফেস তৈরি করুন:

 public interface IDatabaseHub
    {
   long Execute<TModel>(string storedProcedureName, TModel model, string dbName);

        /// <summary>
        /// This method is used to execute the stored procedures with parameter.This is the generic version of the method.
        /// </summary>
        /// <param name="storedProcedureName">This is the type of POCO class that will be returned. For more info, refer to https://msdn.microsoft.com/en-us/library/vstudio/dd456872(v=vs.100).aspx. </param>
        /// <typeparam name="TModel"></typeparam>
        /// <param name="model">The model object containing all the values that passes as Stored Procedure's parameter.</param>
        /// <returns>Returns how many rows have been affected.</returns>
        Task<long> ExecuteAsync<TModel>(string storedProcedureName, TModel model, string dbName);

        /// <summary>
        /// This method is used to execute the stored procedures with parameter. This is the generic version of the method.
        /// </summary>
        /// <param name="storedProcedureName">Stored Procedure's name. Expected to be a Verbatim String, e.g. @"[Schema].[Stored-Procedure-Name]"</param>
        /// <param name="parameters">Parameter required for executing Stored Procedure.</param>        
        /// <returns>Returns how many rows have been affected.</returns>         
        long Execute(string storedProcedureName, DynamicParameters parameters, string dbName);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="storedProcedureName"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        Task<long> ExecuteAsync(string storedProcedureName, DynamicParameters parameters, string dbName);
}

ইন্টারফেস প্রয়োগ করুন:

     public class DatabaseHub : Connection, IDatabaseHub
        {

 /// <summary>
        /// This function is used for validating if the Stored Procedure's name is correct.
        /// </summary>
        /// <param name="storedProcedureName">Stored Procedure's name. Expected to be a Verbatim String, e.g. @"[Schema].[Stored-Procedure-Name]"</param>
        /// <returns>Returns true if name is not empty and matches naming patter, otherwise returns false.</returns>

        private static bool IsStoredProcedureNameCorrect(string storedProcedureName)
        {
            if (string.IsNullOrEmpty(storedProcedureName))
            {
                return false;
            }

            if (storedProcedureName.StartsWith("[") && storedProcedureName.EndsWith("]"))
            {
                return Regex.IsMatch(storedProcedureName,
                    @"^[\[]{1}[A-Za-z0-9_]+[\]]{1}[\.]{1}[\[]{1}[A-Za-z0-9_]+[\]]{1}$");
            }
            return Regex.IsMatch(storedProcedureName, @"^[A-Za-z0-9]+[\.]{1}[A-Za-z0-9]+$");
        }

     /// <summary>
            /// This method is used to execute the stored procedures without parameter.
            /// </summary>
            /// <param name="storedProcedureName">Stored Procedure's name. Expected to be a Verbatim String, e.g. @"[Schema].[Stored-Procedure-Name]"</param>
            /// <param name="model">The model object containing all the values that passes as Stored Procedure's parameter.</param>
            /// <typeparam name="TModel">This is the type of POCO class that will be returned. For more info, refer to https://msdn.microsoft.com/en-us/library/vstudio/dd456872(v=vs.100).aspx. </typeparam>
            /// <returns>Returns how many rows have been affected.</returns>

            public long Execute<TModel>(string storedProcedureName, TModel model, string dbName)
            {
                if (!IsStoredProcedureNameCorrect(storedProcedureName))
                {
                    return 0;
                }

                using (var connection = LiveConnection(dbName))
                {
                    try
                    {
                        return connection.Execute(
                            sql: storedProcedureName,
                            param: model,
                            commandTimeout: null,
                            commandType: CommandType.StoredProcedure
                            );

                    }
                    catch (Exception exception)
                    {
                        throw exception;
                    }
                    finally
                    {
                        CloseConnection(connection);
                    }
                }
            }

            public async Task<long> ExecuteAsync<TModel>(string storedProcedureName, TModel model, string dbName)
            {
                if (!IsStoredProcedureNameCorrect(storedProcedureName))
                {
                    return 0;
                }

                using (var connection = LiveConnection(dbName))
                {
                    try
                    {
                        return await connection.ExecuteAsync(
                            sql: storedProcedureName,
                            param: model,
                            commandTimeout: null,
                            commandType: CommandType.StoredProcedure
                            );

                    }
                    catch (Exception exception)
                    {
                        throw exception;
                    }
                    finally
                    {
                        CloseConnection(connection);
                    }
                }
            }

            /// <summary>
            /// This method is used to execute the stored procedures with parameter. This is the generic version of the method.
            /// </summary>
            /// <param name="storedProcedureName">Stored Procedure's name. Expected to be a Verbatim String, e.g. @"[Schema].[Stored-Procedure-Name]"</param>
            /// <param name="parameters">Parameter required for executing Stored Procedure.</param>        
            /// <returns>Returns how many rows have been affected.</returns>

            public long Execute(string storedProcedureName, DynamicParameters parameters, string dbName)
            {
                if (!IsStoredProcedureNameCorrect(storedProcedureName))
                {
                    return 0;
                }

                using (var connection = LiveConnection(dbName))
                {
                    try
                    {
                        return connection.Execute(
                            sql: storedProcedureName,
                            param: parameters,
                            commandTimeout: null,
                            commandType: CommandType.StoredProcedure
                            );
                    }
                    catch (Exception exception)
                    {
                        throw exception;
                    }
                    finally
                    {
                        CloseConnection(connection);
                    }
                }
            }



            public async Task<long> ExecuteAsync(string storedProcedureName, DynamicParameters parameters, string dbName)
            {
                if (!IsStoredProcedureNameCorrect(storedProcedureName))
                {
                    return 0;
                }

                using (var connection = LiveConnection(dbName))
                {
                    try
                    {
                        return await connection.ExecuteAsync(
                            sql: storedProcedureName,
                            param: parameters,
                            commandTimeout: null,
                            commandType: CommandType.StoredProcedure
                            );

                    }
                    catch (Exception exception)
                    {
                        throw exception;
                    }
                    finally
                    {
                        CloseConnection(connection);
                    }
                }
            }

    }

আপনি এখন আপনার প্রয়োজন হিসাবে মডেল থেকে কল করতে পারেন:

public class DeviceDriverModel : Base
    {
 public class DeviceDriverSaveUpdate
        {
            public string DeviceVehicleId { get; set; }
            public string DeviceId { get; set; }
            public string DriverId { get; set; }
            public string PhoneNo { get; set; }
            public bool IsActive { get; set; }
            public string UserId { get; set; }
            public string HostIP { get; set; }
        }


        public Task<long> DeviceDriver_SaveUpdate(DeviceDriverSaveUpdate obj)
        {

            return DatabaseHub.ExecuteAsync(
                    storedProcedureName: "[dbo].[sp_SaveUpdate_DeviceDriver]", model: obj, dbName: AMSDB);//Database name defined in Base Class.
        }
}

আপনি প্যারামিটারগুলিও পাশ করতে পারেন:

public Task<long> DeleteFuelPriceEntryByID(string FuelPriceId, string UserId)
        {


            var parameters = new DynamicParameters();
            parameters.Add(name: "@FuelPriceId", value: FuelPriceId, dbType: DbType.Int32, direction: ParameterDirection.Input);
            parameters.Add(name: "@UserId", value: UserId, dbType: DbType.String, direction: ParameterDirection.Input);

            return DatabaseHub.ExecuteAsync(
                    storedProcedureName: @"[dbo].[sp_Delete_FuelPriceEntryByID]", parameters: parameters, dbName: AMSDB);

        }

এখন আপনার নিয়ন্ত্রকদের কাছ থেকে কল করুন:

var queryData = new DeviceDriverModel().DeviceInfo_Save(obj);

আশা করি এটি আপনার কোড পুনরাবৃত্তি প্রতিরোধ করবে এবং সুরক্ষা সরবরাহ করবে;


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.