错误:没有重载函数的实例

时间:2014-02-06 08:29:09

标签: c++ c++-cli

我正在尝试使用以下代码在我的数据库(SQL Server 2008)中插入一些行:

CDB.cpp

#include "CDB.h"

void CDB::ajouterAlerte(){
    SqlConnection      ^ mySQLConnection;
    SqlDataAdapter     ^ myDataAdapter;
    DataSet            ^ myDataSet;
    DataRow            ^ myRow;
    SqlParameter       ^ myParameter;

    try
    {
        mySQLConnection = gcnew SqlConnection("Data Source=NECTARYS-PC;Initial Catalog=MonitoringN;Integrated Security=True;");
        myDataAdapter = gcnew SqlDataAdapter();
        myDataSet = gcnew DataSet();

        // Open up the connection
        mySQLConnection->Open();

        myDataAdapter->SelectCommand = gcnew SqlCommand("select * from Alerte", mySQLConnection);
        myDataAdapter->InsertCommand = gcnew SqlCommand("insert into Alerte (motif,dateAlerte," +
            "fixee,nomPoste,nomApplication,nomFichier,FichierModel_id) values (@motif,@dateAlerte," +
            "@fixee,@nomPoste,@nomApplication,@nomFichier,@FichierModel_id)", mySQLConnection);

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@motif", SqlDbType::VarChar));
        myParameter->SourceColumn = "motif";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@dateAlerte", SqlDbType::VarChar));
        myParameter->SourceColumn = "dateAlerte";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@fixee", SqlDbType::Bit));
        myParameter->SourceColumn = "fixee";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomPoste", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomPoste";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomApplication", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomApplication";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@nomFichier", SqlDbType::VarChar));
        myParameter->SourceColumn = "nomFichier";
        myParameter->SourceVersion = DataRowVersion::Current;

        myParameter = myDataAdapter->InsertCommand->Parameters->Add(
            gcnew SqlParameter("@FichierModel_id", SqlDbType::Int));
        myParameter->SourceColumn = "FichierModel_id";
        myParameter->SourceVersion = DataRowVersion::Current;

        time_t now = time(0);
        tm ltm;
        localtime_s(&ltm, &now);
        std::stringstream str;
        str << ltm.tm_mday
            << "/"
            << 1 + ltm.tm_mon
            << "/"
            << 1900 + ltm.tm_year
            << " "
            << 1 + ltm.tm_hour
            << ":"
            << 1 + ltm.tm_min
            << ":"
            << 1 + ltm.tm_sec;
        String^ dateAjoutSysteme = gcnew System::String(str.str().c_str());

        Boolean fixee = true;

        myDataAdapter->Fill(myDataSet, "Alerte");
        myRow = myDataSet->Tables["Alerte"]->NewRow();
        myRow->ItemArray[0] = "A";
        myRow->ItemArray[1] = dateAjoutSysteme;
        myRow->ItemArray[2] = fixee;
        myRow->ItemArray[3] = "B";
        myRow->ItemArray[4] = "C";
        myRow->ItemArray[5] = "D";
        myRow->ItemArray[6] = NULL;
        myDataSet->Tables["Alerte"]->Rows->Add(myRow);

        //we use insertcommand property for the update.
        myDataAdapter->Update(myDataSet, "Alerte");
    }
    catch (Exception ^ e) {
        Console::Write(e->ToString());
    }
    __finally {
        mySQLConnection->Close();
        system("PAUSE");
    }
}

LISTSTR CDB::getListeAppsMetiers(){

    SqlConnection      ^ mySQLConnection;
    SqlCommand         ^ mySQL;
    SqlDataReader      ^ myReader;
    SqlDataAdapter     ^ myDataAdapter;
    DataSet            ^ myDataSet;
    DataRow            ^ myRow;
    SqlParameter       ^ myParameter;

    LISTSTR::iterator i;
    LISTSTR            listeAppsMetiers;

    try
    {
        mySQLConnection = gcnew SqlConnection("Data Source=NECTARYS-PC;Initial Catalog=MonitoringN;Integrated Security=True;");
        mySQL = gcnew SqlCommand("select * from AppMetier", mySQLConnection);

        mySQLConnection->Open(); // Open up the connection
        myReader = mySQL->ExecuteReader();

        while (myReader->Read())
            listeAppsMetiers.insert(listeAppsMetiers.end(), myReader["chemin"]->ToString()); // the error is marked at the point, just before insert(...

        return listeAppsMetiers;
    }
    catch (Exception ^ e)
    {
        Console::Write(e->ToString());
    }
    __finally
    {
        myReader->Close();
        mySQLConnection->Close();
    }
}

CDB.h

#using <mscorlib.dll>
#using <System.dll>
#using <system.data.dll>
#using <System.Xml.dll>

#pragma warning (disable:4786)
#include <list>
#include <sstream>
#include <time.h>
#include <string>
#include <iostream>
#include <tchar.h>

using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Data::SqlClient;

typedef std::list<std::string> LISTSTR;

class CDB{
    CDB(){} //ctor
    virtual ~CDB(){}

public:
    void ajouterAlerte(){}
    LISTSTR getListeAppsMetiers(){}
};

但是,我在标记的行上有错误,我还没有找到解决方法:

  

没有重载函数的实例“std :: list&lt; _Ty,   _Alloc&gt; :: insert [with _Ty = std :: string,_Alloc = std :: allocator]“匹配参数列表参数类型是:   (标准:: _ List_iterator&GT;&gt;中   System :: String ^)对象类型是:LISTSTR

有什么好主意吗?

1 个答案:

答案 0 :(得分:1)

正如上面的评论中所解释的那样:您正在尝试将insertmyReader["chemin"]->ToString()(属于Microsoft发明的类型String^)添加到正常{{1}的列表中}}秒。 Microsoft std::stringString之间没有隐式转换;你必须明确地进行转换。

幸运的是,有一个CLR库函数可以执行此操作:std::string

marshal_as

本答案中的代码是从@ sriwantha-attanayake对这个类似问题的回答中复制的:https://stackoverflow.com/a/8896629/1424877