تريد استخدام الهوية التي تم إرجاعها من الإدراج في الإدخال اللاحق في المعاملة

StackOverflow https://stackoverflow.com/questions/5411697

  •  29-10-2019
  •  | 
  •  

سؤال

أنا أستخدم Rob Conery جَسِيم للوصول إلى قاعدة البيانات.أرغب في تغليف معاملة حول إدخالين ولكن الإدخال الثاني يستخدم الهوية التي تم إرجاعها من الإدخال الأول.ليس من الواضح بالنسبة لي كيفية القيام بذلك في الصفقة.سيكون موضع تقدير بعض المساعدة.

var commandList = new List<DbCommand>
    {
        contactTbl.CreateInsertCommand(new
            {
                newContact.Name,
                newContact.Contact,
                newContact.Phone,
                newContact.ForceChargeThreshold,
                newContact.MeterReadingMethodId,
                LastModifiedBy = userId,
                LastModifiedDate = modifiedDate,
            }),
        branchContactTbl.CreateInsertCommand(new
            {
                newContact.BranchId,
                ContactId = ????, <-- how to set Id as identity from previous command
            }),
    };
هل كانت مفيدة؟

المحلول

هل يمكنك فعل ذلك في عملية مخزنة؟يمكنك استخدام range_identity أو أفضل من جملة الإخراج للحصول على القيمة (القيم) التي تحتاجها.وجميع الإدخالات في جميع الجداول موجودة في معاملة واحدة يمكن التراجع عنها في حالة فشل أي منها.

نصائح أخرى

قم بإجراء استعلام بين هذين الإدخالين، قد تكون هذه الطريقة من Massive مفيدة:

public object Scalar(string sql, params object[] args) {
    object result = null;
    using (var conn = OpenConnection()) {
        result = CreateCommand(sql, conn, args).ExecuteScalar();
    }
    return result;
} 

سيكون SQL الخاص بك = "اختر نطاق_هوية ()"

تحديث 2013/02/26

بالنظر مرة أخرى إلى الكود الضخم، لا توجد طريقة موثوقة لاسترداد آخر معرف تم إدخاله.

لن يعمل الكود أعلاه إلا عندما يتم تجميع الاتصال الذي يجعل "selectscope_identity()".(يجب أن يكون نفس الاتصال الذي تم إدراجه).

جَسِيم table.Insert(..) تقوم الطريقة بإرجاع ديناميكي يحتوي على حقل المعرف المملوء بـ "SELECT @@IDENTITY".يحصل على آخر معرف تم إدراجه من النطاق العالمي، وهو خطأ واضح (ظاهر في سيناريوهات تعدد العمليات).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top