webForumDet fria alternativet

Skiktas lösning hur lösa sql parameters

.NET

14 svar · 464 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Frågan#1

Hej!
Sitter å pillar med en lite skiktad lösning och har kommit till punkten då jag inte vet, lyckas klura ut hur jag ska lösa det på ett bra sätt.

ni kan se hur mina 3 lager ser ut i denna fil
http://www.webforum.nu/attachment.php?s=&postid=534095

Jag ska nu försöka skapa en insert med sql parameters och kan inte riktigt förstå hur. Jag lägger ju mina sqlfrågor i lagret "businessDataLayerForums" och det är där jag ska lägga till mina sqlparameters.

Själva exekveringen av sqlfrågan ligger i dataAccessLayer och ser ut så här

Function ExecuteNonQuery(strSQL As String)
            Try
                objCnn.Open()
                Dim SqlCommand as SqlCommand = CreateSQLCommand(strSQL)
                SqlCommand.ExecuteNonQuery()
            Catch Exp As SqlException
                Throw(Exp)
            Finally
                objCnn.Close()
		objCnn.Dispose()
		objCnn = Nothing
            End Try
        End Function

Jag ser inte hur jag ska skriva parametrarna i "businessDataLayerForums" klassen då jag måste skapa tex ett sqlcommand för att lägga till parametrarna.

Det är alltså detta jag vill göra i "businessDataLayerForums" klassen, någon som fattar vad jag menar ?

Tacksam

Medlem sedan jan. 20012 204 inlägg
#2

- :P :P :P

Medlem sedan dec. 19996 522 inlägg
#3

Tack p men..Nej det är inte det jag vill göra...svårt att förklara detta när man är nybörjare.

Kolla här

1.i asp sidan har jag ett forumlär med dvs textfält

2.trycker jag på knappen i forumläret körs

Dim ForumId As Integer = Request.Querystring("IntForumId")
Dim UsrId As Integer = Request.Cookies("UsrInformation")("UsrId")
Dim TopicHeader As String = TpHeader.Text
Dim TopicContent As String = TpContent.Text

Dim objLayerForum as businessLayerForums = New businessLayerForums 
objLayerForum.PostNewTopic(ForumId,UsrId,TopicHeader,TopicContent)
objLayerForum = Nothing

Den ser ut på följande sätt i "businessLayerForums"

Public Function PostNewTopic(ForumId As Integer,UsrId As Integer, TopicHeader As String, TopicContent As String)
Dim objBusinessL as businessDataLayerForums = New businessDataLayerForums
Return objBusinessL.PostTopic(ForumId,UsrId,TopicHeader,TopicContent)
objBusinessL = Nothing
End Function

i klassen businessDataLayerForums körs då funktionen "PostTopic", det är här jag ska skapa mina sqlparametrar

Den ska se ut något liknande detta

Function PostNewTopic(ForumId As Integer,UsrId As Integer, TopicHeader As String, TopicContent As String)
Dim strSQL As String = String.Format("INSERT INTO LL_forumTopics (Fk_ForumId,Fk_UsrId,TopicHeader,TopicContent) VALUES (@ForumId,@UsrId,@Header,@Content)")

Här måste jag skapa ett SqlCommand 

SqlCommand.Parameters.Add("@ForumId", ForumId)
SqlCommand.Parameters.Add("@UsrId", UsrId)
SqlCommand.Parameters.Add("@Header", TopicHeader)
SqlCommand.Parameters.Add("@Content", TopicContent)

Här måste jag skicka in min nu färdiga sqlfråga till function ExecuteNonQuery i dataAccessLayer, genom att köra 

ExecuteNonQuery (strSQL)
End Function

