معلمات الإخراج الخاصة بي دائمًا لاغية عند استخدام BegineXecutenOnquery

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

سؤال

لدي إجراء مخزن يعيد Varchar (160) كمعلمة إخراج لإجراء تخزين.

كل شيء يعمل بشكل جيد عندما أستخدم ExecuteNOnquery ، وأستعيد دائمًا القيمة المتوقعة.

ومع ذلك ، بمجرد التبديل لاستخدام BegineXecutenOnquery ، أحصل على قيمة فارغة للإخراج.

أنا أستخدم connstring + "المعالجة غير المتزامنة = صواب ؛" في كلتا الحالتين.

للأسف ، يكون BegineXecutenOnquery أسرع حوالي 1.5 مرة في حالتي ... لكنني أحتاج حقًا إلى معلمة الإخراج.

شكرًا!

تحرير: هذه هي الطريقة التي أقوم بمعالجة رد الاتصال BeginexecutenOnquery (أنا أستخدم .NET 4.0 ...)

    Dim resp as String=""
    cmd.BeginExecuteNonQuery(Sub(result As IAsyncResult)
                                 Dim c As SqlCommand = Nothing
                                 Try
                                     c = CType(result.AsyncState, SqlCommand)
                                     c.EndExecuteNonQuery(result)
                                     **resp = CStr(c.Parameters("@response").Value)**
                                 Catch ex As Exception
                                     WriteLog("ERR - LogRequest - " & ex.Message)
                                 Finally
                                     c.Connection.Close()
                                     c.Dispose()
                                 End Try
                             End Sub, cmd)
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم BegineXecutenOnquery ، فلن تنتظر رمزك حتى يتم تنفيذ الاستعلام قبل المتابعة ، ولهذا السبب ليس لديك معلمة الإخراج. لاسترداد المعلمة Out ، تحتاج إلى تحديد مندوب AsyncCallback الذي يتم تشغيله عند انتهاء الاستعلام. هل أنت متأكد أيضًا من أن BegineXecutenOnquery أسرع حقًا وأن زيادة الأداء المتصورة ليست فقط لأن العملية لا تنتظر تنفيذ الاستعلام. تتمثل نقطة استفسارات Async في المكان الذي تريد إطلاقه قليلاً من المعالجة مثل تقديم تقرير معقد ، ثم قم بعمل شيء لاحقًا بمجرد اكتماله ، على سبيل المثال ، تم إرسال بريد إلكتروني إلى المستخدم لإخبارهم بأن تقريرهم قد تمت معالجته.

نصائح أخرى

عندما تستخدم BeginExecuteNonQuery يعمل الاستعلام في الخلفية ، ويستمر الكود الخاص بك في التشغيل. ما يحدث على الأرجح هو أنك تنظر إلى النتيجة قبل انتهاء الاستعلام. هذا من مساعدة MSDN BeginExecuteNonQuery:

IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
    Console.WriteLine("Waiting ({0})", count++);
    // Wait for 1/10 second, so the counter
    // does not consume all available resources 
    // on the main thread.
    System.Threading.Thread.Sleep(100);
}
Console.WriteLine("Command complete. Affected {0} rows.", 
     command.EndExecuteNonQuery(result));

لذا فإن النتيجة متاحة بشكل صحيح فقط مرة واحدة IsCompleted صحيح.

لاحظ أن هذا مجرد مثال من المستندات ، فإن الاستخدام الحقيقي لوظائف ASYNC هو السماح لبقية تطبيقك (على سبيل المثال. واجهة المستخدم) بالاستمرار في العمل أثناء تشغيل استعلام طويل.

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