Azure Storage - تم تجاهل نقطة عشرية مزدوجة على حفظ

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

  •  27-09-2019
  •  | 
  •  

سؤال

لديّ قيمة يتم تخزينها بشكل صحيح في خاصية لكائن ما ، ولكن عندما أقوم بحفظ التغييرات في قاعدة بيانات تخزين Azure ، يتم تخزين القيمة المزدوجة إلى قاعدة البيانات متجاهلة النقطة (7.110000003 يتم حفظها على أنها 711). أيضا ، يتم تغيير العقار إلى 711.0.

كيف يمكنني حل هذه المشكلة؟

تم تعيين الحقل بالفعل على مضاعفة في الفصل وجدول قاعدة البيانات.

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

المحلول

يبدو أن هذه المشكلة ناتجة عن إعدادات الثقافة التي تستخدمها تخزين DEV. إذا ألقيت نظرة على جدول TableRow داخل DEV STORAGE DB ، يتم تخزين البيانات كـ XML ، وتستخدم القيم العشرية النقطة كفاصل عشري. هنا في البرازيل النقطة هو فاصل الآلاف. لقد قمت بتحرير البيانات مباشرة في DEV STORAGE DB ، وتغيير النقطة إلى فاصلة (PT-BR-BR DECIMAL SIPTERATOR) ، وتم قراءة القيمة موافق. هذا أمر غريب ، لأنه إذا تمت قراءة القيمة موافق عندما نستخدم فاصل PT-BR العشري ، يبدو أن تخزين DEV يستخدم إعداد ثقافي الحالي. ولكن لماذا لا يتم تطبيق الثقافة على حفظ البيانات؟

ملاحظة: تغيير لغة Windows إلى En-US حل المشكلة. أعتقد أن هذا هو السبب في أن هذا هو المنشور الوحيد الذي يمكنني العثور عليه حول هذا الموضوع.

نصائح أخرى

هل قيمتك المزدوجة في حقلها الخاص ، أم أنها في حقل PartitionKey أو Rowkey؟ PartitionKey و Rowkey دائما سلاسل.

لقد قمت للتو بإنشاء اختبار بسيط يكتب ويقرأ صفًا بحقل مزدوج ، ويتم الحفاظ على القيم على ما يرام. لقد قمت بتعديل عينة SMSMessage Class من رمز الرسائل القصيرة من Bill Lodin عبر تدريب MSDEV.com (أخذت حقل التأخير INT وقمت بتغييره إلى تعويم ، وأعيد تسميته إلى mydouble للتوضيح):

public class SmsMessage: TableServiceEntity
{
    public double MyDouble { get; set; }
    public SmsMessage(string destination, string message, double myDouble)
    {
        PartitionKey = destination;
        RowKey = message;
        MyDouble = myDouble;
    }
    public SmsMessage()
        : base("", string.Format("{0:d10}", DateTime.Now.Ticks))
    {
    }
}

ثم أكتب إلى smsmessageTable:

smsTable.AddObject("SmsMessages", new SmsMessage(destination, message, myDouble));
smsTable.SaveChanges();

أشاهد هذا في مستكشف تخزين الجدول ، وزوجي هي كيف أدخلتها (على سبيل المثال 1.2345).

ثم استرجع مع استعلام بسيط LINQ ، للحصول على اسم مستخدم معين في مفتاح القسم:

var results = from m in smsTable.SmsMessages
                      where m.PartitionKey.Equals(txtDestination.Text.Trim())
                      select m;

يتم الحفاظ على قيمتي المزدوجة وكتابة بقوة كضاعفة.

كيف يمكنك التحقق من القيمة؟ يستخدم التخزين المحلي للتطوير SQL Express تحت الغطاء ، لذلك قد تفتح SQL وتتجول هناك. أود تجنب ذلك وأقرأ القيمة بدلاً من ذلك باستخدام مكتبة عميل تخزين .NET. أظن أن القيمة ستعود بشكل صحيح.

(ربما في المتجر المحلي المدعوم من SQL ، يتم تخزين القيمة في الترميز العلمي؟)

على الرغم من أنني أقدر هذا الجهد وربما لم أكشن القضية بشكل جيد بما فيه الكفاية ، إلا أن أيا من هذا لا يجيب حقًا على سؤالي. هذه الإجابة هي فقط لا تنسب المكافأة بشكل غير عادل. لا ينبغي أن يعزى المكافأة تلقائيًا إلى أفضل إجابة مع> = 2 Upvotes.

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