⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datalink.cpp

📁 数据访问的定义类
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	case VT_I1:
		value = var.bVal;
		break;
	case VT_UI2:
	case VT_I2:
		value = var.iVal;
		break;
	case VT_I4:
	case VT_UI4:
		value = var.lVal;
		break;
	case VT_INT:
		value = var.intVal;
		break;
	case VT_R4:
		value = (long)(var.fltVal + 0.5);
		break;
	case VT_R8:
		value = (long)(var.dblVal + 0.5);
		break;
	case VT_DECIMAL:
		value = (long)var;
		break;
	case VT_CY:
		value = (long)var;
		break;
	case VT_BSTR://字符串
	case VT_LPSTR://字符串
	case VT_LPWSTR://字符串
		value = atol((LPCTSTR)(_bstr_t)var);
		break;
	case VT_NULL:
	case VT_EMPTY:
		value = 0;
		break;
	default:
		TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
	}
	return value;
}

double vartof(const _variant_t& var)
{
	double value = 0;
	switch (var.vt)
	{
	case VT_R4:
		value = var.fltVal;
		break;
	case VT_R8:
		value = var.dblVal;
		break;
	case VT_DECIMAL:
		value = (double)var;
		break;
	case VT_CY:
		value = (double)var;
		break;
	case VT_BOOL:
		value = var.boolVal;
		break;
	case VT_UI1:
	case VT_I1:
		value = var.bVal;
		break;
	case VT_UI2:
	case VT_I2:
		value = var.iVal;
		break;
	case VT_UI4:
	case VT_I4:
		value = var.lVal;
		break;
	case VT_INT:
		value = var.intVal;
		break;
	case VT_BSTR://字符串
	case VT_LPSTR://字符串
	case VT_LPWSTR://字符串
		value = atof((LPCTSTR)(_bstr_t)var);
		break;
	case VT_NULL:
	case VT_EMPTY:
		value = 0;
		break;
	default:
		value = 0;
		TRACE(_T("Warning: 未处理的 _variant_t 类型值; 文件: %s; 行: %d\n"), __FILE__, __LINE__);
	}
	return value;
}

CString vartostr(const _variant_t &var)
{
	CString strFormat;
	CString strValue;

	switch (var.vt)
	{
	case VT_BSTR://字符串
	case VT_LPSTR://字符串
	case VT_LPWSTR://字符串
		strValue = (LPCTSTR)(_bstr_t)var;
		break;
	case VT_I1:
	case VT_UI1:
		strValue.Format("%d", var.bVal);
		break;
	case VT_I2://短整型
		strValue.Format("%d", var.iVal);
		break;
	case VT_UI2://无符号短整型
		strValue.Format("%d", var.uiVal);
		break;
	case VT_INT://整型
		strValue.Format("%d", var.intVal);
		break;
	case VT_I4: //整型
		strValue.Format("%d", var.lVal);
		break;
	case VT_I8: //长整型
		strValue.Format("%d", var.lVal);
		break;
	case VT_UINT://无符号整型
		strValue.Format("%d", var.uintVal);
		break;
	case VT_UI4: //无符号整型
		strValue.Format("%d", var.ulVal);
		break;
	case VT_UI8: //无符号长整型
		strValue.Format("%d", var.ulVal);
		break;
	case VT_VOID:
		strValue.Format("%8x", var.byref);
		break;
	case VT_R4://浮点型
		strValue.Format("%.2f", var.fltVal);
		break;
	case VT_R8://双精度型
		strValue.Format("%.4f", var.dblVal);
		break;
	case VT_DECIMAL: //小数
		strFormat.Format("%%.%df", min(var.decVal.scale, 6));
		strValue.Format(strFormat, (double)var);
		break;
	case VT_CY:
		{
			COleCurrency cy = var.cyVal;
			strValue = cy.Format();
		}
		break;
	case VT_BLOB:
	case VT_BLOB_OBJECT:
	case 0x2011:
		strValue = "[BLOB]";
		break;
	case VT_BOOL://布尔型
		strValue = var.boolVal ? "TRUE" : "FALSE";
		break;
	case VT_DATE: //日期型
		{
			DATE dt = var.date;
			COleDateTime da = COleDateTime(dt); 
			strValue = da.Format("%Y-%m-%d");
			//strValue = da.Format("%d/%m/%Y");
		}
		break;
	case VT_NULL://NULL值
		strValue = "";
		break;
	case VT_EMPTY://空
		strValue = "";
		break;
	case VT_UNKNOWN://未知类型
	default:
		strValue = "UN_KNOW";
		break;
	}
	return strValue;
}





// CConnectionString。
// 有关类定义的信息,请参阅 DataLink.h

CConnectionString::CConnectionString()
{ 
}

