在存储过程里定义一个bigint,并赋值为负数,如
DECALURE @returnValue BIGINT
SET @returnValue = -100
SELECT @returnValue使用ADO,取出来的_variant_t里,各个字段都是100,没有-100。这个怎么解决?和操作系统有关系?

解决方案 »

  1.   

    BIGINT换成其他的类型int看看。
    _variant_t var ;
    // ...ADO取值
    __int64 = var; //var不能是VT_NULL
      

  2.   

    楼主看看这个
    VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 
    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: 
    VARIANT   va; 
    int   a=2001; 
    va.vt=VT_I4;///指明整型数据 
    va.lVal=a;   ///赋值 对于不马上赋值的VARIANT,最好先用Void   VariantInit(VARIANTARG   FAR*   pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: Byte   bVal;     //   VT_UI1.   
    Short   iVal;     //   VT_I2.   
    long   lVal;     //   VT_I4.   
    float   fltVal;     //   VT_R4.   
    double   dblVal;     //   VT_R8.   
    VARIANT_BOOL   boolVal;     //   VT_BOOL.   
    SCODE   scode;     //   VT_ERROR.   
    CY   cyVal;     //   VT_CY.   
    DATE   date;     //   VT_DATE.   
    BSTR   bstrVal;     //   VT_BSTR.   
    DECIMAL   FAR*   pdecVal     //   VT_BYREF|VT_DECIMAL.   
    IUnknown   FAR*   punkVal;     //   VT_UNKNOWN.   
    IDispatch   FAR*   pdispVal;     //   VT_DISPATCH.   
    SAFEARRAY   FAR*   parray;     //   VT_ARRAY|*.   
    Byte   FAR*   pbVal;     //   VT_BYREF|VT_UI1.   
    short   FAR*   piVal;     //   VT_BYREF|VT_I2.   
    long   FAR*   plVal;     //   VT_BYREF|VT_I4.   
    float   FAR*   pfltVal;     //   VT_BYREF|VT_R4.   
    double   FAR*   pdblVal;     //   VT_BYREF|VT_R8.   
    VARIANT_BOOL   FAR*   pboolVal;     //   VT_BYREF|VT_BOOL.   
    SCODE   FAR*   pscode;     //   VT_BYREF|VT_ERROR.   
    CY   FAR*   pcyVal;     //   VT_BYREF|VT_CY.   
    DATE   FAR*   pdate;     //   VT_BYREF|VT_DATE.   
    BSTR   FAR*   pbstrVal;     //   VT_BYREF|VT_BSTR.   
    IUnknown   FAR*   FAR*   ppunkVal;     //   VT_BYREF|VT_UNKNOWN.   
    IDispatch   FAR*   FAR*   ppdispVal;     //   VT_BYREF|VT_DISPATCH.   
    SAFEARRAY   FAR*   FAR*   pparray;     //   VT_ARRAY|*.   
    VARIANT   FAR*   pvarVal;     //   VT_BYREF|VT_VARIANT.   
    void   FAR*   byref;     //   Generic   ByRef.   
    char   cVal;     //   VT_I1.   
    unsigned   short   uiVal;     //   VT_UI2.   
    unsigned   long   ulVal;     //   VT_UI4.   
    int   intVal;     //   VT_INT.   
    unsigned   int   uintVal;     //   VT_UINT.   
    char   FAR   *   pcVal;     //   VT_BYREF|VT_I1.   
    unsigned   short   FAR   *   puiVal;     //   VT_BYREF|VT_UI2.   
    unsigned   long   FAR   *   pulVal;     //   VT_BYREF|VT_UI4.   
    int   FAR   *   pintVal;     //   VT_BYREF|VT_INT.   
    unsigned   int   FAR   *   puintVal;     //VT_BYREF|VT_UINT.   
    _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 
    使用时需加上#include   <comdef.h> 
    例如: 
    long   l=222; 
    ing   i=100; 
    _variant_t   lVal(l); 
    lVal   =   (long)i; 
    COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: 
    COleVariant   v3   =   "字符串 ",   v4   =   (long)1999; 
    CString   str   =(BSTR)v3.pbstrVal; 
    long   i   =   v4.lVal; 
      

  3.   

    如果存储过程里定义为int类型,取出来的值是没有问题的。进一步测试发现在2008里没有问题,2003和xp里有问题