একটি এসকিউএল সার্ভার কমপ্যাক্ট সংস্করণ ডেটাবেসগুলিতে লিনকিউতে এসকিউএল ব্যতিক্রম একটি "সারি পাওয়া যায় নি বা পরিবর্তিত হয়নি" সমাধান করতে আমি কী করতে পারি?


96

লিনকিউ দিয়ে এসকিউএল সংযোগে (এসকিউএল সার্ভার কমপ্যাক্ট সংস্করণের বিপরীতে) কয়েকটি বৈশিষ্ট্য আপডেট করার পরে ডেটা কনটেক্সটে সাবমিজচেঞ্জগুলি সম্পাদন করার সময় আমি একটি "সারি পাওয়া যায় নি বা পরিবর্তন হয়নি" get চেঞ্জক্লিক্লিটএক্সসেপশন।

var ctx = new Data.MobileServerDataDataContext(Common.DatabasePath);
var deviceSessionRecord = ctx.Sessions.First(sess => sess.SessionRecId == args.DeviceSessionId);

deviceSessionRecord.IsActive = false;
deviceSessionRecord.Disconnected = DateTime.Now;

ctx.SubmitChanges();

ক্যোয়ারীটি নিম্নলিখিত এসকিউএল উত্পন্ন করে:

UPDATE [Sessions]
SET [Is_Active] = @p0, [Disconnected] = @p1
WHERE 0 = 1
-- @p0: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:12:02 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

স্পষ্ট সমস্যা হ'ল যেখানে 0 = 1 , রেকর্ডটি লোড হওয়ার পরে, আমি নিশ্চিত করেছি যে "ডিভাইসসেশনরেকর্ড" এর সমস্ত সম্পত্তি প্রাথমিক কীটি অন্তর্ভুক্ত করার জন্য সঠিক। এছাড়াও "চেঞ্জকনফ্লিক্ট এক্সপ্লেশন" ধরার সময় কেন এটি ব্যর্থ হয়েছে সে সম্পর্কে কোনও অতিরিক্ত তথ্য নেই। আমি এটিও নিশ্চিত করেছি যে এই ব্যতিক্রমটি ডাটাবেসে ঠিক একটি রেকর্ড দিয়ে ফেলেছে (যে রেকর্ডটি আমি আপডেট করার চেষ্টা করছি)

আশ্চর্যের বিষয়টি হ'ল কোডের বিভিন্ন বিভাগে আমার খুব অনুরূপ আপডেট স্টেটমেন্ট রয়েছে এবং এটি নিম্নলিখিত এসকিউএল উত্পন্ন করে এবং সত্যই আমার এসকিউএল সার্ভার কমপ্যাক্ট সংস্করণ ডেটাবেস আপডেট করে।

UPDATE [Sessions]
SET [Is_Active] = @p4, [Disconnected] = @p5
WHERE ([Session_RecId] = @p0) AND ([App_RecId] = @p1) AND ([Is_Active] = 1) AND ([Established] = @p2) AND ([Disconnected] IS NULL) AND ([Member_Id] IS NULL) AND ([Company_Id] IS NULL) AND ([Site] IS NULL) AND (NOT ([Is_Device] = 1)) AND ([Machine_Name] = @p3)
-- @p0: Input Guid (Size = 0; Prec = 0; Scale = 0) [0fbbee53-cf4c-4643-9045-e0a284ad131b]
-- @p1: Input Guid (Size = 0; Prec = 0; Scale = 0) [7a174954-dd18-406e-833d-8da650207d3d]
-- @p2: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:50 PM]
-- @p3: Input String (Size = 0; Prec = 0; Scale = 0) [CWMOBILEDEV]
-- @p4: Input Boolean (Size = 0; Prec = 0; Scale = 0) [False]
-- @p5: Input DateTime (Size = 0; Prec = 0; Scale = 0) [9/4/2008 5:20:52 PM]
-- Context: SqlProvider(SqlCE) Model: AttributedMetaModel Build: 3.5.21022.8

আমি নিশ্চিত করেছি যে লাইনকিউ ক্লাস উত্পন্ন করে ডেটাবেস স্কিমা এবং ডিবিএমএল উভয়ই যথাযথ প্রাথমিক ক্ষেত্রের মানগুলি চিহ্নিত করা হয়েছে।

আমার ধারণা এটি প্রায় দুই অংশের প্রশ্ন:

  1. ব্যতিক্রম কেন নিক্ষেপ করা হচ্ছে?
  2. উত্পন্ন এসকিউএল-এর দ্বিতীয় সেটটি পর্যালোচনা করার পরে, বিরোধগুলি সনাক্ত করার মতো মনে হচ্ছে এটি সমস্ত ক্ষেত্রগুলি পরীক্ষা করে দেখতে ভাল লাগবে, তবে আমি ধারণা করি এটি মোটামুটি অকার্যকর হবে। এটি কি এভাবে সর্বদা কাজ করে? কেবলমাত্র প্রাথমিক কীটি পরীক্ষা করার জন্য কোনও সেটিংস রয়েছে?

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


এফডাব্লুআইডাব্লু: অজান্তেই পদ্ধতিটি দু'বার কল করার সময় আমি এই ত্রুটিটি পেয়েছিলাম। এটি দ্বিতীয় কল এ ঘটবে।
ক্রিস

উত্তর:


191

খারাপ, তবে সহজ:

ও / আর-ডিজাইনারের সমস্ত ক্ষেত্রের জন্য ডেটা টাইপগুলি আপনার এসকিউএল টেবিলের ডেটা ধরণের সাথে মেলে কিনা তা পরীক্ষা করে দেখুন। অবিশ্বাস্য জন্য ডাবল চেক! ও / আর-ডিজাইনার এবং এসকিউএল উভয় ক্ষেত্রেই একটি কলামটি বাধাগ্রয়ী হওয়া উচিত, বা উভয় ক্ষেত্রেই সংক্ষিপ্ত নয়।

উদাহরণস্বরূপ, একটি এনভিচারার কলাম "শিরোনাম" আপনার ডাটাবেসে NULLable হিসাবে চিহ্নিত হয়েছে এবং এতে NULL মান রয়েছে। যদিও কলামটি আপনার ও / আর-ম্যাপিংয়ে নাল নয় হিসাবে চিহ্নিত হয়েছে, লিংক এটি সফলভাবে লোড করবে এবং কলাম-স্ট্রিংটি নালায় সেট করবে।

  • এখন আপনি কিছু পরিবর্তন করুন এবং সাবম্যাচেন্জেস () কল করুন।
  • শিরোনামটি অন্য কারও দ্বারা পরিবর্তন করা হয়নি তা নিশ্চিত করতে লিনক একটি "এসইকিউএল কোয়েরি তৈরি করে" যেখানে [শিরোনাম] নিস হল "রয়েছে"
  • লিংক ম্যাপিংয়ে [শিরোনাম] এর বৈশিষ্ট্যগুলি সন্ধান করে।
  • লিনকিউ [শিরোনাম] ননযোগ্য পাবে।
  • [শিরোনাম] যেহেতু নালাম নয়, যুক্তি দ্বারা এটি কখনই নাল হতে পারে না!
  • সুতরাং, ক্যোয়ারীটি অপ্টিমাইজ করে লিনকিউ এটি "যেখানে 0 = 1", "কখনই নয়" এর এসকিউএল সমতুল্য করে।

ক্ষেত্রের ডেটা প্রকারগুলি এসকিউএল-তে ডেটা টাইপের সাথে মেলে না, বা ক্ষেত্রগুলি অনুপস্থিত থাকলে একই উপসর্গটি উপস্থিত হবে, যেহেতু লিনকিউ ডেটা পড়ার পর থেকে এসকিউএল ডেটা পরিবর্তন হয়নি তা নিশ্চিত করতে সক্ষম হবে না।


4
আমার কিছুটা একই ছিল - যদিও কিছুটা আলাদা - সমস্যা ছিল, এবং নালার জন্য ডাবল চেক করার আপনার পরামর্শটি আমার দিনটি বাঁচিয়েছিল! আমি ইতিমধ্যে টাক পড়েছিলাম, তবে এই সমস্যাটি অবশ্যই আমার অন্য একটি চুলের জন্য ব্যয় করতে হবে যদি আমার একটি থাকে .. ধন্যবাদ!
রুন জ্যাকবসেন