CConnectionString::CConnectionString(const CString& stringSrc) : CString(stringSrc)
{
}

CConnectionString::CConnectionString(LPCTSTR lpsz) : CString(lpsz)
{
}

CConnectionString::CConnectionString(LPCTSTR lpch, int nLength) : CString(lpch, nLength)
{
}

CConnectionString::CConnectionString(UINT nProviderType, LPCTSTR datasrc, 
	LPCTSTR catalog /* = NULL */, LPCTSTR userid /* = NULL */, LPCTSTR password /* = NULL */)
{
	CString provider;
	switch (nProviderType)
	{
	case 0:
		provider = _T("Microsoft.Jet.OLEDB.4.0");
		break;
	case 1:
		provider = _T("MSDAORA");
		break;
	case 2:
		provider = _T("SQLOLEDB");
		break;
	default:
		break;
	}

	// 构造连接字符串
	*this = CConnectionString(provider, datasrc, catalog, userid, password);
}

CConnectionString::CConnectionString(LPCTSTR provider, LPCTSTR datasrc, 
	LPCTSTR catalog /* = NULL */, LPCTSTR userid /* = NULL */, LPCTSTR password /* = NULL */)
{
	ASSERT(provider != NULL);
	ASSERT(datasrc != NULL);
	SetKeyValue(_T("Provider"), provider);
	SetKeyValue(_T("Data Source"), datasrc);
	SetKeyValue(_T("Initial Catalog"), catalog);
	SetKeyValue(_T("User ID"), userid);
	SetKeyValue(_T("Password"), password);
	SetKeyValue(_T("Persist Security Info"), _T("False"));
}

CConnectionString::~CConnectionString()
{
}

// 设置关键字的值
void CConnectionString::SetKeyValue(LPCTSTR keyName, LPCTSTR value)
{
	ASSERT(keyName != NULL);
	LPCTSTR lpchLeft, lpchRight;
	lpchLeft = lpchRight = LPCTSTR(*this);
	TCHAR szKeyName[_MAX_PATH], szValue[_MAX_PATH];
	while (lpchRight != NULL)
	{
		lpchRight = _tsplitattr(lpchRight, szKeyName, NULL);
		if (_tcsicmp(szKeyName, keyName) == 0)
			break;
		lpchLeft = lpchRight;
	}

	_tcscpy2(szKeyName, keyName, _T('='));
	_tcscpy2(szValue, value, _T('\"'));
	CString strItem;
	if (value != NULL && lstrlen(value) > 0)
	{
		if (_tcscspn(value, _T(" \'\";")) < (size_t)lstrlen(value))
			strItem.Format(_T("%s=\"%s\";"), szKeyName, szValue);
		else
			strItem.Format(_T("%s=%s;"), szKeyName, szValue);
	}

	int nStart = (lpchLeft == NULL) ? GetLength() : (int)(lpchLeft - LPCTSTR(*this));
	int nEnd = (lpchRight == NULL) ? GetLength() : (int)(lpchRight -LPCTSTR(*this));
	Delete(nStart, nEnd - nStart);
	Insert(nStart, strItem);
}

CString CConnectionString::GetKeyValue(LPCTSTR keyName)
{
	CString value;
	LPCTSTR lpFullString = LPCTSTR(*this);
	TCHAR szKeyName[_MAX_PATH], szValue[_MAX_PATH];
	while (lpFullString != NULL)
	{
		lpFullString = _tsplitattr(lpFullString, szKeyName, szValue);
		if (_tcsicmp(szKeyName, keyName) == 0)
		{
			value = szValue;
			break;
		}
	}
	return value;
}

CString CConnectionString::GetKeyName(int nIndex)
{
	CString keyName;
	LPCTSTR lpFullString = LPCTSTR(*this);
	TCHAR szKeyName[_MAX_PATH];
	while (nIndex >= 0)
	{
		if (lpFullString == NULL)
			return keyName;
		lpFullString = _tsplitattr(lpFullString, szKeyName, NULL);
		nIndex--;
	}
	keyName = szKeyName;
	return keyName;
}

// 测试数据链接
BOOL CConnectionString::TestConnect()
{
	if (IsEmpty())
		return FALSE;

	IDispatch* pConnection = OpenConnection();
	if (pConnection == NULL)
		return FALSE;

	// 关闭数据库连接
	pConnection->Release();
	return TRUE;
}

