如何将SQL_NUMERIC_STRUCT转换为double和string?
问题描述:
我从SQL Server数据库中检索数字/十进制/金钱列值作为SQL_NUMERIC_STRUCT结构。现在我必须将它转换为内部处理的两倍,并将其转换为GUI输出的字符串。如何才能做到这一点?如何将SQL_NUMERIC_STRUCT转换为double和string?
答
这是一个好的开始。它不会转换要转换的一切,但你可以使用这个想法和算法做任意转换一些简单的mods:
DWORD g_Denominators[10]={1,10,100,1000,10000,100000,1000000,10000000,
100000000,1000000000};
void FetchDecimalValue(Fraction::NumeratorType &numerator,
Fraction::DenominatorType &denominator,
const SQL_NUMERIC_STRUCT &src)
{
numerator=0;
denominator=1;
DWORDLONG byteDenominator=1;
for (size_t valIdx=0;valIdx<SQL_MAX_NUMERIC_LEN;++valIdx)
{
numerator+=src.val[valIdx]*byteDenominator;
byteDenominator<<=8UI64;
}
// Is the NUMERIC negative?
if (src.sign==0)
numerator=-numerator;
denominator=g_Denominators[src.scale];
}
您可以轻松创建一个双出所产生的分子和分母的将前者分为后者。另外,要创建一个字符串,您可以始终使用sprintf
或更多的C++方式,即ostringstream
的双格式化程序。
什么是Fraction :: NumeratorType和Fraction :: DenominatorType? – 2012-02-07 14:43:00
你可以让他们__int64 ...(或Windows中的LONGLONG术语) – 2012-02-07 16:38:15
我认为使用'double'类型会更好。但是我选择不使用'SQL_NUMERIC_STRUCT'结构,而是使用'SQLGetData()'读取数据时读取数字/十进制/金钱列作为字符串,指定'SQL_C_WCHAR'而不是'SQL_C_NUMERIC',如下所示:http ://stackoverflow.com/questions/9178900/how-to-read-numeric-decimal-money-columns-from-sql-server。无论如何,你的解决方案似乎在为我所问的问题工作,所以我将其标记为答案。 – 2012-02-08 06:31:00