كيفية تحويل التعداد إلى مجموعة من البايتات؟
-
27-10-2019 - |
سؤال
لدي التعداد على النحو التالي:
[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
ق أو long
s، وأنت مقيد بعدد البتات في ملف int
أو أ long
.إذا كنت تريد تخزينها في varbinary
, ، ستحتاج إلى إجراء تسلسل لقيمة إلى سلسلة من البايتات، وسوف تختلف اعتمادًا على ما إذا كنت تريد النهاية الكبيرة، وعدد البايتات التي يجب استخدامها للتخزين - وربما تكون متغيرة، وما إلى ذلك.مزيد من المعلومات اللازمة.
خياران للرقم 3:
أ.إذا كنت وحدك/الكود تحت سيطرتك، فلا تستخدم varbinary، استخدم int أو bigint (اعتمادًا على عدد البتات المطلوبة).والأفضل من ذلك (ربما)، استخدام حقول البت بدلاً من ذلك، إذا كنت تريد الاستعلام عنها
ب.إذا لم يكن الأمر كذلك، فسيكون بمقدور DBA أو موفر التطبيق تحديد الطريقة التي يريدون بها ملء المتغير الخاص بهم
امل ان يساعد.
نصائح أخرى
يستخدم int
في قاعدة البيانات الخاصة بك وتخزينها باسم int
قيمة:
AggregationLevel thisLevel = AggregationLevel.Department | AggregationLevel.Division;
int val = (int)thisLevel;
AggregationLevel lvlUpd = (AggregationLevel)val;
لست بحاجة إلى تخزينها على أنها "مصفوفة من البايتات" ، فالقيمة المجمعة تناسب بشكل مريح عدد صحيح واحد.