请教大家,如何在ADO中判断一个字段是否可以为空,如果判断一个字段是否为主键?

时间:2021-10-10 13:38:33
如何在ADO中判断一个字段是否可以为空,如果判断一个字段是否为主键?
FieldAttributeEnum
{
    adFldUnspecified = -1,
    adFldMayDefer = 2,
    adFldUpdatable = 4,
    adFldUnknownUpdatable = 8,
    adFldFixed = 16,
    adFldIsNullable = 32,
    adFldMayBeNull = 64,
....
}好象用这个结构可以判断是否为空,不过我好象没找到ADO中相应的函数.我是用import方式导入的ADO头文件.

8 个解决方案

#1


long CThisAdoUtility::GetFieldAttributes(CString strTbl, CString strFld)
{
CString strSql;
strSql.Format("SELECT %s FROM [%s]",strFld,strTbl);
CString sTempText;
_variant_t index;
index.vt = VT_I4;
BSTR bstrFieldName;

Fields *pFields = NULL;
Field * pField = NULL;
long lNumFields = 0;

_RecordsetPtr rs = NULL;
rs.CreateInstance(__uuidof(Recordset));
_bstr_t strSQLOpen(strSql);

try
{
rs->Open(strSQLOpen, GetConnectionPtr().GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);
}
catch(_com_error &er)
{
DisplayADOException(er);
#ifdef _DEBUG
CString sPrompt;
sPrompt.Format("执行的查询语句:\n%s", strSql);
MyMessageBox(sPrompt);
#endif
return false;
}

//读取行信息(由列组合而成)
rs->get_Fields(&pFields);
pFields->get_Count(&lNumFields);
for( int i=0; i<lNumFields; i++ )
{
index.lVal = i;
//读取列的信息
pFields->get_Item(index, &pField);
pField->get_Name(&bstrFieldName);
sTempText = bstrFieldName;
sTempText.TrimLeft(),sTempText.TrimRight();
if(sTempText.CompareNoCase(strFld)==0)
{
//一个或多个 FieldAttributeEnum 值的和
return pField->GetAttributes();
}
}
return false;
}
得到的结果来与上GetFieldAttributes(m_strTblName,strCurColEname)&adFldIsNullable应该就可以判断了啊????但是为什么我得到的结果不对???是不是在连接上还有什么要求,我连的是ACCESS的数据库.

#2


有没有哪位朋友知道原因啊.谢谢大家了!!!!!!!!!!!!!11

#3


_variant_t value;
value = pSet->GetCollect(......
if(value.vt = VT_NULL)   //if value is empty .....

#4


我这样写为什么不行啊?

#5


if(value.vt = VT_NULL) 只是判断当前读取的行是否为空?不是判断这个字段是否可以为空的吧?不过还是要谢谢上面这位兄弟的回答,还有谁知道么?

#6


可以通过OpenSchema来判断是否为空,参数是pConnection->OpenSchema(adSchemaTables);返回一个recordset,查看IS_NULLABLE行即可

主键可以打开adSchemaPrimaryKeys,具体查看msdn关于oledb的附录

#7


我用的是ADO啊,谢谢上面兄弟的热心.我奇怪的是我的代码很标准了.为什么读不出来呢

#8


我用的不是OLEDB而是ADO,请大家帮忙!!!先谢谢了!

#1


long CThisAdoUtility::GetFieldAttributes(CString strTbl, CString strFld)
{
CString strSql;
strSql.Format("SELECT %s FROM [%s]",strFld,strTbl);
CString sTempText;
_variant_t index;
index.vt = VT_I4;
BSTR bstrFieldName;

Fields *pFields = NULL;
Field * pField = NULL;
long lNumFields = 0;

_RecordsetPtr rs = NULL;
rs.CreateInstance(__uuidof(Recordset));
_bstr_t strSQLOpen(strSql);

try
{
rs->Open(strSQLOpen, GetConnectionPtr().GetInterfacePtr(), adOpenForwardOnly, adLockReadOnly, adCmdText);
}
catch(_com_error &er)
{
DisplayADOException(er);
#ifdef _DEBUG
CString sPrompt;
sPrompt.Format("执行的查询语句:\n%s", strSql);
MyMessageBox(sPrompt);
#endif
return false;
}

//读取行信息(由列组合而成)
rs->get_Fields(&pFields);
pFields->get_Count(&lNumFields);
for( int i=0; i<lNumFields; i++ )
{
index.lVal = i;
//读取列的信息
pFields->get_Item(index, &pField);
pField->get_Name(&bstrFieldName);
sTempText = bstrFieldName;
sTempText.TrimLeft(),sTempText.TrimRight();
if(sTempText.CompareNoCase(strFld)==0)
{
//一个或多个 FieldAttributeEnum 值的和
return pField->GetAttributes();
}
}
return false;
}
得到的结果来与上GetFieldAttributes(m_strTblName,strCurColEname)&adFldIsNullable应该就可以判断了啊????但是为什么我得到的结果不对???是不是在连接上还有什么要求,我连的是ACCESS的数据库.

#2


有没有哪位朋友知道原因啊.谢谢大家了!!!!!!!!!!!!!11

#3


_variant_t value;
value = pSet->GetCollect(......
if(value.vt = VT_NULL)   //if value is empty .....

#4


我这样写为什么不行啊?

#5


if(value.vt = VT_NULL) 只是判断当前读取的行是否为空?不是判断这个字段是否可以为空的吧?不过还是要谢谢上面这位兄弟的回答,还有谁知道么?

#6


可以通过OpenSchema来判断是否为空,参数是pConnection->OpenSchema(adSchemaTables);返回一个recordset,查看IS_NULLABLE行即可

主键可以打开adSchemaPrimaryKeys,具体查看msdn关于oledb的附录

#7


我用的是ADO啊,谢谢上面兄弟的热心.我奇怪的是我的代码很标准了.为什么读不出来呢

#8


我用的不是OLEDB而是ADO,请大家帮忙!!!先谢谢了!