📄 executesqlproc.cpp
字号:
{
if(pChildFrame->m_bSQLRowCountSupported && !pChildFrame->m_bCanceled)
{
nRowsAffected = -1;
if(::SQLRowCount(pChildFrame->m_pSet->m_hstmt, &nRowsAffected) !=
SQL_SUCCESS)
TRACE(_T("Error getting rows affected info.\n"));
if(nRowsAffected != -1)
sBuff.Format(_T("(%d row(s) affected)"), nRowsAffected);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += sBuff;
}
}
else
{
if(::SendMessage(pChildFrame->m_hWnd, WM_GET_GRID_CTRL,
nCols, 0L) == -1)
throw _T("Failed to create grid control.");
if(!pChildFrame->m_bCanceled)
CExecuteSQLProc::SetGridHeaderInfo(
pTP->m_ptrGridCtrl, pChildFrame->m_pSet
);
if(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsBOF())
{
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lMaxRows, 0L) == -1)
throw _T("Unable to Allocate Memory for FlexGrid.");
if(pChildFrame->m_bCanceled)
CExecuteSQLProc::m_lRow = lRow+1;
try
{
pChildFrame->m_pSet->MoveNext();
}
catch(CDBException* e)
{
if(e)
{
if(!pChildFrame->m_bCanceled)
{
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
TRACE(_T("Unable to Allocate Memory for FlexGrid\n"));
sBuff.Format(
_T("[%d row(s) affected (application specific)]"),
lRow
);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += sBuff;
}
throw e;
}
}
while(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsEOF())
{
if(lRow >= lMaxRows-1)
{
lMaxRows += 700;
if(!pChildFrame->m_bCanceled)
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lMaxRows, 0L) == -1)
throw _T("Unable to Allocate Memory for FlexGrid.");
pTP->m_pGridCtrl->Invalidate();
pTP->m_pGridCtrl->UpdateWindow();
}
++lRow;
CExecuteSQLProc::m_lRow = lRow+1;
for(int n = 0; n < nCols; n++)
{
try
{
pChildFrame->m_pSet->GetFieldValue(n, sBuff);
}
catch(CDBException* e)
{
if(e)
{
if(!pChildFrame->m_bCanceled)
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
TRACE(_T("Unable to Allocate Memory for FlexGrid.\n"));
throw e;
}
}
bstrBuff = (LPCTSTR)sBuff;
if(FAILED(pTP->m_ptrGridCtrl->put_TextMatrix(
lRow, n, bstrBuff)))
{
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
TRACE(_T("Unable to Allocate Memory for FlexGrid\n"));
throw _T("Subscript out of range.");
}
}
if(!pChildFrame->m_bCanceled)
{
try
{
pChildFrame->m_pSet->MoveNext();
}
catch(CDBException* e)
{
if(e)
{
if(!pChildFrame->m_bCanceled)
{
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
TRACE(_T("Unable to Allocate Memory for FlexGrid\n"));
sBuff.Format(
_T("[%d row(s) affected (application specific)]"),
lRow
);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += sBuff;
}
throw e;
}
}
}
}
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lRow+1, 0L) == -1)
throw _T("Unable to Allocate Memory for FlexGrid.");
}
if(pChildFrame->m_bCanceled)
CExecuteSQLProc::m_lRow = lRow+1;
else
{
sBuff.Format(
_T("[%d row(s) affected (application specific)]"),
lRow
);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += sBuff;
}
}
}
}
pChildFrame->CloseRecordset();
}
void CExecuteSQLProc::SetGridHeaderInfo(const MSFlexGridLib::IMSFlexGridPtr&
ptrGridCtrl, CRecordsetEx* pSet)
{
ASSERT(ptrGridCtrl != NULL);
ASSERT(pSet != NULL);
CODBCFieldInfo fieldInfo;
int nPrecision = 0;
int nFieldLength = 0;
int nArbitraryFactor = 110;
int nCols = pSet->GetODBCFieldCount();
UINT nMaxWidth = 50;
for(int n = 0; n < nCols; n++)
{
pSet->GetODBCFieldInfo(n, fieldInfo);
nFieldLength = fieldInfo.m_strName.GetLength();
if(fieldInfo.m_nPrecision < (UDWORD)nFieldLength)
nPrecision = nFieldLength;
else if(fieldInfo.m_nPrecision > nMaxWidth)
nPrecision = nMaxWidth;
else
nPrecision = fieldInfo.m_nPrecision;
ptrGridCtrl->put_ColAlignment(
n, MSFlexGridLib::flexAlignLeftCenter
);
ptrGridCtrl->put_ColWidth(
n, (nPrecision+fieldInfo.m_nScale)*nArbitraryFactor
);
ptrGridCtrl->put_TextMatrix(
0, n, (_bstr_t)fieldInfo.m_strName
);
}
}
UINT ExecuteSQLProcProc(LPVOID lpVoid)
{
ThreadParam* pTP = (ThreadParam*)lpVoid;
ASSERT(pTP != NULL);
CChildFrame* pChildFrame = pTP->m_pFrame;
ASSERT(pChildFrame != NULL);
pChildFrame->m_strProcText.erase();
bool bCaughtException = false;
CString sBuff;
try
{
pChildFrame->CloseRecordset();
if(!pChildFrame->m_bCanceled && pChildFrame->m_pSet->ExecDirect(pTP->m_strSQL))
{
if(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsBOF() &&
pChildFrame->m_pSet->GetODBCFieldCount())
{
while(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsEOF())
{
pChildFrame->m_pSet->GetFieldValue((short)0, sBuff);
pChildFrame->m_strProcText += (LPCTSTR)sBuff;
if(!pChildFrame->m_bCanceled)
pChildFrame->m_pSet->MoveNext();
}
}
// while <::SQLMoreResults> loop. Also, reset the cursor state
// Microsoft SQL Server, SybaseSQLAnywhere, and Oracle will bail
// here.
while(!pChildFrame->m_bCanceled && pChildFrame->m_bIsMultiSetSupported &&
pChildFrame->m_pSet->FlushResultSet())
{
// Clean up the old column info and build new one
if(!pChildFrame->m_bCanceled)
pChildFrame->m_pSet->AllocAndCacheFieldInfo();
if(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsBOF() &&
pChildFrame->m_pSet->GetODBCFieldCount())
{
pChildFrame->m_strProcText += _T("\n\n");
if(!pChildFrame->m_bCanceled)
pChildFrame->m_pSet->MoveNext();
while(!pChildFrame->m_bCanceled && !pChildFrame->m_pSet->IsEOF())
{
pChildFrame->m_pSet->GetFieldValue((short)0, sBuff);
pChildFrame->m_strProcText += sBuff;
if(!pChildFrame->m_bCanceled)
pChildFrame->m_pSet->MoveNext();
}
}
}
if(!pChildFrame->m_bCanceled && !pChildFrame->m_strProcText.length())
pChildFrame->m_strProcText = _T("NULL");
}
}
catch(CDBException* e)
{
if(e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
if(!e->m_strError.IsEmpty())
sBuff.Format(
_T("%s%s"), (LPCTSTR)e->m_strError, (LPCTSTR)e->m_strStateNativeOrigin
);
else
sBuff = e->m_strStateNativeOrigin;
if(sBuff.IsEmpty())
sBuff = "Errors occurred.";
pChildFrame->m_strMessages += sBuff;
}
e->Delete();
}
}
catch(CMemoryException* e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += _T("Out-of-Memory.");
}
if(e)
e->Delete();
}
catch(...)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += _T("Errors occurred.");
}
}
pChildFrame->CloseRecordset();
try
{
if(pChildFrame->m_bIsTSQLSupported && !pChildFrame->m_bCanceled)
{
if(pTP->m_strSQL.FindNoCase(_T("USE ")) != -1)
{
if(!pChildFrame->SelectDatabase())
TRACE(_T("Error selecting database context.\n"));
}
}
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
try
{
::PostMessage(
pChildFrame->m_hWnd, WM_EXEC_PROC_COMPLETE,
bCaughtException, 0L
);
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -