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的数据库.
{
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 .....
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的附录
主键可以打开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的数据库.
{
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 .....
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的附录
主键可以打开adSchemaPrimaryKeys,具体查看msdn关于oledb的附录
#7
我用的是ADO啊,谢谢上面兄弟的热心.我奇怪的是我的代码很标准了.为什么读不出来呢
#8
我用的不是OLEDB而是ADO,请大家帮忙!!!先谢谢了!