// 打开数据库连接
IDispatch* CConnectionString::OpenConnection()
{
	_ConnectionPtr pConnection;
	if (pConnection.CreateInstance(_T("ADODB.Connection")) != S_OK)
		return NULL;

	// 连接数据库
	_bstr_t sEmpty = _T("");
	pConnection->put_ConnectionTimeout(5);
	HRESULT _hr = pConnection->raw_Open((_bstr_t)(*this), sEmpty, sEmpty, adConnectUnspecified);
	if (FAILED(_hr))
	{
		_SetErrorInfo(pConnection->Errors);
		return NULL;
	}

	pConnection.AddRef();
	return (IDispatch*)pConnection;
}


// CSqlString。
// 有关类定义的信息,请参阅 DataLink.h

CSqlString::CSqlString()
{
}

CSqlString::CSqlString(const CString& stringSrc) : CString(stringSrc)
{
}

CSqlString::CSqlString(LPCTSTR lpsz) : CString(lpsz)
{
}

CSqlString::CSqlString(LPCTSTR lpch, int nLength) : CString(lpch, nLength)
{
}

CSqlString::~CSqlString()
{
}

CString CSqlString::Execute(IDispatch* pConnection, LPCTSTR lpszCmdText, 
	UINT* pRecordsAffected)
{
	ASSERT(pConnection != NULL);
	ASSERT(lpszCmdText != NULL);

	CString strResult;
	_RecordsetPtr pRecordset;
	_variant_t var;
	CString strSQL;
	int iSubString = 0;
	UINT nRecordsAffected = 0;
	HRESULT _hr = S_OK;

	// 使用连接对象执行 SQL 语句
	_ConnectionPtr pConnection1 = (_ConnectionPtr)pConnection;
	while (AfxExtractSubString(strSQL, lpszCmdText, iSubString++, _T(';')))
	{
		_hr = pConnection1->raw_Execute((_bstr_t)strSQL, &var, adCmdText, &pRecordset);
		if (FAILED(_hr))
		{
			_SetErrorInfo(pConnection1->Errors);
			nRecordsAffected = -1;
			break;
		}

		if ((pRecordset->State & adStateOpen) && (!pRecordset->IsEOF))
		{
			// 将记录集的第一行以TAB分隔符输出
			long nFieldCount = pRecordset->Fields->GetCount();
			for (long nIndex=0; nIndex<nFieldCount; nIndex++)
			{
				var = pRecordset->GetCollect(COleVariant(nIndex));
				if (nIndex > 0)
					strResult.Insert(strResult.GetLength(), _T('\t'));
				strResult.Insert(strResult.GetLength(), vartostr(var));
			}
			// 关闭数据集和数据库连接
			pRecordset->Close();
		}
		else
		{
			// 增加受影响记录计数
			nRecordsAffected += var.intVal;
		}
	}

	if (pRecordsAffected != NULL)
		*pRecordsAffected = nRecordsAffected;

	return strResult;
}

CString CSqlString::Execute()
{
	CString strResult;
	if (IsEmpty())
	{
		m_nRecordsAffected = 0;
		return strResult;
	}

	CConnectionString strConnection = GetConnectionString();
	IDispatch* pConnection = strConnection.OpenConnection();
	if (pConnection != NULL)
	{
		strResult = CSqlString::Execute(pConnection, *this, &m_nRecordsAffected);

		// 关闭数据库连接
		pConnection->Release();
	}

	return strResult;
}

CString CSqlString::Execute(LPCTSTR lpszFormat, ...)
{
	va_list argList;;
	va_start(argList, lpszFormat);
	CString& str = ExecuteV(lpszFormat, argList);
	va_end(argList);
	return str;
}

CString CSqlString::ExecuteV(LPCTSTR lpszFormat, va_list args)
{
	CSqlString strSQL;
	strSQL.FormatV(lpszFormat, args);
	return strSQL.Execute();
}

int CSqlString::GetRecordsAffected() const
{
	return m_nRecordsAffected;
}

CString CSqlString::GetConnectionString() const
{
	if (!m_strConnectionString.IsEmpty())
		return m_strConnectionString;

	_AFX_DATALINK_STATE* pState = _afxDataLinkState.GetData();
	return pState->m_pszConnectionString;
}

void CSqlString::SetConnectionString(LPCTSTR value)
{
	m_strConnectionString = value;
}

void CSqlString::Normalize()
{
	SqlString_Normalize(*this);
}

// select_list
CString CSqlString::GetSelectList()
{
	int nIndex, nCount;
	SqlString_SelectList(*this, nIndex, nCount);
	return Mid(nIndex, nCount);
}

void CSqlString::SetSelectList(LPCTSTR lpszSelectList)
{
	int nIndex, nCount;
	if (!SqlString_SelectList(*this, nIndex, nCount))
		SqlString_Insert(*this, nIndex, _T("select "));
	SqlString_Stuff(*this, nIndex, nCount, lpszSelectList);
}

// column_alias, column_name and expression
int CSqlString::GetColumnCount()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -