Sql server MSSQL保存.net字节[]数据的特殊顺序是什么?
我有一个表,它有一个名为Permission(binary(8))的列,其每一位表示一个特定的操作权限。在silverlight客户端中,我使用bitarry和const整数来管理权限,并且进行得很顺利。客户端代码如下所示:Sql server MSSQL保存.net字节[]数据的特殊顺序是什么?,sql-server,binary,bit,detect,Sql Server,Binary,Bit,Detect,我有一个表,它有一个名为Permission(binary(8))的列,其每一位表示一个特定的操作权限。在silverlight客户端中,我使用bitarry和const整数来管理权限,并且进行得很顺利。客户端代码如下所示: public class StaffBase : INotifyPropertyChanged { public const int OPERATION_A = 0, OPERATION_B = 1, // ...
public class StaffBase : INotifyPropertyChanged
{
public const int
OPERATION_A = 0,
OPERATION_B = 1,
// ...
// OPERATION_I=i,
// ...
OPERATION_63 = 63;
BitArray permission = null;
public BitArray Permission
{
get { return permission; }
set
{
if (permission != value)
{
permission = value;
OnPropertyChanged("Permission");
}
}
}
bool TestPermission(int permissionName)
{
return permission != null && permission[permissionName];
}
/*
Other code segments
*/
}
permission[10]=true;
现在的问题是,我必须在存储过程中测试权限,不幸的是,我对SQL有点生疏。我在客户端设置了2^10的权限,如下所示:
public class StaffBase : INotifyPropertyChanged
{
public const int
OPERATION_A = 0,
OPERATION_B = 1,
// ...
// OPERATION_I=i,
// ...
OPERATION_63 = 63;
BitArray permission = null;
public BitArray Permission
{
get { return permission; }
set
{
if (permission != value)
{
permission = value;
OnPropertyChanged("Permission");
}
}
}
bool TestPermission(int permissionName)
{
return permission != null && permission[permissionName];
}
/*
Other code segments
*/
}
permission[10]=true;
我想我会在数据库中的列权限中得到一个1024的值。但实际上,列值是0x0004000000000000。似乎SQL和.NET分别采用了不同的字节[]存储策略。现在我正在寻找一种方法来检测权限列的十六位。我试图使用这样的条款:
Permission & power(2,i) > 0
这是不对的。还有一个问题:如果我想测试第63位,电源(2,63)溢出。现在,我希望一些sql大师能给我一个指导。BitArray按读取顺序写入各个位,即第一位是第一个字节的第7位,第八位是第一个字节的第0位,第九位是第二个字节的第7位等等。因此,最小的解决方案是必须反转位(而不是
幂)(2,i)
,dopower(2,64-i)
。当然,正如您所观察到的,这是非常有限的。一个可以使用高达64位的选项是只使用更大的数据类型-bigint
。但是,对于任何大于64位的数据类型,您都回到了开始的位置
对于更一般的解决方案,您希望在每个字节的基础上使用二进制字段。您可以使用substring
函数来实现这一点
select
substring(binaryValue, ceiling(cast(@bit as decimal) / 8), 1)
& power(2, @bit % 8);
如果未设置指定位,则为零;如果未设置,则为非零值
这里的关键是字符串函数实际上也适用于二进制/图像,因此您可以使用子字符串随意访问任何字节:)幂函数与浮点值一起工作,并不精确。我不会为此使用幂函数。我曾经考虑过使用BigInt作为存储,现在我只需要大约40个非关联权限。但该项目仅停留在开始阶段,我担心更高权限分辨率的新要求即将到来来自业务部门。字节数组更灵活。如果我只是延长其长度,许多代码(如WCF服务、客户端代理工具)都可以避免重新编码。我决定使用子字符串来解决此问题。建议不错。谢谢。@user1746253很高兴我能提供帮助。请将我的答案标记为正确;)很抱歉,在你提醒我之前,我不知道我应该标出正确的答案。我必须向那些在这里帮助过我的人道歉,因为我没有把他们优雅的回答标记为正确。