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

4

我正在尝试使用以下代码将一些行插入我的数据库(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<_Ty,_Alloc> ::insert [with _Ty = std :: string,_Alloc = std :: allocator]”与参数列表匹配,参数类型为: (std :: _List_iterator >>, System :: String ^)对象类型为:LISTSTR

有什么好的想法吗?


你需要将 String^ 转换为 std::string。请看这里:https://dev59.com/W3NA5IYBdhLWcg3wdtz5 - Alex F
2
@AlexFarber,感谢您的回复,但我需要转换什么? - Lucie kulza
myReader["chemin"]->ToString()String^,你需要 std::string - Alex F
2
是的,就是这样。非常感谢。请提供一个答案来解决这个主题。 - Lucie kulza
1个回答

1
如上面的评论中所解释的那样:您正在尝试将类型为 Microsoft 发明的 String^ 的值 myReader["chemin"]->ToString() 插入到普通的 std::string 列表中。Microsoft Stringstd::string 之间没有隐式转换;您需要显式地进行转换。
幸运的是,CLR 库有一个函数可以做到这一点:marshal_as
#include <msclr/marshal_cppstd.h>

...

while (myReader->Read()) {
    listeAppsMetiers.insert(
        listeAppsMetiers.end(),
        msclr::interop::marshal_as<std::string>( myReader["chemin"]->ToString() ));
}

这个答案中的代码是从@sriwantha-attanayake在类似问题上的答案复制而来:https://dev59.com/W3NA5IYBdhLWcg3wdtz5#8896629

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接