webForumDet fria alternativet

public/pirvate/dim etc

.NET

12 svar · 379 visningar · startad av P

Medlem sedan jan. 20012 204 inlägg
Frågan#1

Vad är skilladen på dessa?
Hittade detta:
Private – callable only by code within our class
Friend – callable only by code within our project/component
Public – callable by code outside our class
Protected – new to VB.NET; we’ll discuss this later when we cover inheritance
Protected Friend – callable only by code within our project/component and by code in our subclasses; we’ll discuss this later when we cover inheritance

Medlem sedan jan. 20012 204 inlägg
#2

skriver något annat här då...

jo har sökt lite på forumet efter "db wrapper" men hittar inget. Vet att det finns! gahh!

Medlem sedan nov. 2002105 inlägg
#3

Private - Kan endast anropas innifrån den klassen den ligger i.
Friend - Kan anropas från hela ditt projekt
Public - Kan anropas från kod utanför (och i) din klass. Kan även anropas via COM+ etc.
Protected - Denna funktion kan endast kommas åt via arv. Dvs. har du en bas-klass med en metod som är Protected kan du endast komma åt metoden genom att först ärva bas-klassen.
Protected Friend - Samma som ovan dock kan hela ditt projekt även anropa den som "vanlig"

Exempel

**********************************
Public

Public Class News
Public sub GetNews()

End Sub
End Class
------------
Annan klass

dim oNews as new News
oNews.GetData
----------
Från .aspx
dim oNews as new News
oNews.GetNew()

***************************
Friend

Public Class News
Friend sub GetNews()

End Sub
End Class

------------
Annan klass

dim oNews as new News
oNews.GetData
----------
Från .aspx
Går inte då denna är friend och inte synlig för omvärlden

********************************
Private

Public Class News
Private sub GetNews()

End Sub
End Class

------------
Annan klass

Går inte då denna endast är synlig för samma klass
----------
Från .aspx
Går inte då denna är Private och endast synlig för den egna klassen

*****************************
Protected

Public Class News
Protected sub GetNews()

End Sub
End Class

------------
Annan klass - ARV

Inherits News

GetNews()

Fungerar!!!!
----------

Annan klass INSTANS
Dim oNews as New News

oNEws.GetData

Fungerar EJ då sub endast är "synlig" via arv
---------------

Från .aspx
Går inte då denna endast är synlig via arv

******************************
Protected Friend

Public Class News
Protected Friend sub GetNews()

End Sub
End Class

------------
Annan klass - ARV

Inherits News

GetNews()

Fungerar!!!!
----------

Annan klass INSTANS
Dim oNews as New News

oNEws.GetData

Fungerar !!!!
---------------
Från .aspx
Går inte då denna endast är synlig via arv eller för det egna projektet.
Medlem sedan jan. 20012 204 inlägg
#4

Tack för en underbar genomgång h0ger. Jag har dock problem med denna kodsnutt:
Ligger i en class med strCnnType definerat till public utanför.

Function RunNonQuery(SqlStatement As String)

            Select Case strCnnType

                Case "Mssql"

                    Dim cmdSqlCommand As New SqlCommand()

                Case "Mysql"

                    Dim cmdSqlCommand As New OdbcCommand()

                Case "Access"

                    Dim cmdSqlCommand As New OleDBCommand()

            End Select

            

            Try

                objCnn.Open()

                cmdSqlCommand = CreateCommand(SqlStatement)

                cmdSqlCommand.ExecuteNonQuery()

            Catch Exp As SqlException

                throw(Exp)

            Finally

                objCnn.Close()

            End Try

            

        End Function

Få felmeddelande vid kompilering att cmdSqlCommand inte är deklarerad :l Kan man inte deklarera på detta sätt?

Medlem sedan apr. 20012 266 inlägg
#5

P skrev:

Tack för en underbar genomgång h0ger. Jag har dock problem med denna kodsnutt:
Ligger i en class med strCnnType definerat till public utanför.

