VC_ConnectionPtr->exectue 不正确的变量类型

本文解决了一个关于VC_ConnectionPtr-execute方法中变量类型错误的问题,通过将VARIANT类型的变量改为指针形式解决了执行数据库命令时出现的异常。

原文地址:http://www.greensoftcode.net/techntxt/201331014357937960719


{
  if (g_connisopen) 
  {
   VARIANT recodcount; 
   try
   {
       g_pconnection->Execute(_bstr_t(sql),&recodcount,adCmdText);
     return TRUE;
   }
     catch(_com_error &e)  //异常处理
   {
    AfxMessageBox(e.Description()); 
   }

 
  }
  else
  {
 AfxMessageBox("没有连接数据库!");
  }
  return FALSE;

上面的写法报出VC_ConnectionPtr->exectue 不正确的变量类型

{
  if (g_connisopen) 
  {
   VARIANT* recodcount=NULL;  //修改VARIANT recodcount; 问题解决
   try
   {
       g_pconnection->Execute(_bstr_t(sql),recodcount,adCmdText);
     return TRUE;
   }
     catch(_com_error &e)  //异常处理
   {
    AfxMessageBox(e.Description()); 
   }

 
  }
  else
  {
 AfxMessageBox("没有连接数据库!");
  }
  return FALSE;


struct data2 { _variant_t ColumnValue; _variant_t LineValue; }; class CSqlDatas { public: CSqlDatas(); ~CSqlDatas(); public: CString m_strDBIp; _ConnectionPtr m_pConn; _RecordsetPtr m_recordPtr; bool ConnectServer(CString m_strDBIp); bool ConnectServer2(CString m_strDBIp); bool ConnectServerModTest(CString m_strDBIp); void CloseServer(); bool CheckTable2(vector<long> input_lines, data2 input_data, vector<long> &output_lines); vector<_variant_t> col_names; public: bool LinkDataTable(_variant_t Source); /!<获得表中的所有数据/ bool CollectAllDatas(vector<vector> &datas);/!<Source(in)选表语句,ColDatas(out)所有列,datas(out)所有数据/ bool CollectPbiDatas(vector<vector> &datas); /!<获得所有列的名称/ bool GetColNames(vector<_variant_t> &col_names); bool CollectLimiteDatas(vector inputDates, vector<vector> &outputDatas); bool AddData(vector LineDatas);/!<LineDatas(in)加入表格中的数据,从0开始/ bool AddLine(vector LineDatas); void GetLineDatas(long line, vector<data2> &data);/*!<获得某一行的数据,line从1开始*/ void ChangeData(long i, vector<data2> datas);/*!<i(in)表示第几行,datas(in)新的数据*/ void DeleteData(int i);/*!<i(in)表示第几行,从0行开始*/ void DeleteAll();/*!<删除表中的所有数据*/ //void UpdataAll(CString path,_variant_t TableName);/*!<path(in)excle的完整路径,TableName(in)数据库表格的名称*/ void TableSort(_bstr_t Criteria); bool CheckMainColumnVal(data2 cdata);/*!<cdata(in)检查关键列是否已经有这个值,TRUE表示没有*/ void CollectComboCtr(_bstr_t typeStr, vector<_variant_t> &ComboStr);/*!<获得所有的typeStr同的值*/ }; #include “StdAfx.h” #include “SqlDatas.h” CSqlDatas::CSqlDatas(void) { } CSqlDatas::~CSqlDatas(void) { CloseServer(); } bool CSqlDatas::ConnectServer(CString m_strDBIp) { HRESULT hr = CoInitialize(NULL); // 初始化COM环境 if (FAILED(hr)) return false; CString aStrConn; aStrConn.Format(_T(“driver=SQL Server;server=%s;database=MDS2;uid=;pwd=”), m_strDBIp); hr = m_pConn.CreateInstance(__uuidof(Connection)); if (FAILED(hr)) { AfxMessageBox(L"SQL异常!“); return false; } try { hr = m_pConn->Open((_bstr_t)aStrConn, _T(“mds”), _T(“password”), adConnectUnspecified); m_pConn->PutCursorLocation(adUseClient); } catch (_com_error &e) { CString strstring = e.Description(); //AfxMessageBox(L"SQL用户名或密码错误!”); return false; } return true; } bool CSqlDatas::ConnectServerModTest(CString m_strDBIp) { HRESULT hr = CoInitialize(NULL); // 初始化COM环境 if (FAILED(hr)) return false; CString aStrConn; aStrConn.Format(_T(“driver=MySQL ODBC 8.0 ANSI Driver;server=%s;database=jeesite;uid=;pwd=”), m_strDBIp); hr = m_pConn.CreateInstance(__uuidof(Connection)); if (FAILED(hr)) { AfxMessageBox(L"SQL异常!“); return false; } try { hr = m_pConn->Open((_bstr_t)aStrConn, _T(“root”), _T(“admin”), adConnectUnspecified); m_pConn->PutCursorLocation(adUseClient); } catch (_com_error &e) { CString strstring = e.Description(); //AfxMessageBox(L"SQL用户名或密码错误!”); return false; } return true; } bool CSqlDatas::ConnectServer2(CString m_strDBIp) { HRESULT hr = CoInitialize(NULL); // 初始化COM环境 if (FAILED(hr)) return false; CString aStrConn; aStrConn.Format(_T(“driver=SQL Server;server=%s;database=MDS;uid=;pwd=”), m_strDBIp); hr = m_pConn.CreateInstance(__uuidof(Connection)); if (FAILED(hr)) { AfxMessageBox(L"SQL异常!“); return false; } try { hr = m_pConn->Open((_bstr_t)aStrConn, _T(“mds”), _T(“password”), adConnectUnspecified); m_pConn->PutCursorLocation(adUseClient); } catch (_com_error &e) { CString strstring = e.Description(); //AfxMessageBox(L"SQL用户名或密码错误!”); return false; } return true; } void CSqlDatas::CloseServer() { //m_pConn->Close(); CoInitialize(NULL);//20230605 zxm修复因高频调用CoUninitialize函数使Creo的OLE对象无法播放的问题 CoUninitialize(); //注销COM库 col_names.clear(); } bool CSqlDatas::LinkDataTable(_variant_t Source) { m_recordPtr.CreateInstance(__uuidof(Recordset)); try { m_recordPtr->Open(Source, m_pConn.GetInterfacePtr(), adOpenStatic,//静态 adLockOptimistic,//乐观封锁法 adCmdText); } catch (_com_error e) { //AfxMessageBox(e.Description()); return FALSE; } return TRUE; } bool CSqlDatas::CollectPbiDatas(vector<vector> &datas) { datas.clear(); vector row_datas; long row_count = m_recordPtr->RecordCount; if (row_count > 10000) { AfxMessageBox(L"搜索结果过于庞大,请增加关键字数量"); return FALSE; } for (long i = 1; i <= row_count; i++) { GetLineDatas(i, row_datas); datas.push_back(row_datas); row_datas.clear(); } return true; } bool CSqlDatas::CollectAllDatas(vector<vector> &datas) { datas.clear(); vector row_datas; long row_count = m_recordPtr->RecordCount; for (long i = 1; i <= row_count; i++) { GetLineDatas(i, row_datas); datas.push_back(row_datas); row_datas.clear(); } return true; } void CSqlDatas::GetLineDatas(long line, vector &datas) { data2 rowdata; long count = m_recordPtr->GetFields()->GetCount(); m_recordPtr->MoveFirst(); m_recordPtr->Move((long)line - 1); for (long j = 0; j<count; j++) { rowdata.ColumnValue = m_recordPtr->GetFields()->GetItem(j)->GetName(); rowdata.LineValue = m_recordPtr->GetCollect(rowdata.ColumnValue); if (rowdata.LineValue.vt == VT_NULL) rowdata.LineValue = “”; datas.push_back(rowdata); } } bool CSqlDatas::GetColNames(vector<_variant_t> &col_names) { long count = m_recordPtr->GetFields()->GetCount(); if (count<1) { AfxMessageBox(_T(“没有列名称”)); return FALSE; } for (long j = 0; j<count; j++) { _variant_t name = m_recordPtr->GetFields()->GetItem(j)->GetName(); col_names.push_back(name); } return TRUE; } bool CSqlDatas::CheckTable2(vector input_lines, data2 input_data, vector &output_lines)/!<过滤搜索/ { if (input_lines.empty()) return TRUE; _variant_t lineVal; int num = 0; for (int i = 0; i < (int)input_lines.size(); i++) { m_recordPtr->MoveFirst(); m_recordPtr->Move(input_lines[i] - 1); lineVal = m_recordPtr->GetCollect(input_data.ColumnValue); num = m_recordPtr->AbsolutePosition; if (lineVal != input_data.LineValue) continue; output_lines.push_back(num); } if ((int)output_lines.size()<1) return FALSE; return TRUE; } bool CSqlDatas::CollectLimiteDatas(vector inputDates, vector<vector> &outputDatas) { vector inLines, outLines; vector datas; bool BL = TRUE; long row_count = m_recordPtr->RecordCount; for (int i = 1; i <= row_count; i++) inLines.push_back(i); for (int i = 0; i<(int)inputDates.size(); i++) { if (CString(inputDates[i].LineValue) == “”) continue; outLines.clear(); BL = CheckTable2(inLines, inputDates[i], outLines); inLines.clear(); std::copy(outLines.begin(), outLines.end(), std::back_inserter(inLines)); } for (int i = 0; i<(int)outLines.size(); i++) { GetLineDatas(outLines[i], datas); outputDatas.push_back(datas); datas.clear(); } outLines.clear(); return BL; } bool CSqlDatas::AddData(vector LineDatas) { if (LineDatas.empty()) return FALSE; _variant_t varBookmark; try { long count = m_recordPtr->RecordCount; if (count>0) m_recordPtr->MoveLast(); m_recordPtr->AddNew(LineDatas[0].ColumnValue,/LineDatas[0].LineValue/“”); ChangeData(count, LineDatas); } catch (_com_error&e) { AfxMessageBox(e.Description()); return FALSE; } return TRUE; } bool CSqlDatas::AddLine(vector LineDatas) { try { if (m_recordPtr->RecordCount>0) m_recordPtr->MoveLast(); m_recordPtr->AddNew(); for (int i = 0; i<(int)LineDatas.size(); i++) { _variant_t va = LineDatas[i].ColumnValue; _variant_t va2 = LineDatas[i].LineValue; if (va2.vt == VT_BSTR && ((CString)va2) == "") { // 如果是空字符串 则插 //va2 = 'NULL'; // 插入效果是 'NULL'的ASCI码 //va2 = "NULL"; // 插入效果是 'NULL'字符串 //va2 = ""; // 插入效果是 空白 continue; // 直接跳过插才是 为 NULL } if (va2.vt == VT_INT) { m_recordPtr->PutCollect(va, (_variant_t)va2.iVal);// 插入整数 } else { m_recordPtr->PutCollect(va, va2); } } m_recordPtr->Update(); // for 完了 填满了行后在update } catch (_com_error* e) { AfxMessageBox(e->Description()); return false; } return true; } void CSqlDatas::ChangeData(long i, vector datas) { if (datas.empty()) return; m_recordPtr->MoveFirst(); if (i>0) m_recordPtr->Move(i); for (int j = 0; j<(int)datas.size(); j++) { if (CString(datas[j].ColumnValue) == CString(“简图”)) continue; m_recordPtr->Update(datas[j].ColumnValue, datas[j].LineValue); } } void CSqlDatas::DeleteData(int i) { m_recordPtr->MoveFirst(); m_recordPtr->Move(i); m_recordPtr->Delete(adAffectCurrent); } void CSqlDatas::DeleteAll() { long item_num = m_recordPtr->RecordCount; if (item_num == 0) return; m_recordPtr->MoveFirst(); while (!m_recordPtr->adoEOF) { m_recordPtr->Delete(adAffectCurrent); m_recordPtr->MoveNext(); } } void CSqlDatas::TableSort(_bstr_t Criteria) { m_recordPtr->PutSort(Criteria); } bool CSqlDatas::CheckMainColumnVal(data2 cdata) { m_recordPtr->MoveFirst(); while (!m_recordPtr->adoEOF) try { _variant_t valStr = m_recordPtr->GetCollect(cdata.ColumnValue); if (valStr == cdata.LineValue) return FALSE; m_recordPtr->MoveNext(); } catch (_com_error e) { AfxMessageBox(e.Description()); return FALSE; } return TRUE; } void CSqlDatas::CollectComboCtr(_bstr_t typeStr, vector<_variant_t> &ComboStr) { if (m_recordPtr->RecordCount<1) return; m_recordPtr->PutSort(typeStr); m_recordPtr->MoveFirst(); _variant_t valStr1 = NULL; while (!m_recordPtr->adoEOF) { try { _variant_t valStr2 = m_recordPtr->GetCollect(typeStr); if (valStr1 == valStr2 || valStr2.vt == VT_NULL/*||CString(valStr2)==CString("")*/) { m_recordPtr->MoveNext(); continue; } ComboStr.push_back(valStr2); valStr1 = valStr2; } catch (_com_error e) { AfxMessageBox(e.Description()); return; } m_recordPtr->MoveNext(); } }解析代码,每一步都添加注释
最新发布
08-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值