问题描述如下:
实现一个通用方法,要求在任意给定的表的情况下,自动生成该表的数据的insert sql语句。
我的想法是:用ADO得到表中字段的名字,字段的类型(这里是不是要做个字段类型转换,把sqlserver的类型转换成程序中的类型?),然后组织成insert语句。不知道我的想法可行吗?请高手指点。

解决方案 »

  1.   

    知道表名:
    #include <conio.h>
    #define PAUSE  printf("\npress any key to exit"); getch();#define _WIN32_DCOM#pragma warning(push)
    #pragma warning(disable:4146)
    #import "e:\program files\common files\system\ado\MSADO15.DLL" no_namespace rename("EOF", "EndOfFile")
    #pragma warning(pop)int main(int argc, char* argv[])
    {
    _ConnectionPtr m_pConn;
    _RecordsetPtr m_pRs;
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    _bstr_t bstrConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
    "Data Source=F:\\lylong\\db1.mdb;Persist Security Info=False";
    try{
    m_pConn.CreateInstance( __uuidof(Connection) );
    m_pRs.CreateInstance( __uuidof(Recordset) );
    m_pConn->Open( bstrConnStr, "", "", adConnectUnspecified );
    m_pRs->Open( "table1", 
    m_pConn.GetInterfacePtr(), adOpenForwardOnly, adLockOptimistic, adCmdTable); long lColumn = m_pRs->Fields->Count;
    printf("%-12s%-10s%-10s\n", "字段名", "长度", "类型");
    for( long i=0; i<lColumn; i++ )
    {
    printf("%-12s%-10d%-10d\n", (char*)m_pRs->Fields->Item[i]->Name, 
    m_pRs->Fields->Item[i]->DefinedSize,
    m_pRs->Fields->Item[i]->Type);
    }

    m_pRs->Close();
    m_pConn->Close();
    }catch( _com_error e )
    {
    printf( "\n%s Error: %ld\r\n"
    "%s\r\n"
    "%s\r\n",
    (char*)e.Source(),
    e.Error(),
    (char*)e.Description(),
    (char*)e.ErrorMessage() );
    m_pRs->Close();
    m_pConn->Close();
    }
    CoUninitialize();
    PAUSE;
    return 0;
    }
    --------------------------------
    _RecordsetPtr m_pRs;
    _variant_t vFieldName;
    for(int I=0; I<m_pRecordset->Fields->Count; I++)
    {
      vFieldName=m_pRecordset->Fields->GetItem((long)intI)->Name;
      CString str=vFieldName.bstrVal;
    }
    -------------------------------------
    int iCols=m_pRecordset->Fields->GetCount();
    _variant_t vardata;
    vardata.vt=VT_I4;
    vardata.iVal=iCols;
    for(vardata.iVal=0;vardata.iVal<iCols;vardata.iVal++)
    {
    _bstr_t bstrCols=m_pRecordset->Fields->GetItem(vardata.iVal)->GetName();
    MessageBox(bstrCols);
    }
    -------------------------
    _bstr_t   mStrSQL;
    CString   strColName;
    BSTR      bstrColName;
    long      ColCount,i; 
    Field *   field = NULL;
    HRESULT   hr;
    Fields *  fields = NULL;
    LPCTSTR   nameField;

    //打开记录集,得到字段名,并将字段名信息添加到ListBox中mStrSQL = "SELECT * FROM Images";m_pRecordset->Open(mStrSQL,               
    m_pConnection.GetInterfacePtr(),  
    adOpenDynamic,
    adLockOptimistic,
    adCmdText);

    hr = m_pRecordset->get_Fields (&fields); //得到记录集的字段集和
     
    if(SUCCEEDED(hr)) 
        fields->get_Count(&ColCount); //得到记录集的字段集合中的字段的总个数 for(i=0;i<ColCount;i++)
    {
    fields->Item[i]->get_Name(&bstrColName); //得到记录集//中的字段名
    strColName=bstrColName;
    nameField = strColName;
    m_FieldsList.AddString(nameField);
    } if(SUCCEEDED(hr))
    fields->Release();//释放指针
      

  2.   

    本来就是这样的么,说白了就是先把sql用CString类型拼出来,然后调用,可以找点这方面的例子看看。
      

  3.   

    http://www.vckbase.com/document/finddoc.asp