Problemet är att jag inte lyckas skapa någon sqlcommand från min funktion CreateSQLCommand och vet inte om jag är på rätt väg ens :(

Medlem sedan nov. 2002105 inlägg
#4

Ett förslag är följande:

I ditt businessDataLayerForum lägger du denna kod

        Dim params As New Collection()
        Dim param As SqlParameter

        param = New SqlParameter("@UserID", strUserID)
        params.Add(param)
        param = New SqlParameter("@Pwd", strUserPwd)
        params.Add(param)
        
        ExecuteNonQuery(sqlstatement, params)

I din ExecuteNonQuery lägger du följande kod

.....
   objCnn.Open()
   Dim SqlCommand as SqlCommand = CreateSQLCommand   (strSQL)
   For Each param In sqlParameters
     SqlCommand.Parameters.Add(param)
   Next
   SqlCommand.ExecuteNonQuery()
.....

Hoppas detta hjälper dig

Medlem sedan dec. 19996 522 inlägg
#5

Tack Holger, det där ser ju ut att vara en smidig sätt att lösa det på, jag stöter dock på problem. Jag ska nu bara göra ett test för att se om det fungerar bra

Jag har

Public Function InsertNewTopic(ForumId As Integer)
	Dim strSQL As String = String.Format("INSERT INTO LL_forumTopics (Fk_ForumId) VALUES (@IntForumId)")
	Dim params As New Collection()
	Dim param As SqlParameter

	param = New SqlParameter("@IntForumId", ForumId)
	params.Add(param)       
	ExecuteNonQuerySQLparams(strSQL, params)
End Function

och jag har problem att få det att fungera i funktionen "ExecuteNonQuerySQLparams" i dataaccesslagret.

Jag vet itne riktigt vad jag ska deklarara params som, så här ser det ut nu, men det funkar inte eftersom jag inte har deklarerat vad params samt sqlparameters är.

Public Function ExecuteNonQuerySQLparams(strSQL As String,sqlParameters As ????)
	Try
		objCnn.Open()
		Dim SqlCommand as SqlCommand = CreateSQLCommand(strSQL)
		Param = ?????
		For Each param In sqlParameters
			SqlCommand.Parameters.Add(param)
		Next
		SqlCommand.ExecuteNonQuery()
  
	Catch Exp As SqlException
		Throw(Exp)
    Finally
		objCnn.Close()
		objCnn.Dispose()
		objCnn = Nothing
    End Try
End Function

Stort tack till den som vet lösningen på detta delikata problem, tacksam.

Medlem sedan nov. 2002105 inlägg
#6
ExecuteNonQuerySQLparams(strSQL As String, ByVal sqlParameters As Collection)
Medlem sedan dec. 19996 522 inlägg
#7

Tack hOlger, ett steg närmare en lösning, jag har nu denna lilla puckade kodsnutt

Function ExecuteNonQuerySQLparams(strSQL As String,ByVal sqlParameters As Collection)
	    Try
		objCnn.Open()
		Dim SqlCommand as SqlCommand = CreateSQLCommand(strSQL)	
                For Each param In sqlParameters
 		   SqlCommand.Parameters.Add(param)
		Next
		SqlCommand.ExecuteNonQuery()
	    Catch Exp As SqlException
		Throw(Exp)
	    Finally
		objCnn.Close()
		objCnn.Dispose()
		objCnn = Nothing
	    End Try
	End Function

När jag försöker kompilera den säger den "Name Param is not declared"

For each **param** in SQLparameters

Jag tror man ska göra så här

Dim Param As SqlParameter
och sedan.....
For Each param In sqlParameters
osv.

Men då får jag felmeddelandet "Type Collection is not defined" på raden

ExecuteNonQuerySQLparams(strSQL As String, ByVal sqlParameters As Collection)

när jag ska kompilera den.

Överst på vbfilen jag ska kompilera importerar jag System.Collections vilket jag antar att man ska göra. Man får inte ge upp :)

Medlem sedan nov. 2002105 inlägg
#8

sqlParameters är av typen system.visualbasic.collection och inte system.collections.

Prova att ta bort importen. Du behöver nog inte importera nåt annat.

Medlem sedan dec. 19996 522 inlägg
#9

Tack för hjälpen holger, det låg dock i Microsoft.visualbasic

Nu fungerar det perfekt, ska bara bygga in lite felhantering i parametrarna man skickar in i funktionen. Någon kan ju kolla på den och säga om de har något att tillägga.

I mitt dataAccessLayer har jag en funktion som ser ut på följande sätt

Public Function ExecuteNonQuerySQLparams(strSQL As String,ByVal sqlParameters As Collection)
	    Try
		objCnn.Open()
		Dim SqlCommand as SqlCommand = CreateSQLCommand(strSQL)	
		Dim Param As SqlParameter
                For Each param In sqlParameters
 		   SqlCommand.Parameters.Add(param)
		Next
		SqlCommand.ExecuteNonQuery()
	    Catch Exp As SqlException
		Throw(Exp)
	    Finally
		objCnn.Close()
		objCnn.Dispose()
		objCnn = Nothing
	    End Try
	End Function

Sen i min businessDataLayerForums klass följande

Public Function InsertNewTopic(ForumId As Integer,UsrId As Integer,TopicHeader As String,TopicContent As String)
		Dim strSQL As String = String.Format("INSERT INTO LL_forumTopics (Fk_ForumId,Fk_UsrId,TopicHeader,TopicContent) VALUES (@IntForumId,@IntUsrId,@strHeader,@strContent)")		
		Dim Params As New Collection()
        Dim Param As SqlParameter
		
 		Param = New SqlParameter("@IntForumId", ForumId)
        Params.Add(Param)	
		Param = New SqlParameter("@IntUsrId",UsrId)
		Params.Add(Param)
		Param = New SqlParameter("@strHeader",TopicHeader)
		Params.Add(Param)
		Param = New SqlParameter("@strContent",TopicContent)
		Params.Add(Param)

		ExecuteNonQuerySQLparams(strSQL,Params)
	End Function

