【问题标题】:Error : no instance of overloaded function错误:没有重载函数的实例
【发布时间】:2014-02-06 08:29:09
【问题描述】:

我正在尝试使用以下代码在我的数据库 (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。看这里:stackoverflow.com/questions/946813/…
  • @AlexFarber,感谢您的回复,但我需要转换什么?
  • myReader["chemin"]-&gt;ToString()String^,你需要std::string
  • 是的,就是这样。非常感谢你。请回答以解决此主题。

标签: c++ c++-cli


【解决方案1】:

正如上面 cmets 中所解释的:您正在尝试将值 myReader["chemin"]-&gt;ToString()(属于 Microsoft 发明的类型 String^)添加到正常的 std::strings 列表中。微软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://stackoverflow.com/a/8896629/1424877

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多