Не удается получить доступ к общедоступному статическому методу

у меня есть этот класс

#pragma once
namespace CMT{
namespace sql=System::Data::SqlClient;
public ref class db
{
public:db(void){}
public: static sql::SqlConnection SC(){
            System::String cstring="data source=192.168.0.139\\cedfit; "+
                "initial catalog=cedfitdb; user id=client; password=cedfit";
            sql::SqlConnection sc=new sql::SqlConnection(cstring);
            return sc;
        }

};
}

Теперь, когда я перехожу к событию загрузки формы 1, я не могу получить доступ к методу SC() моей БД, почему?

Я также попытался сделать в событии загрузки form1 этот код:

System::Data::SqlConnection mycon=db::SC();
mycon.Open();//I also tried mycon->Open() and mycon::Open()

Почему это не работает? Почему программа не может распознать «Открыть()»? Кроме того, когда я помещаю #include "db.h" в CMT.cpp, он говорит, что cannot covert from System::Data::Sqlclient::SqlConnection to int я уверен, что возвращаю SqlConnection, но почему?


person user1625766    schedule 16.08.2013    source источник
comment
Не могли бы вы сделать правильный отступ в коде и обновить вопрос?   -  person Vivek Jain    schedule 16.08.2013
comment
Ничего, если я загружу все решение?   -  person user1625766    schedule 16.08.2013
comment
@ user1625766 не обязательно. Но вы должны уточнить, какой диалект C++ вы используете. Это похоже на C++/CLI, но может быть и на C++/CX.   -  person PeterT    schedule 16.08.2013


Ответы (1)


У вас много ошибок при попытке использовать ссылочные типы в .NET framework через C++/CLI.

-- Вам нужно использовать ^ при обращении к ссылочным типам .NET в C++/CLI. Также при выделении памяти для ссылочных типов нужно использовать gcnew вместо new. См. изменения ниже:

static sql::SqlConnection^ SC()
{
    System::String^ cstring = "data source=" + "asdfasdf";
    sql::SqlConnection^ sc = gcnew sql::SqlConnection(cstring);

    return sc;
}

-- Это снова проблема при попытке использовать метод в вашем коде. Кроме того, вы не указали правильное пространство имен для SqlConnection, а также CMT::db::SC.

int main(array<System::String ^> ^args)
{
    System::Data::SqlClient::SqlConnection^ mycon = CMT::db::SC();
    mycon->Open();

    return 0;
}

Кроме того, есть ли особая причина, по которой вам нужен C++/CLI вместо C#? Конечно, есть случаи, когда C++/CLI полезен, но он также может быть излишне сложным, если вы не пытаетесь взаимодействовать с собственным кодом. Просто мысль.

Полный код:

db.h

#pragma once

namespace CMT {
namespace sql = System::Data::SqlClient;

ref class db
{
public:

    db(void)
    {
    }

    static sql::SqlConnection^ SC()
    {
        System::String^ cstring = "whatever";
        sql::SqlConnection^ sc = gcnew sql::SqlConnection(cstring);

        return sc;
    }

};

}

Main.cpp

// ConsoleApplication1.cpp : main project file.

#include "stdafx.h"
#include "db.h"

using namespace System;

int main(array<System::String ^> ^args)
{
    System::Data::SqlClient::SqlConnection^ mycon = CMT::db::SC();
    mycon->Open();

    return 0;
}
person Inisheer    schedule 16.08.2013
comment
1›c:\users\sherwin\desktop\cmt\cmt\Form1.h(73): ошибка C2039: «SC»: не является членом «CMT» 1›c:\users\sherwin\desktop\cmt\ cmt\Form1.h(73): ошибка C3861: «SC»: идентификатор не найден CMT — 3 ошибки, 0 предупреждений ========== Сборка: 0 успешно, 1 не удалось, 0 обновлено, 0 пропущено ========== - person user1625766; 16.08.2013
comment
@user1625766 user1625766 вы включили соответствующий файл *.h? - person PeterT; 16.08.2013
comment
да, я поместил #include db.h в CMT.cpp - person user1625766; 16.08.2013
comment
@user1625766 user1625766, а ты поместил его в Form1.h или где-нибудь еще, где ты его использовал? Не говоря уже о том, что @Inisheer отредактировал его, объявив его в правильном пространстве имен в db.h? - person PeterT; 16.08.2013
comment
Работает :) Большое спасибо. (Я родом из С#, поэтому я не могу правильно использовать С++) Еще один вопрос: есть ли способ поместить все заголовки #include db.h в один файл вместо того, чтобы вставлять в каждой форме окна? Потому что у меня здесь 7 форм - person user1625766; 16.08.2013
comment
@user1625766 предварительно скомпилированные заголовки. Но вам не нужно включать его в большинство других файлов .h, если вы используете только ссылку на тип, который вы должны обойти предварительным объявлением, и включать .h только в реализацию (предположительно Form1.cpp). Опять же, чтобы повторить мнение @Inisheers, есть ли веская причина, по которой вы используете C++/CLI? - person PeterT; 16.08.2013
comment
@ user1625766 Как сказал PeterT, вы должны иметь возможность поместить #include db.h в файл stdafx.h, и он будет автоматически включен в ваши формы. - person Inisheer; 16.08.2013