7
নিশ্চিত হয়ে নিন যে আপনি বৈশিষ্ট্য উইন্ডোতে 'নলাবল' সম্পত্তিটিকে সত্যে সেট করেছেন। আমি 'সার্ভার ডাটা টাইপ' সম্পত্তি সম্পাদনা করা হয়েছিল, থেকে এটিকে পরিবর্তন করা VARCHAR(MAX) NOT NULLথেকে VARCHAR(MAX) NULLএবং এটি কাজ আশা। খুব সাধারণ ভুল।

এই upvote ছিল। এটি আমাকে এক টন সময় বাঁচিয়েছে। আমার বিচ্ছিন্নতা স্তরের দিকে তাকিয়ে ছিল কারণ আমি ভেবেছিলাম এটি একটি সহকারী সমস্যা
অ্যাড্রিয়ান

4
আমি NUMERIC(12,8)একটি Decimalসম্পত্তি একটি কলাম ম্যাপ ছিল । আমাকে কলাম অ্যাট্রিবিউটে DbType সুনির্দিষ্ট করতে হয়েছিল [Column(DbType="numeric(12,8)")] public decimal? MyProperty ...
কোস্টো

4
সমস্যা ক্ষেত্র / কলামগুলি সনাক্ত করার একটি উপায় হ'ল .dbML ফাইলে অবস্থিত আপনার বর্তমান লিনাক-টু-এসকিউএল সত্তা শ্রেণিগুলি একটি পৃথক ফাইলে সংরক্ষণ করা। তারপরে আপনার বর্তমান মডেলটি মুছুন এবং এটি ডাটাবেস থেকে পুনরায় তৈরি করুন (ভিএস ব্যবহার করে), যা একটি নতুন .dbML ফাইল উত্পন্ন করবে। তারপরে, সমস্যার পার্থক্য সনাক্ত করতে দুটি .dbML ফাইলগুলিতে উইনমার্গ বা উইনডিফের মতো তুলনামূলকভাবে চালান।
ডেভিড.বারখুইজেন

26

প্রথমত, এটি জানার জন্য দরকারী যে সমস্যাটি কী কারণে ঘটছে। গুগলিং সলিউশনটিকে সহায়তা করা উচিত, পরে দ্বন্দ্ব সমাধানের জন্য আরও ভাল সমাধানের জন্য আপনি দ্বন্দ্ব সম্পর্কে বিশদ (টেবিল, কলাম, পুরানো মান, নতুন মান) লগ করতে পারেন:

public class ChangeConflictExceptionWithDetails : ChangeConflictException
{
    public ChangeConflictExceptionWithDetails(ChangeConflictException inner, DataContext context)
        : base(inner.Message + " " + GetChangeConflictExceptionDetailString(context))
    {
    }

    /// <summary>
    /// Code from following link
    /// https://ittecture.wordpress.com/2008/10/17/tip-of-the-day-3/
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    static string GetChangeConflictExceptionDetailString(DataContext context)
    {
        StringBuilder sb = new StringBuilder();

        foreach (ObjectChangeConflict changeConflict in context.ChangeConflicts)
        {
            System.Data.Linq.Mapping.MetaTable metatable = context.Mapping.GetTable(changeConflict.Object.GetType());

            sb.AppendFormat("Table name: {0}", metatable.TableName);
            sb.AppendLine();

            foreach (MemberChangeConflict col in changeConflict.MemberConflicts)
            {
                sb.AppendFormat("Column name : {0}", col.Member.Name);
                sb.AppendLine();
                sb.AppendFormat("Original value : {0}", col.OriginalValue.ToString());
                sb.AppendLine();
                sb.AppendFormat("Current value : {0}", col.CurrentValue.ToString());
                sb.AppendLine();
                sb.AppendFormat("Database value : {0}", col.DatabaseValue.ToString());
                sb.AppendLine();
                sb.AppendLine();
            }
        }

        return sb.ToString();
    }
}

আপনার স্যাম্বিটচ্যাঞ্জস মোড়ানোর জন্য সহায়ক তৈরি করুন:

public static class DataContextExtensions
{
    public static void SubmitChangesWithDetailException(this DataContext dataContext)
    {   
        try
        {         
            dataContext.SubmitChanges();
        }
        catch (ChangeConflictException ex)
        {
            throw new ChangeConflictExceptionWithDetails(ex, dataContext);
        }           
    }
}

এবং তারপরে পরিবর্তনগুলি জমা দেওয়ার কোডটি কল করুন:

Datamodel.SubmitChangesWithDetailException();

অবশেষে, আপনার বৈশ্বিক ব্যতিক্রম হ্যান্ডলারটিতে ব্যতিক্রমটি লগ করুন:

protected void Application_Error(object sender, EventArgs e)
{         
    Exception ex = Server.GetLastError();
    //TODO
}

4
দুর্দান্ত সমাধান! আমার প্রায় 80 টি ক্ষেত্র রয়েছে এমন একটি টেবিল রয়েছে এবং টেবিলে প্রচুর ট্রিগার রয়েছে যা সন্নিবেশ এবং আপডেটের সময় বিভিন্ন ক্ষেত্র আপডেট করে। আমি L2S ব্যবহার করে ডেটা কনটেক্সট আপডেট করার সময় থেকেই এই ত্রুটিটি পেয়েছিলাম, তবে বেশ নিশ্চিত ছিল যে এটি কোনও ফিল্ড আপডেট করার সাথে সাথে ট্রিগারগুলির মধ্যে একটির কারণে ঘটছে, ফলে টেবিলে থাকা ডেটা প্রসঙ্গে ডেটা প্রসঙ্গটি আলাদা হয়ে যায়। আপনার কোডটি ঠিক কোন ফিল্ডটি ডেটা প্রসঙ্গে টেবিলের সাথে সিঙ্কের বাইরে চলেছে তা দেখতে আমাকে সহায়তা করেছে। অসংখ্য ধন্যবাদ!!
জাগড

4
এটি বড় টেবিলগুলির জন্য দুর্দান্ত সমাধান। নালগুলি পরিচালনা করতে, 'col.XValue.ToString ()' থেকে 'col.XValue == নাল পরিবর্তন করুন? "নাল": col.XValue.ToString () 'তিনটি মান ক্ষেত্রের প্রতিটি জন্য।
হাম্বাদগুলি

অরিজিনালভ্যালু, কারেন্টভ্যালু এবং ডেটাবেসভ্যালিউকে স্ট্রিংফাই করার সময় নাল রেফারেন্সের বিরুদ্ধে রক্ষা করার জন্য ডিট্টো।
ফ্লয়েড কোশ

16

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

আমি যদি এটি সঠিকভাবে বুঝতে পারি। :)


6
এই উত্তরটি আমার ক্ষেত্রে সমস্যাটি স্থির করেছে: dc.Refresh(RefreshMode.KeepChanges,changedObject);ডিসি.সামিতচেন্জেসের আগে
হুগোরুন

ডায়নামিক ডেটা ওয়েবসাইটে বৈশিষ্ট্যগুলিতে ReadOnlyAttribute প্রয়োগ করার সময় আমার এই সমস্যা হয়েছিল। আপডেটগুলি কাজ করা বন্ধ করে দিয়েছে এবং আমি "সারি পাওয়া যায় নি বা পরিবর্তিত হয়নি" ত্রুটি পাচ্ছিলাম (যদিও সন্নিবেশগুলি ভাল ছিল)। উপরোক্ত সংশোধন প্রচেষ্টা এবং সময় প্রচুর পরিমাণে সঞ্চয়!
ক্রিস ক্যানন

আপনি কি দয়া করে রিফ্রেশমোড মানগুলি ব্যাখ্যা করতে পারবেন যেমন কিপেনক্রন্টভ্যালুগুলির অর্থ কী? এটার কাজ কি? অনেক ধন্যবাদ. আমি একটি প্রশ্ন তৈরি করতে পারি ...
ক্রিস ক্যানন

একই সারিগুলিতে আর একটি লেনদেন শুরু হওয়ার জন্য একই সময়ে সমাপ্ত লেনদেনগুলি সমাপ্ত না হওয়ায় আমার সমস্যা ছিল। কিপ চেঞ্জস আমাকে এখানে সহায়তা করেছে, তাই সম্ভবত এটি কেবল বর্তমান লেনদেনকে বাতিল করে দেয় (এটি সংরক্ষণ করা মূল্যগুলি রাখার সময়) এবং নতুনটি শুরু করে (সত্যই আমার কোনও ধারণা নেই)
এরিক বার্গস্টেট

11

এটি একাধিক DbContext ব্যবহার করেও হতে পারে।

উদাহরণস্বরূপ:

protected async Task loginUser(string username)
{
    using(var db = new Db())
    {
        var user = await db.Users
            .SingleAsync(u => u.Username == username);
        user.LastLogin = DateTime.UtcNow;
        await db.SaveChangesAsync();
    }
}

protected async Task doSomething(object obj)
{
    string username = "joe";
    using(var db = new Db())
    {
        var user = await db.Users
            .SingleAsync(u => u.Username == username);

        if (DateTime.UtcNow - user.LastLogin >
            new TimeSpan(0, 30, 0)
        )
            loginUser(username);

        user.Something = obj;
        await db.SaveChangesAsync();
    }
}

এই কোডটি সময়ে সময়ে অসমর্থিত বলে মনে হয়, কারণ ব্যবহারকারী উভয় প্রসঙ্গে ব্যবহৃত হয়, পরিবর্তিত হয় এবং একটিতে সংরক্ষণ করা হয়, এবং অন্যটিতে সংরক্ষণ করা হয়। "" কিছু "এর মালিক এমন ব্যবহারকারীর ইন-মেমরি উপস্থাপনা যা ডেটাবেজে রয়েছে তার সাথে মেলে না এবং তাই আপনি এই লুক্কায়িত বাগটি পান।

এটি প্রতিরোধের একটি উপায় হ'ল যে কোনও কোড যা কখনও লাইব্রেরি পদ্ধতি হিসাবে ডাকা হতে পারে এমনভাবে লিখতে হবে যাতে এটি একটি alচ্ছিক ডিবি কনটেক্সট নেয়:

protected async Task loginUser(string username, Db _db = null)
{
    await EFHelper.Using(_db, async db =>
    {
        var user = await db.Users...
        ... // Rest of loginUser code goes here
    });
}

public class EFHelper
{
    public static async Task Using<T>(T db, Func<T, Task> action)
        where T : DbContext, new()
    {
        if (db == null)
        {
            using (db = new T())
            {
                await action(db);
            }
        }
        else
        {
            await action(db);
        }
    }
}

সুতরাং এখন আপনার পদ্ধতিটি একটি alচ্ছিক ডাটাবেস গ্রহণ করে এবং যদি এটি না থাকে তবে গিয়ে নিজেই তৈরি করে। যদি সেখানে থাকে তবে কেবল এতে কীভাবে পাস হয়েছিল তা পুনরায় ব্যবহার করুন help সহায়ক পদ্ধতিটি আপনার অ্যাপ্লিকেশন জুড়ে এই প্যাটার্নটিকে পুনরায় ব্যবহার করা সহজ করে।


10

আমি সার্ভার এক্সপ্লোরার থেকে ডিজাইনার এবং পুনর্নির্মাণের টেবিলের উপরে আবার টেবিলে এই ত্রুটিটি সমাধান করেছি।


সার্ভার এক্সপ্লোরার থেকে ডিজাইনারের কাছে আপত্তিজনক টেবিলটিকে পুনরায় ছড়িয়ে দেওয়া এবং পুনর্নির্মাণটি এটি আমার জন্যও ঠিক করে দিয়েছে।
স্টারহাউস

4

এটি আপনাকে সি # কোডে এই ত্রুটিটি ওভাররাইড করতে হবে:

            try
            {
                _db.SubmitChanges(ConflictMode.ContinueOnConflict);
            }
            catch (ChangeConflictException e)
            {
                foreach (ObjectChangeConflict occ in _db.ChangeConflicts)
                {
                    occ.Resolve(RefreshMode.KeepChanges);
                }
            }

আমি ডেটাবেজে একটি অ্যাপ্লিকেশন ফ্রন্ট-এন্ড দ্বারা জমা দেওয়া আইটেমগুলি নির্ধারণ করেছি। এই পরিষেবাগুলিতে এই ট্রিগার কার্যকর, প্রতিটি বিভিন্ন থ্রেডে। ব্যবহারকারী একটি 'বাতিল' বোতামটি আঘাত করতে পারে যা সমস্ত বকেয়া কমান্ডের স্থিতি পরিবর্তন করে। পরিষেবাটি প্রতিটি শেষ করে কিন্তু খুঁজে পেয়েছে যে 'মুলতুবি' পরিবর্তন করে 'বাতিল' হয়েছে এবং এটি 'সম্পূর্ণ' তে পরিবর্তন করতে পারে না। এটি আমার জন্য সমস্যাটি স্থির করেছে।
pwrgreg007

