//存储数据到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秒向数据库插入纪录,程序运行几个小时就出错。
不知道是哪出问题,希望各位帮忙看下,谢谢!

解决方案 »

  1.   

    m_psafe = SafeArrayCreate(VT_UI1,1,&m_band);
    这里一次性分配了4GB的空间?!机器肯定受不了.
    SafeArrayDestroy销毁分配的内存看看.
    在 Field 对象上的第一个 AppendChunk 调用将数据写入字段,覆盖任何现有的数据,随后的 AppendChunk 调用则添加到现有数据。如果将数据追加到一个字段,然后设置或读取当前记录中另一个字段的值,ADO 则认为已将数据追加到第一个字段。如果在第一个字段上再次调用 AppendChunk 方法,那么 ADO 将调用解释为新的 AppendChunk 操作并覆盖现有数据。访问其他 Recordset 对象(并非第一个 Recordset 对象的复制品)中的字段将不会破坏 AppendChunk 操作。
      

  2.   

    不是,一下分配4GB的空间,是每次120KB数据到数据库,
    当数据库数据达到4GB的时候,再插入就错误了,
    是不是代码有问题。
      

  3.   

    曾经在一台WINDOW2003的8GB内存的服务器上测试过SQL SERVER2005,到200多MB的时候update就会出错了.要不分开存储,自己分包,建一个资源表,原来存储的地方改成存放指向资源表的索引就行.
      

  4.   

    比如说要存储1GB的文件,分成5份,一份大概200MB,存储后的索引是1,2,3,4,5,下次读取的时候在组包.
      

  5.   

    你在SQL SERVER2005中给该数据库预留6G空间,看看。
      

  6.   

    sql2000 
    能存那么大的字段吗?
    还是我孤陋寡闻?
      

  7.   

    你自己看了没?
    是每6秒向数据库插入120K的数据。
    当数据库容量达到4GB的时候,就出先问题?
    是不是代码问题
      

  8.   

    理解有误,感觉不是程序的问题,应该是数据库问题,像LS提过的看数据库mdf和ldf文件所在分区是否是NTFS,数据库是否支持这么大的数据库文件,换成版本高一些的数据库试试.
      

  9.   

    我用的时SQL2000 开发版,是NTFS格式。你说数据库存贮100G有问题吗?
      

  10.   


    SQL2000一样,你也得给该数据库预先设置空间。
      

  11.   

    数据大概存贮一年估计250GB。
    那预留250GB?
      

  12.   

    你难道没听说过SQLServer能分文件组么?
      

  13.   


    默认是自动增长,不过在通过VC操作时,是否能正确增长呢?所以我让你先给6G试试。
      

  14.   

    我先改成15G,真正数据要200G,看样要改成200G。