Sql server 如何从CDBVariant获取日期?

Sql server 如何从CDBVariant获取日期?,sql-server,database,mfc,visual-studio-2015,odbc,Sql Server,Database,Mfc,Visual Studio 2015,Odbc,我正在尝试使用CDBVariant从sql server获取日期、月份、年份,但我无法做到这一点,我的代码如下 我想要的是用我自己的格式来记录一天,一个月,一年 像这样 1990年1月3日 在我的学生表中,我使用的是日期类型而不是日期/时间,因此我只想以自己的格式显示日期,因为我从数据库中获取的日期是年-月日期我想将其显示为日期-月-年 我无法将CDB变量::m_pdate转换为ctime CDBVariant date; rs.GetFieldValue(short(2),d

我正在尝试使用CDBVariant从sql server获取日期、月份、年份,但我无法做到这一点,我的代码如下

我想要的是用我自己的格式来记录一天,一个月,一年 像这样

1990年1月3日

在我的学生表中,我使用的是日期类型而不是日期/时间,因此我只想以自己的格式显示日期,因为我从数据库中获取的日期是年-月日期我想将其显示为日期-月-年

我无法将CDB变量::m_pdate转换为ctime

    CDBVariant date; 
    rs.GetFieldValue(short(2),date);//

    CTime a(date.m_pdate->year, date.m_pdate->month, date.m_pdate->day);

    cout << " date is:" << a.GetYear() << endl;
    a=NULL; //so the next value can be insert into ctime                
    rs.MoveNext(); // move to next tuple in table
}
cdb可变日期;
rs.GetFieldValue(短(2),日期)//
CTime a(date.m\u pdate->year,date.m\u pdate->month,date.m\u pdate->day);

cout将
CDBVariant
转换为
COleDateTime
的正确方法如下:

CDBVariant var;

if(var.m_dwType == DBVT_DATE) 
{
    COleDateTime timestamp(var.m_pdate->year,var.m_pdate->month,var.m_pdate->day,
                     var.m_pdate->hour,var.m_pdate->minute,var.m_pdate->second);
    CString str = timestamp.Format(_T("%B %d, %Y"));
}

就我个人而言,我发现
CDBVariant::m_dwType
报告的数据类型在与SQL数据结合使用时有点不可靠

最好的方法可能是首先使用
CRecordset::GetODBCFieldInfo
函数检查返回的(SQL)数据类型,然后“告诉”
CRecordset::GetFieldValue()
默认的C数据类型:

CRecordSet oSet;        // Hold the set of records returned by SQL query
CDBVariant oVar;        // get the variant values from the each of the fields in SQL resultSet
CODBCFieldInfo oFinfo;  // to get the fieldinfo reported by ODBC
TIMESTAMP_STRUCT myDtm; // DateTime structure for accessing the components of dateTimes from SQL

...     // some other code to populate the oSet

cnsNumOsetCols = oSet.GetODBCFieldCount();

// Iterate thru the columns in the oSet
for (idxCol = 0; idxCol < cnsNumOsetCols; idxCol++)
{
    // Use the ODBC info from the resultSet
    oSet.GetODBCFieldInfo((short)idxCol, oFinfo);
    if ((oFinfo.m_nSQLType == SQL_DATE))
    {
        // Specify the C data type when retreiving the data from the variant
        oSet.GetFieldValue((short)idxCol, oVar, SQL_C_DATE);
        myDtm = oVar.m_pdate;

        ... // some other code to manipulate the date
    }
}


CRecordSet;//保存SQL查询返回的记录集
CDB变异卵形;//从SQL结果集中的每个字段中获取变量值
CODBCFieldInfo of info;//获取ODBC报告的fieldinfo
时间戳_STRUCT myDtm;//用于从SQL访问dateTimes组件的DateTime结构
...     // 其他一些填充oSet的代码
cnsNumOsetCols=oSet.GetODBCFieldCount();
//遍历oSet中的列
对于(idxCol=0;idxCol

但是,如果您不使用CRecordSet,而只使用CDBVVariant在运行时处理任何类型的数据,那么上述内容可能没有任何帮助。

问题出在哪里?还要考虑编辑你的问题,删除与你的问题无关的代码。避免使用<代码>系统(“暂停”)< /代码>。使用
cin.get()改为。
a=NULL不会做你认为它会做的事情。您需要了解对象的生命周期,以及对象不是指针。考虑从数据库中获取一个或多个图书。我在数据库中得到的数据是在CDB-XORT变量中的2015-1215,所以我如何将它转换成实际可用的cTimeValabeLIT。您应该使用
CString str=timestamp.Format(\u T(“%B%d,%Y”)
获取可打印字符串。问题是我从数据库获取的数据没有指向日期部分,因此我使用
rs.GetFieldValue(L“date”,date,SQL\u C\u TIMESTAMP)