4
রিফ্রেশমোডের অন্যান্য গণনাগুলি যেমন কিপেনক্র্যান্টভ্যালুগুলি পরীক্ষা করে দেখুন। নোট করুন যে এই যুক্তিটি ব্যবহার করার পরে আপনাকে আবার সাবম্যাচেসে কল করতে হবে। এমএসডিএন.মাইক্রোসফট /en-us/library/ … দেখুন ।
pwrgreg007

3

আপনার প্রশ্নের কোনও সন্তোষজনক উত্তর খুঁজে পেয়েছি কিনা তা আমি জানি না, তবে আমি একটি অনুরূপ প্রশ্ন পোস্ট করেছি এবং শেষ পর্যন্ত এটি নিজেই উত্তর দিয়েছি। এটি প্রমাণিত হয়েছে যে ডাটাবেসের জন্য NOCOUNT ডিফল্ট সংযোগ বিকল্পটি চালু হয়েছিল, যার ফলে লিনক থেকে এসকিএল-এর তৈরি প্রতিটি আপডেটের জন্য চ্যানেল কনফ্লিক্ট এক্সেকশন হয়েছিল। আপনি আমার পোস্ট এখানে উল্লেখ করতে পারেন ।


3

আমি (UpdateCheck = UpdateCheck.Never)সমস্ত [Column]সংজ্ঞা যুক্ত করে এটি ঠিক করেছি fixed

যদিও কোনও উপযুক্ত সমাধানের মতো মনে হয় না। আমার ক্ষেত্রে এটি এই সম্পর্কিতটির সাথে সম্পর্কিত বলে মনে হচ্ছে যে এই টেবিলটির অন্য সারণির সাথে একটি সঙ্ঘ রয়েছে যা থেকে একটি সারি মুছে ফেলা হয়।

এটি উইন্ডোজ ফোন 7.5 এ রয়েছে।


1

আমার ক্ষেত্রে, ত্রুটিটি উত্থাপিত হয়েছিল যখন দুটি লিনকিউ থেকে এসকিউএল ডেটা প্রসঙ্গে থাকা দুটি ব্যবহারকারী একই সত্তাকে একইভাবে আপডেট করেছিলেন updated দ্বিতীয় ব্যবহারকারীর আপডেটটি চেষ্টা করার সময়, তাদের ডেটা প্রসঙ্গে তাদের থাকা অনুলিপিটি বাসি ছিল যদিও প্রথম আপডেটটি শেষ হওয়ার পরে এটি পড়া হয়েছিল।

আমি অক্ষয় ফাদকে এই নিবন্ধে ব্যাখ্যা এবং সমাধানটি আবিষ্কার করেছি: https://www.c-sharpcorner.com/article/overview-of-concurrency-in-linq-to-sql/

আমি বেশিরভাগই তোলা কোডটি এখানে:

try
{
    this.DC.SubmitChanges();
}
catch (ChangeConflictException)
{
     this.DC.ChangeConflicts.ResolveAll(RefreshMode.OverwriteCurrentValues);

     foreach (ObjectChangeConflict objectChangeConflict in this.DC.ChangeConflicts)
     {
         foreach (MemberChangeConflict memberChangeConflict in objectChangeConflict.MemberConflicts)
         {
             Debug.WriteLine("Property Name = " + memberChangeConflict.Member.Name);
             Debug.WriteLine("Current Value = " + memberChangeConflict.CurrentValue.ToString());
             Debug.WriteLine("Original Value = " + memberChangeConflict.OriginalValue.ToString());
             Debug.WriteLine("Database Value = " + memberChangeConflict.DatabaseValue.ToString());
         }
     }
     this.DC.SubmitChanges();
     this.DC.Refresh(RefreshMode.OverwriteCurrentValues, att);
 }

আমি যখন ডিবাগ করার সময় আমার আউটপুট উইন্ডোটির দিকে তাকালাম তখন আমি দেখতে পেতাম যে বর্তমান মানটি ডাটাবেস মানটির সাথে মিলে। "আসল মান" সর্বদা অপরাধী ছিল। আপডেটটি প্রয়োগের আগে এটিই ডেটা প্রসঙ্গে পাঠানো মান।

অনুপ্রেরণার জন্য মার্সেলো বারবোসাকে ধন্যবাদ।


