سؤال

لدي التعداد على النحو التالي:

[Flags]
public enum AggregationLevel
{
    /// <summary>
    /// 00000001
    /// </summary>
    Department = 1,

    /// <summary>
    /// 00000010
    /// </summary>
    Gbu = 2,

    /// <summary>
    /// 00000100
    /// </summary>
    Division = 4,

    /// <summary>
    /// 00001000
    /// </summary>
    Region = 8,

    /// <summary>
    /// 00010000
    /// </summary>
    Market = 16,

    /// <summary>
    /// 00100000
    /// </summary>
    Cluster = 32,

    /// <summary>
    /// 01000000
    /// </summary>
    Store = 64
}

ثم لدي معلمة إجراء مخزن تتطلب متغيرًا (صفيف من البايتات).

لدي مثيل التعداد الذي يجب تمريره إليه:

AggregationLevel thisLevel = AggregationLevel.Department & AggregationLevel.Division;

بعد ذلك، يجب تمرير القيمة إلى هذا الإجراء المخزن:

var parameter = new SqlParameter("@pBitMask", SqlDbType.VarBinary)

المعلمة = ؟

كيفية تحويل التعداد "thisLevel" الخاص بي إلى مجموعة من البايتات بحيث يمكن تخصيصها لمعلمة SQL هذه؟

شكرًا،

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

المحلول

أشياء قليلة..

1) عليك استخدام OR بدلاً من AND:

AggregationLevel thisLevel = AggregrationLevel.Department | AggregationLevel.Division;

2) يمكنك استخدام هذا التسلسل حتى لا تضطر إلى تذكر قوى الرقم 2 في النظام العشري:

0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100 ...

3) وأخيرا، varbinary ليس ما تريد.ينظر الى integer أو bigint.يتم تخزين التعدادات كـ intق أو longs، وأنت مقيد بعدد البتات في ملف int أو أ long.إذا كنت تريد تخزينها في varbinary, ، ستحتاج إلى إجراء تسلسل لقيمة إلى سلسلة من البايتات، وسوف تختلف اعتمادًا على ما إذا كنت تريد النهاية الكبيرة، وعدد البايتات التي يجب استخدامها للتخزين - وربما تكون متغيرة، وما إلى ذلك.مزيد من المعلومات اللازمة.

خياران للرقم 3:

أ.إذا كنت وحدك/الكود تحت سيطرتك، فلا تستخدم varbinary، استخدم int أو bigint (اعتمادًا على عدد البتات المطلوبة).والأفضل من ذلك (ربما)، استخدام حقول البت بدلاً من ذلك، إذا كنت تريد الاستعلام عنها

ب.إذا لم يكن الأمر كذلك، فسيكون بمقدور DBA أو موفر التطبيق تحديد الطريقة التي يريدون بها ملء المتغير الخاص بهم

امل ان يساعد.

نصائح أخرى

يستخدم int في قاعدة البيانات الخاصة بك وتخزينها باسم int قيمة:

AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;

int val = (int)thisLevel;

AggregationLevel lvlUpd = (AggregationLevel)val;

لست بحاجة إلى تخزينها على أنها "مصفوفة من البايتات" ، فالقيمة المجمعة تناسب بشكل مريح عدد صحيح واحد.

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