//存储数据到SQL2000
void CMainChartShow::StorageData(BYTE * pByte,unsigned int DataLen,int Channel)
{
//2010-8-3 17:58:28 时间格式strChannel
char today[32] ="";
char second[32] ="";
tm *temptm;
time_t temptime;
//读取时间函数{{
temptime= time(0);
temptm = localtime(&temptime);
sprintf(today,"%02d-%02d-%02d",temptm->tm_year+1900,temptm->tm_mon+1,temptm->tm_mday);
sprintf(second,"%02d:%02d:%02d",temptm->tm_hour,temptm->tm_min,temptm->tm_sec);
CString str;
str.Format("%s %s",today,second);
CString strChannel;
//strSQL.Format(_T("select RecordDate,Channel,TempValue from History_Record"));
//////////////////////////////////////////////////////////////////////////
CoInitialize(NULL);
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
try
{
m_pConnection.CreateInstance("ADODB.Connection");
CString strConnect="Provider=SQLOLEDB.1;Password=; \
Persist Security Info=True;User ID=sa;Initial Catalog=ampacityData";
m_pConnection->Open((_bstr_t)strConnect,"","",adModeUnknown);
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
}
m_pRecordset.CreateInstance(__uuidof(Recordset));// picture
m_pRecordset->Open("select * from History_Record",m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockOptimistic,adCmdText);
try
{
m_pRecordset->AddNew();//添加新行
VARIANT m_bitdata;
m_bitdata.vt = VT_ARRAY|VT_UI1;
SAFEARRAY * m_psafe;
SAFEARRAYBOUND m_band;
m_band.cElements = DataLen;
m_band.lLbound = 0;
m_psafe = SafeArrayCreate(VT_UI1,1,&m_band);
for(long i=0; i < (long)DataLen ; i++)
{
SafeArrayPutElement(m_psafe,&i,pByte++);//m_bitbuffer
}
m_bitdata.parray = m_psafe;
CString strChannel;
strChannel.Format("%d",Channel);
m_pRecordset->GetFields()->GetItem("RecordDate")->Value = (_bstr_t)str;
m_pRecordset->GetFields()->GetItem("Channel")->Value = (_bstr_t)strChannel;
m_pRecordset->GetFields()->GetItem("TempValue")->AppendChunk(&m_bitdata);
///////////////////////////*************************
// SafeArrayDestroy(m_psafe);
VariantClear(&m_bitdata);//注意防止内存泄露**********
/////}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
m_pRecordset->Update();
}
catch(...)
{
//MessageBox("操作失败");
return;
}
m_pRecordset->Close();
m_pConnection->Close();
m_pRecordset.Release();
m_pConnection.Release();
CoUninitialize();
}
上面是代码,
主要问题:当数据库纪录有4GB数据时,每6秒向数据库插入纪录,程序运行几个小时就出错。
不知道是哪出问题,希望各位帮忙看下,谢谢!
这里一次性分配了4GB的空间?!机器肯定受不了.
SafeArrayDestroy销毁分配的内存看看.
在 Field 对象上的第一个 AppendChunk 调用将数据写入字段,覆盖任何现有的数据,随后的 AppendChunk 调用则添加到现有数据。如果将数据追加到一个字段,然后设置或读取当前记录中另一个字段的值,ADO 则认为已将数据追加到第一个字段。如果在第一个字段上再次调用 AppendChunk 方法,那么 ADO 将调用解释为新的 AppendChunk 操作并覆盖现有数据。访问其他 Recordset 对象(并非第一个 Recordset 对象的复制品)中的字段将不会破坏 AppendChunk 操作。
当数据库数据达到4GB的时候,再插入就错误了,
是不是代码有问题。
能存那么大的字段吗?
还是我孤陋寡闻?
是每6秒向数据库插入120K的数据。
当数据库容量达到4GB的时候,就出先问题?
是不是代码问题
SQL2000一样,你也得给该数据库预先设置空间。
那预留250GB?
默认是自动增长,不过在通过VC操作时,是否能正确增长呢?所以我让你先给6G试试。