sen i businessLayerForums klassen

Public Function PostNewTopic(ForumId As Integer,UsrId As Integer,TopicHeader As String,TopicContent As String)
		Dim objBusinessL as businessDataLayerForums = New businessDataLayerForums
		objBusinessL.InsertNewTopic(ForumId,UsrId,TopicHeader,TopicContent)
		objBusinessL = Nothing
	End Function

och sist i aspx filen

Sub PostNewTopic(sender As Object, e As System.Web.UI.ImageClickEventArgs)
	Dim IntForumId As Integer = Request.Querystring("IntForumId")
	Dim IntUsrId As Integer = Request.Cookies("UsrInformation")("UsrId")
	Dim strTopic As String = txtBoxTopicFraga.Text
	Dim strHeader As String = txtBoxHeaderFraga.Text
	Dim objLayerForum as businessLayerForums = New businessLayerForums 
	objLayerForum.PostNewTopic(IntForumId,IntUsrId,strHeader,strTopic)
	objLayerForum = Nothing
End Sub

Stort tack för all hjälp Holger, någon som har några synpunker?

Medlem sedan nov. 2002105 inlägg
#10

Det är så vackert... :bire

Medlem sedan mars 20002 836 inlägg
#11

sen i businessLayerForums klassen

kod:--------------------------------------------------------------------------------
Public Function PostNewTopic(ForumId As Integer,UsrId As Integer,TopicHeader As String,TopicContent As String)
Dim objBusinessL as businessDataLayerForums = New businessDataLayerForums
objBusinessL.InsertNewTopic(ForumId,UsrId,TopicHeader,TopicContent)
objBusinessL = Nothing
End Function
--------------------------------------------------------------------------------

varför ha en funktion som inte returnerar ngt???

Likadant med metoden InsertNewTopic

Personligen, beroende på projekt, så skulle jag se till att antingen returnera True/False beroende på lyckad insättning eller inte eller oxå returnera en Long. -1 för icke lyckad och vid lyckad returnera unika id.

Annars ser det ju bra ut :e

En fråga till h0lger.
Varför använda sig av Collections från Microsoft.VisualBasic när det går lika bra med en ArrayList.

Har läst någonstans att namespacet för VisualBasic finns med för att förenkla övergången till .NET från vb6 och att rekomendationerna ligger i att inte använda sig av Microsoft.VisualBasic namespacet. Rätta mig om jag har fel......

cya,
PatrikB

Medlem sedan jan. 20012 204 inlägg
#12

:e

Dim objBusinessL as businessDataLayerForums = New businessDataLayerForums

Jag skulle fördra ett kortare namn typ:

Dim objBL as wfBDL = New wfBDL

eller dylikt då wf = webforum och står för projektnamnet!

Medlem sedan apr. 20012 266 inlägg
#13

PatrikB skrev:

En fråga till h0lger.
Varför använda sig av Collections från Microsoft.VisualBasic när det går lika bra med en ArrayList.

Kan även använda denna, helt ok System.Data.IDataParameter.

Medlem sedan nov. 2002105 inlägg
#14

Det är en smaksak vad man vill använda. Funkar precis lika bra med en ArrayList.

Medlem sedan maj 20012 812 inlägg
#15

*kod:--------------------------------------------------------------------------------
Dim objBusinessL as businessDataLayerForums = New businessDataLayerForums
--------------------------------------------------------------------------------

Jag skulle fördra ett kortare namn typ:

kod:--------------------------------------------------------------------------------
Dim objBL as wfBDL = New wfBDL*

Idag och imorgon är det inga problem, men kolla på din kod igenom om ett halvår och du kommer att fundera över vad wfBDL är för något.

Det är alltid bättre ur användarvänlighet att skriva ut långaförklarande namn på sina objekt och variabler, ännu mer uppskattat är det om någon annan kommer att få ta över din kod och fortsätta bygga på den.

Med hjälp av Intellisens så spelar det inte så stor roll att man har långa namn, man måste ju bara skriva dem 1 gång, sedan plockar man dem från listan. Så själv ser jag absolut ingen anledning till att förkorta objekt och variabelnamn.

Om man inte vill skriva ut allt så kan man använda sig av prefix istället för typ stringNamn så skriver man sName eller istället för objectSQLConnection så skriver man oSQLConnection. Då vet man även vilken typ som din variabel är av om man inte orkar titta i declarationenssatsen. :)

- M

mina små 5 ören...

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