0

আমি জানি এই প্রশ্নটির উত্তর অনেক দিন থেকেই পাওয়া গেছে তবে এখানে আমি শেষ কয়েক ঘন্টা একটি দেয়ালের বিরুদ্ধে মাথা বেঁধে কাটিয়েছি এবং আমি কেবল আমার সমাধানটি ভাগ করতে চেয়েছিলাম যা এই থ্রেডের কোনও আইটেমের সাথে সম্পর্কিত নয় বলে প্রমাণিত হয়েছে:

ক্যাচিং!

আমার ডেটা অবজেক্টের সিলেক্ট () অংশটি ক্যাচিং ব্যবহার করছিল। যখন অবজেক্টটি আপডেট করার বিষয়টি আসে তখন একটি সারি পাওয়া যায় নি বা পরিবর্তিত ত্রুটি ক্রপ হয়ে যাচ্ছিল।

বেশিরভাগ উত্তরে বিভিন্ন ডেটা কনটেক্সট ব্যবহার করে উল্লেখ করা হয়েছে এবং পূর্বসূচীতে সম্ভবত এটি ঘটছিল তবে তা তাত্ক্ষণিকভাবে আমাকে ক্যাশে ভাবার পক্ষে নেতৃত্ব দেয়নি আশা করি এটি কারও সাহায্য করবে!


0

আমি সম্প্রতি এই ত্রুটির মুখোমুখি হয়েছি এবং দেখতে পেয়েছি সমস্যাটি আমার ডেটা প্রসঙ্গে নয়, কনটেক্সটে ডাকা হওয়ার পরে কমিটের ডাকা হওয়ার পরে ট্রিগারটির ভিতরে একটি আপডেট স্টেটমেন্ট দিয়ে গুলি চালানো হয়েছিল। ট্রিগার নাল মান সহ একটি নন-অযোগ্য ক্ষেত্রটি আপডেট করার চেষ্টা করছিল এবং এটি উল্লিখিত বার্তায় প্রসঙ্গটিকে ত্রুটিযুক্ত করে তুলছে।

এই ত্রুটিটি মোকাবেলা করা এবং উপরের উত্তরের কোনও সমাধান খুঁজে না পেয়ে অন্যকে সহায়তা করার জন্য আমি এই উত্তরটি যুক্ত করছি।


0

দুটি ভিন্ন প্রসঙ্গ ব্যবহারের কারণে আমি এই ত্রুটিটিও পেয়েছি। আমি একক ডেটা প্রসঙ্গে ব্যবহার করে এই সমস্যাটি সমাধান করেছি।


0

আমার ক্ষেত্রে সমস্যাটি ছিল সার্ভার-ওয়াইড ব্যবহারকারী বিকল্পগুলির সাথে। অনুসরণ করছেন:

https://msdn.microsoft.com/en-us/library/ms190763.aspx

কিছু কর্মক্ষমতা সুবিধা পাওয়ার জন্য আমি NOCOUNT বিকল্পটি সক্ষম করেছিলাম:

EXEC sys.sp_configure 'user options', 512;
RECONFIGURE;

এবং এটি আক্রান্ত সারিগুলির জন্য লিনকের চেকগুলি ভেঙে বেরিয়ে আসে (। নেট উত্স থেকে যতটা আমি এটি বের করতে পারি), যা চেঞ্জকনফ্লিক্সট এক্সপ্লেশনের দিকে নিয়ে যায়

512 বিট বাদ দেওয়ার বিকল্পগুলি পুনরায় সেট করা সমস্যার সমাধান করেছে।


0

Qub1n এর উত্তর নিয়োগের পরে, আমি দেখতে পেলাম যে আমার জন্য সমস্যাটি ছিল আমি অজান্তেই একটি ডেটাবেস কলামকে দশমিক (18,0) হিসাবে ঘোষণা করেছিলাম। আমি একটি দশমিক মান নির্ধারণ করছিলাম, তবে ডাটাবেস দশমিক অংশটি বাদ দিয়ে এটিকে পরিবর্তন করছিল। এর ফলে সারি পরিবর্তিত ইস্যুতে পরিণত হয়েছে।

অন্য কেউ যদি অনুরূপ ইস্যুতে চালিত হয় তবে এটি কেবল যুক্ত করুন।


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