سؤال

مرحبًا، لقد تم سحب DataRow من DataTable من DataSet.أقوم بالوصول إلى عمود تم تعريفه في SQL كنوع بيانات عائم.أحاول تعيين هذه القيمة لمتغير محلي (نوع بيانات c# float) ولكنني أحصل على InvalidCastExecption

DataRow exercise = _exerciseDataSet.Exercise.FindByExerciseID(65);
_AccelLimit = (float)exercise["DefaultAccelLimit"];  

الآن، من خلال التلاعب بهذا الأمر، نجحت في نجاحه، لكن لم يكن له أي معنى ولم يكن يبدو على ما يرام.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

هل يمكن لأحد أن يشرح ما أفتقده هنا؟

هل كانت مفيدة؟

المحلول

تعويم SQL هو مزدوج وفقًا لـ وثائق SQLDbType.

نصائح أخرى

التعويم في SQL هو مزدوج في CLR (C#/VB).هناك جدول أنواع بيانات SQL مع مكافئات CLR على MSDN.

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

إن التعويم في Microsoft SQL Server يعادل Double في C#.والسبب في ذلك هو أن رقم الفاصلة العائمة يمكنه فقط تقريب الرقم العشري، وهو دقة يحدد رقم الفاصلة العائمة مدى دقة هذا الرقم يقترب رقم عشري.يمثل النوع المزدوج رقم الفاصلة العائمة 64 بت مزدوج الدقة بقيم تتراوح من سالب 1.79769313486232e308 إلى موجب 1.79769313486232e308، بالإضافة إلى الصفر الموجب أو السالب وPositiveInfinity وNegativeInfinity وNot-a-Number (NaN).

أعتقد أن السؤال الرئيسي قد تمت الإجابة عليه هنا ولكنني أشعر بأنني مضطر لإضافة شيء ما لقسم السؤال الذي ينص على أن هذا يعمل.

_AccelLimit = (float)(double)exercise["DefaultAccelLimit"];

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

في الكلمات ينص هذا السطر ...احصل على كائن (يصادف أن يمسك بمضاعفة في هذه الحالة) يلقي الكائن في مضاعفة (فقدان كل الكائنات الغش) يلقي مزدوجًا إلى تعويم (فقدان كل الدقة الدقيقة الدقيقة)

على سبيل المثالإذا كانت القيمة قول 0.0124022806089461 وقمت بما سبق ذلك ، فستكون قيمة accellimit 0.01240228

لأن هذا هو مدى ما يمكن أن يحصل عليه التعويم في c# من القيمة المزدوجة.إنه أمر خطير، وأنا متأكد من أنه اقتطاع أيضًا وليس تقريبًا ولكن قد يرغب شخص ما في تأكيد ذلك لأنني لست متأكدًا.

السبب وراء "لا يبدو الأمر على ما يرام" هو أن لغة C# تستخدم نفس بناء الجملة الإخراج من العلبة ولل يصب, ، وهما شيئان مختلفان للغاية. exercise["DefaultAccelLimit"] يحتوي على قيمة مزدوجة، محاصر ككائن. (double) مطلوب ل افتح الصندوق الكائن مرة أخرى إلى مزدوج.ال (float) أمام ذلك الحين يلقي المزدوج إلى قيمة عائمة.لا تسمح لغة C# بالملاكمة والإلقاء في نفس العملية، لذلك يجب عليك فك العلبة ثم الإلقاء.

وينطبق الشيء نفسه حتى لو كانت الجبيرة غير مدمرة.إذا تم وضع العوامة في صندوق كجسم تريد رميه في شكل مزدوج، فستفعل ذلك على النحو التالي: (double)(float)object_var.

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