Function RunNonQuery(SqlStatement As String)

            Select Case strCnnType

                Case "Mssql"

                    Dim cmdSqlCommand As New SqlCommand()

                Case "Mysql"

                    Dim cmdSqlCommand As New OdbcCommand()

                Case "Access"

                    Dim cmdSqlCommand As New OleDBCommand()

            End Select

            

            Try

                objCnn.Open()

                cmdSqlCommand = CreateCommand(SqlStatement)

                cmdSqlCommand.ExecuteNonQuery()

            Catch Exp As SqlException

                throw(Exp)

            Finally

                objCnn.Close()

            End Try

            

        End Function

Få felmeddelande vid kompilering att cmdSqlCommand inte är deklarerad :l Kan man inte deklarera på detta sätt?

Testa att declerara den med en form av basclass, alla connection classer implanterar System.Data.IDbConnection. Testa att deklarera cmdSqlCommand som IDbConnection. Har för mig att man ska kunna göra om inte så på ett liknande sätt.

Medlem sedan nov. 2002105 inlägg
#6

Vad som är nytt med VB.NET är att man kan ha statement-specifika variabler. Detta innebär att variabler som deklareras inom ett statement (t.ex. en select case) med Dim blir enbart tillgängliga för detta statement och dör sedan så fort det är avklarat.

Medlem sedan jan. 20012 204 inlägg
#7

gäller samma sak i en if/else sats? Eller kan man använda någon annan form av variabel-deklaration för att få dem publika i "funktionen". Har för mig att detta har disskuterats tidigare men jag hittar inget...

Medlem sedan nov. 2002105 inlägg
#8

Det gäller samma för if/else.

Kan du inte göra en fuling och deklarera objSqlStatement som object på funktionsnivå och sedan tilldela den "rätt" objecttyp i select case?

Typ

dim cmdSqlCommand as Object

select case

case 1
      cmdSqlCommand = New SqlCommand
case 2
     cmdSqlCommand = New OdbcCommand
end select

Vet inte om detta funkar.

Problemet är att du inte kan deklarera cmdSqlCommand som publik i funktionen då du har tre likadana deklarationer.

Vet inte om du kan skapa en cmdSqlCommand property som du sedan överlagrar med korrekt typ. Kan vara värt ett försök.

Medlem sedan mars 20002 836 inlägg
#9

jepp, variabeln måste deklareras utanför .

testa denna:

[b]Private cmdSqlComamnd As IDbCommand[/b]

Function RunNonQuery(SqlStatement As String)

            Select Case strCnnType

                Case "Mssql"

                    cmdSqlCommand = New SqlCommand()

                Case "Mysql"

                    cmdSqlCommand = New OdbcCommand()

                Case "Access"

                    cmdSqlCommand = New OleDBCommand()

		Case Else
			'## -- throw some errors --
            End Select

            

            Try

                objCnn.Open()

                cmdSqlCommand = CreateCommand(SqlStatement)

                cmdSqlCommand.ExecuteNonQuery()

            Catch Exp As SqlException

                throw(Exp)

            Finally

                objCnn.Close()

            End Try

som sagt, koden e otestad

cya,
PatrikB

Medlem sedan nov. 2002105 inlägg
#10

PAtrikB kan du förklara vad IDbCommand är?

Din lösningen är snyggare.

Medlem sedan mars 20002 836 inlägg
#11

Tack!

IdbCommand är ett Interface som är implementerat i alla Dbclasser såsom OleDbCommand, SqlCommand, OdbcCommand, MySqlCommand etc .....
Finns även interface för Connection, IDbConnection etc....

Kika i SDKn .... där förklaras det bättre ... ;)

cya,
PatrikB

Medlem sedan nov. 2002105 inlägg
#12

Ah ok. Det är dags att RTFM för min del

Medlem sedan mars 20002 836 inlägg
#13

... tycker att det är det enda jag gör ... :e ... för minsta grej man vill åstadkomma ... men, förhoppningsvis lossnar det snart ;)

cya,
PatrikB

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)