SQL執行結果@@ROWCOUNT怎樣在mfc工程中讀出?代碼如下:
if((select count(*) from mydb.dbo.testTB where name='test')=0)
insert into mydb.dbo.testTB (name, memo) VALUES('test','測驗資料')
select @@ROWCOUNT tempcnt
sqlquery ="if((select count(*) from mydb.dbo.testTB where name='test')=0) insert into mydb.dbo.testTB (name, memo) VALUES('test','測驗資料') select @@ROWCOUNT tempcnt";
try
{
m_pRecordset = m_pConnection->Execute(sqlquery,&RecordsAffected,adCmdText);
while(!m_pRecordset->ADOEOF)
{
temprow=m_pRecordset->GetCollect("totalCnt");
temprow.ChangeType(VT_I4);
int uValue = temprow.lVal;
m_pRecordset->MoveNext();
}
//m_pRecordset->Close();
}
catch (_com_error e)
{
CString errormessage;
errormessage.Format(_T("插入失敗!請重新點擊按鈕“輸入資料庫”!\r\n錯誤資訊:%s 錯誤描述:%s"),e.ErrorMessage(),(LPCSTR)e.Description());
AfxMessageBox(errormessage);
return ;
}結果打斷點看到的結果如下(uValue的值)

請問這是哪里寫錯了?
uj5u.com熱心網友回復:
bool CDBAdo::GetFieldValue(LPCTSTR lpcsrFieldName, INT& nValue){
nValue =https://bbs.csdn.net/topics/ 0;
try
{
_variant_t vtFld = m_ptrRecordset->Fields->GetItem(lpcsrFieldName)->Value;
switch(vtFld.vt)
{
case VT_BOOL:
{
nValue =https://bbs.csdn.net/topics/ vtFld.boolVal;
break;
}
case VT_I2:
case VT_UI1:
{
nValue =https://bbs.csdn.net/topics/ vtFld.iVal;
break;
}
case VT_NULL:
case VT_EMPTY:
{
nValue =https://bbs.csdn.net/topics/ 0;
break;
}
default: nValue =https://bbs.csdn.net/topics/ vtFld.iVal;
}
return true;
}
catch(_com_error& comError)
{
RecordErrorMsg(comError);
}
return false;
}
加VT_I4進去,
enum VARENUM
{ VT_EMPTY = 0,
VT_NULL = 1,
VT_I2 = 2,
VT_I4 = 3,
VT_R4 = 4,
VT_R8 = 5,
VT_CY = 6,
VT_DATE = 7,
VT_BSTR = 8,
VT_DISPATCH = 9,
VT_ERROR = 10,
VT_BOOL = 11,
VT_VARIANT = 12,
VT_UNKNOWN = 13,
VT_DECIMAL = 14,
VT_I1 = 16,
VT_UI1 = 17,
VT_UI2 = 18,
VT_UI4 = 19,
VT_I8 = 20,
VT_UI8 = 21,
VT_INT = 22,
VT_UINT = 23,
VT_VOID = 24,
VT_HRESULT = 25,
VT_PTR = 26,
VT_SAFEARRAY = 27,
VT_CARRAY = 28,
VT_USERDEFINED = 29,
VT_LPSTR = 30,
VT_LPWSTR = 31,
VT_RECORD = 36,
VT_INT_PTR = 37,
VT_UINT_PTR = 38,
VT_FILETIME = 64,
VT_BLOB = 65,
VT_STREAM = 66,
VT_STORAGE = 67,
VT_STREAMED_OBJECT = 68,
VT_STORED_OBJECT = 69,
VT_BLOB_OBJECT = 70,
VT_CF = 71,
VT_CLSID = 72,
VT_VERSIONED_STREAM = 73,
VT_BSTR_BLOB = 0xfff,
VT_VECTOR = 0x1000,
VT_ARRAY = 0x2000,
VT_BYREF = 0x4000,
VT_RESERVED = 0x8000,
VT_ILLEGAL = 0xffff,
VT_ILLEGALMASKED = 0xfff,
VT_TYPEMASK = 0xfff
} ;
uj5u.com熱心網友回復:
你列的列舉型別enum VARENUM在WTypes.h中已經有定義了,要在我自己的工程中重新定義嗎?然后再寫一個函式來判斷每種情況回傳什么值?我的意思是要準確讀出sql查詢出的結果,而不是給它賦予一個值,不好意思,剛接觸這方面的知識,不太懂你的意思,可以麻煩你再解釋一下嗎?針對小白的解釋,謝謝啦
uj5u.com熱心網友回復:
Execute(sqlquery,&RecordsAffected,adCmdText);RecordsAffected等價于SQL中的@@ROWCOUNT,不需要特地執行select @@ROWCOUNT
uj5u.com熱心網友回復:
沒有讓你重定義的意思,意思就是對比一下上面的代碼沒有這個型別,你加到讀取的型別里就可以了
uj5u.com熱心網友回復:
謝謝,我明白了,問題是@@ROWCOUNT回傳的值不對,在sql server里查詢的話回傳的@@ROWCOUNT是對的,但是在mfc里回傳的值經常是錯的(有時候正確),用下面的代碼讀的,
while(!m_pRecordset->ADOEOF)
{
count=m_pRecordset->GetCollect("cnt");
m_pRecordset->MoveNext();
}
insertCnt=_ttoi((LPCTSTR)(_bstr_t)count);
這是什么原因呀?
uj5u.com熱心網友回復:
Execute(sqlquery,&RecordsAffected,adCmdText);
RecordsAffected等價于SQL中的@@ROWCOUNT,不需要特地執行select @@ROWCOUNT
謝謝,我也試了用RecordsAffected來讀的,但是不知道為什么RecordsAffected經常是錯誤的,就是插入資料成功(資料庫里已經有這條資料)但是RecordsAffected是等于-1,而且catch error能捕捉到錯誤,請問一下這是什么原因?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/28731.html
標籤:數據庫
