ไม่สามารถเข้าถึงวิธีสาธารณะแบบคงที่

ฉันมีชั้นเรียนนี้

#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() ของ db ได้เพราะเหตุใด

ฉันยังพยายามสร้างเหตุการณ์โหลด form1 รหัสนี้:

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

ทำไมมันไม่ทำงาน? เหตุใดโปรแกรมจึงไม่รู้จัก "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': ไม่พบตัวระบุ 1>บันทึกการสร้างถูกบันทึกไว้ที่ file://c:\Users\SHERWIN\Desktop\CMT\CMT\Debug\BuildLog.htm 1› CMT - 3 ข้อผิดพลาด, 0 คำเตือน ========== สร้าง: 0 สำเร็จ, 1 ล้มเหลว, 0 อัปเดต, 0 ข้ามไป ========== - person user1625766; 16.08.2013
comment
@ user1625766 คุณได้รวมไฟล์ *.h ที่เกี่ยวข้องไว้ด้วยหรือไม่ - person PeterT; 16.08.2013
comment
ใช่แล้ว ฉันใส่ #include db.h ไว้ใน CMT.cpp แล้ว - person user1625766; 16.08.2013
comment
@ user1625766 และคุณใส่มันไว้ใน Form1.h หรือเคยใช้มันที่ไหน? ไม่ต้องพูดถึงเช่น @Inisheer แก้ไขโดยประกาศในเนมสเปซที่ถูกต้องใน db.h? - person PeterT; 16.08.2013
comment
ใช้งานได้ :) ขอบคุณมาก (เดิมทีฉันมาจาก c# นั่นคือสาเหตุที่ฉันไม่สามารถใช้ c++ ได้อย่างถูกต้อง) อีกคำถามหนึ่งคือมีวิธีใดที่ฉันสามารถใส่ส่วนหัว #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