VC++ SYSTEMTIME转SQL SERVER日期时间

本文详细阐述了如何在VC++中使用NativeClient的OLEDB接口处理SQLSERVER数据库中的日期时间,重点在于将SYSTEMTIME结构转换为DBTIMESTAMP,包括毫秒精度的处理,并解释了datetime类型参数设置中的bScale规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VC++平台下利用Native Client接口接供的OLE DB方法访问SQL SERVER数据库,其它数据类型都容易处理,主要就是处理时间不容易搞清楚,先查询OLE DB与SQL SERVER数据的对应关系,详读以下链接:

https://docs.microsoft.com/en-us/sql/relational-databases/native-client-ole-db-date-time/data-type-support-for-ole-db-date-and-time-improvements?view=sql-server-ver15

我们要插入包括毫秒的日期时间,格式为:

'yyyy-mm-dd hh:mm:ss[.999]'

注意,毫秒与日期时间的隔开符号为一点(.),而不是冒号(:)。

C++平台下使用了时间结构:SYSTEMTIME,包括毫秒,而OLE DB的日期时间格式结构为:

typedef struct tagDBTIMESTAMP
    {
    SHORT year;
    USHORT month;
    USHORT day;
    USHORT hour;
    USHORT minute;
    USHORT second;
    ULONG fraction;
    } DBTIMESTAMP;

注意毫秒的处理,fraction为10亿分之一秒。同时,参数设置时,有这么一句说明:

DBTYPE_DBTIMESTAMP (the fraction field is defined by OLE DB as the number of billionths of a second (nanoseconds) and ranges from 0-999,999,999)

When an application specifies DBTYPE_DBTIMESTAMP in wType, it can override the mapping to datetime2 by supplying a type name in pwszTypeName. If datetime is specified, bScale must be 3. If smalldatetime is specified, bScale must be 0. If bScale is not consistent with wType and pwszTypeName, DB_E_BADSCALE is returned.

If datetime is specified, bScale must be 3. 这一句说明,使用datetime 时,bScale 必须设定为3,则OLE DB访问参数设置为:

typedef struct tagDBPARAMBINDINFO
    {
    LPOLESTR pwszDataSourceType;
    LPOLESTR pwszName;
    DBLENGTH ulParamSize;
    DBPARAMFLAGS dwFlags;
    BYTE bPrecision;
    BYTE bScale;
    }     DBPARAMBINDINFO;

上面结构中,bScale必须设定为3。

这样SYSTEMTIME转为DBTIMESTAMP就简单了,如下所示:

//-----fraction = 1/1000000000 (s)
//-----1/1000000000 (s)=1/1000000 (ms) 
void CDataAccess::GetAsDBTIMESTAMP(const SYSTEMTIME& systime,DBTIMESTAMP& dbDateTime)
{
    dbDateTime.year = systime.wYear;
    dbDateTime.month = systime.wMonth;
    dbDateTime.day = systime.wDay;
    dbDateTime.hour = systime.wHour;
    dbDateTime.minute = systime.wMinute;
    dbDateTime.second = systime.wSecond;
    __int64 fraction = systime.wMilliseconds*1000000;  //就这一句
    dbDateTime.fraction = fraction;
}

绑定参数时指定DBTYPE_DBTIMESTAMP,大小提定为sizeof(DBTYPE_DBTIMESTAMP)。

关于Natilve Client使用OLEDB访问数据库的其它细节,参见微软件相文文档:

https://docs.microsoft.com/en-us/sql/relational-databases/native-client/ole-db/sql-server-native-client-ole-db?view=sql-server-ver15

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值