webForumDet fria alternativet

problem med uppdatering

42 svar · 698 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

Har denna koden

Sub datagrid1_update(sender As Object, E As datagridCommandEventargs)
			
			Dim tblaga as textbox=  E.Item.FindControl("tblag_a")
			Dim laga As String = tblaga.Text
			Dim tblagb as textbox=  E.Item.FindControl("tblag_b")
			Dim lagb As String = tblagb.Text
			Dim tbresultata as textbox=  E.Item.FindControl("tbresultata")
			Dim resultata As String = tbresultata.Text
			Dim tbresultatb as textbox=  E.Item.FindControl("tbresultatb")
			Dim resultatb As String = tbresultatb.Text
			Dim tbtid as textbox=  E.Item.FindControl("tbtid")
			Dim tid As String = tbtid.Text
			Dim tbdag as textbox=  E.Item.FindControl("tbdag")
			Dim dag As String = tbdag.Text
			dim id as integer = Datagrid1.DataKeys(CType(E.Item.ItemIndex, Integer))
			dim objcmd1 as new oledbcommand _
             ("select id, lagid_a, lagid_b, resultat_a, resultat_b from matcher where id=" + id +"", objconn)
			
			dim dr as OleDbdatareader
			objconn.open
			dr =objcmd1.executereader
			while dr.read()
				dim lag1 as integer = dr("lagid_a")
				dim lag2 as integer = dr("lagid_b")
					if dr("resultat_a") =resultata and dr("resultat_b") = resultatb then
						dim strsql as string ="update matcher set dag='" + dag +"',tid='" + tid +"', lagid_a="+ lag1 +",lagid_b="+ lag2 +" where id=" +id +""
						dim objcmd as new oledbcommand(strsql, objconn)

						objcmd.connection.open()
						objcmd.executenonquery()
						objcmd.connection.close()
						datagrid1.Edititemindex =-1
						datagrid1.databind()
					else
						dim strsql1 as string ="update matcher set Resultat_a=" + resultata +",Resultat_b=" + resultatb +", uppdaterad=true where id=" +id +""
						dim objcmd2 as new oledbcommand(strsql1, objconn)

						objcmd2.connection.open()
						objcmd2.executenonquery()
						objcmd2.connection.close()
						datagrid1.Edititemindex =-1
						datagrid1.databind()
					end if
			end while
			objconn.close
			
    End Sub

Får detta felmeddalndet:
System.FormatException: Input string was not in a correct format

renholmMedlem sedan apr. 20012 266 inlägg
#2

Vilken rad?

EkströmMedlem sedan feb. 20022 594 inlägg
#3

Dessa prylar:

 +""

gör ingenting i slutet på dina SQL-satser. Misstänker dock att det inte har något med problemet att göra.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#4

rad 52

dim objcmd1 as new oledbcommand _
PMedlem sedan jan. 20012 204 inlägg
#5

vet inte om det är hela koden du visar men jag hittar inte att du dimar objconn någonstans

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#6

Objconn finns med längr upp i koden så det är inte det som är fel.

tar jag bort if satsen och bara gör en vanlig update fungerar det.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#7

problemet verkar ligga i where id=" + id +" för när jag skriver where id=1 fungerar det.

Dessa prylar:

+""

gör ingenting i slutet på dina SQL-satser. Misstänker dock att det inte har något med problemet att göra.

Jag får felmeddelande om jag tar bort dom

fredrikMedlem sedan dec. 19991 072 inlägg
#8

Prova att bygga ihop strängen med string.format istället:

Dim strsql1 As String = String.Format("update matcher set Resultat_a={0},Resultat_b={1},uppdaterad=true where id={2}", resultata, resultatb, id)

Bör ju bli samma resultat, men kolla annars vad strSql1 innehåller och om den ser rätt ut.

Prova isf. att köra resultatet direkt i QA (för SQLserver) eller som en fråga i Access.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#9

Provade att köra en fråga i access och då fungerade det.

Problemet är att den klagar på alla rader där jag har med where id=" + id +"

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#10
Dim strsql1 As String = String.Format("update matcher set Resultat_a={0},Resultat_b={1},uppdaterad=true where id={2}", resultata, resultatb, id)

Detta fungerade.
Kan jag göra likadant med en select?

NETworkMedlem sedan juni 20011 732 inlägg
#11

andreas_lindh skrev:

Provade att köra en fråga i access och då fungerade det.

Problemet är att den klagar på alla rader där jag har med where id=" + id +"

Japp, det går bra! Jag tycker dock det verkar konstigt att det inte fungerar på det andra sättet också. Exakt vad innehåller "id", har du provat att skriva ut det? Är det inte möjligt att den skriver ut ett id som inte finns? Jag menar, om det fungerar om du skriver id=1 men inte id=" + id så MÅSTE det vara något lustigt med variabeln...

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#12

När jag skriver ut id med response.write får jag ett id som finns i databasen.

Hur ska select satsen se ut med string.format ?

fredrikMedlem sedan dec. 19991 072 inlägg
#13

I ditt fall typ:

Dim strSQL as String= String.Format("select id, lagid_a, lagid_b, resultat_a, resultat_b from matcher where id={0}", id)

Se tidigare inlägg ang. string.format:
http://www.webforum.nu/showthread.php?s=&postid=423650#post423650

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#14

Nu har jag ett nytt problem.

Felmeddelande:
System.InvalidOperationException: The connection is already Open (state=Open, Fetching).
På line 77

Sub datagrid1_update(sender As Object, E As datagridCommandEventargs)
			
		Dim tblaga as textbox=  E.Item.FindControl("tblag_a")
		Dim laga As String = tblaga.Text
		Dim tblagb as textbox=  E.Item.FindControl("tblag_b")
		Dim lagb As String = tblagb.Text
		Dim tbresultata as textbox=  E.Item.FindControl("tbresultata")
		Dim resultata As String = tbresultata.Text
		Dim tbresultatb as textbox=  E.Item.FindControl("tbresultatb")
		Dim resultatb As String = tbresultatb.Text
		Dim tbtid as textbox=  E.Item.FindControl("tbtid")
		Dim tid As String = tbtid.Text
		Dim tbdag as textbox=  E.Item.FindControl("tbdag")
		Dim dag As String = tbdag.Text
		dim m_id as integer = Datagrid1.DataKeys(CType(E.Item.ItemIndex, Integer))
		'dim objcmd1 as new oledbcommand("select * from matcher where id="+ m_id +"", objconn)
		Dim strSQL as String= String.Format("select id, lagid_a, lagid_b, resultat_a, resultat_b, dag, tid,slutspel, uppdaterat_resultat from matcher where id={0}", m_id)	
		response.write(strSQL)
		dim objcmd1 as new oledbcommand(strsql, objconn)
		dim dr as OleDbdatareader
		objconn.open
		dr =objcmd1.executereader
			while dr.read()
				dim lag1 as integer = dr("lagid_a")
				dim lag2 as integer = dr("lagid_b")
					if dr("slutspel") = true then
						'Uppdatera bara spelschemat
						Dim strsql3 As String = String.Format("update matcher set lagid_a={0},lagid_b={1},resultat_a{2},resultat_b{3}, dag={4},tid={5} where id={6}", lag1, lag2, resultata, resultatb, dag, tid, m_id) 
						dim objcmd3 as new oledbcommand(strsql, objconn)

						objcmd3.connection.open()
						objcmd3.executenonquery()
						objcmd3.connection.close()
						datagrid1.Edititemindex =-1
						datagrid1.databind()
					else
						if dr("resultat_a") =resultata and dr("resultat_b") = resultatb then
							Dim strsql4 As String = String.Format("update matcher set lagid_a={0},lagid_b={1},dag={2},tid={3} where id={4}", laga, lagb, dag, tid, m_id)
							dim objcmd4 as new oledbcommand(strsql4, objconn)

							[b]objcmd4.connection.open()[/b]
						objcmd4.executenonquery()
							objcmd4.connection.close()
							datagrid1.Edititemindex =-1
							datagrid1.databind()
						else
							if dr("uppdaterat_resultat") = true then
								dim mala as integer = dr("resultat_a")
								dim malb as integer = dr("resultat_b")
								'Ta bort gammlat resultat i tabell
								'Innehåll från upp_tabb2.asp
									if mala > malb then
									
									elseif mala = malb then
									
									else
									
									end if
								'Lägg till nytt resultat i tabell
								'Innehåll från upp_tabb.asp
									if mala > malb then
									
									elseif mala = malb then
									
									else
									
									end if
								' Uppdatera spelschema
								Dim strsql1 As String = String.Format("update matcher set Resultat_a={0},Resultat_b={1},uppdaterad=true where id={2}", resultata, resultatb, m_id)

								dim objcmd2 as new oledbcommand(strsql1, objconn)

								objcmd2.connection.open()
								objcmd2.executenonquery()
								objcmd2.connection.close()
								datagrid1.Edititemindex =-1
								datagrid1.databind()
						
							else
								dim mala as string = resultata
								dim malb as string = resultatb
								'Lägg till nytt resultat i tabell
								'Innehåll från upp_tabb.asp
									if mala > malb then
									
									elseif mala = malb then
									
									else
									
									end if
								' Uppdatera spelschema
								Dim strsql5 As String = String.Format("update matcher set Resultat_a={0},Resultat_b={1},uppdaterad=true where id={2}", resultata, resultatb, m_id)
								dim objcmd5 as new oledbcommand(strsql5, objconn)

								objcmd5.connection.open()
								objcmd5.executenonquery()
								objcmd5.connection.close()
								datagrid1.Edititemindex =-1
								datagrid1.databind()
							end if
						end if
					end if
			end while
		objconn.close
			
    End Sub

Rad 77 är den fetstil

fredrikMedlem sedan dec. 19991 072 inlägg
#15

Eftersom du redan öppnat "objconn" högre upp behöver du inte öppna den igen. Då du deklarerar "objcmd4" med "objconn" i kontruktorn så jobbar den redan mot en öppen Connection.

Du kan alltså ta bort den raden.

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#16

Får ett nytt felmeddlande när jag tar bort den raden

System.InvalidOperationException: There is already an open DataReader associated with this Connection which must be closed first.
på rad 77
objcmd4.executenonquery()

fredrikMedlem sedan dec. 19991 072 inlägg
#17

Aha...läste inte din kod så noga innan...

Om du har en DataReader "igång" med ett visst Connection-objekt så kan du inte använda det objektet till något annat så länge DataReadern är öppen.

Du får helt enkelt skapa en Connection till eller se till att stänga DataReadern.

Du kan på ett enkelt sätt skapa en ny connection med:

Dim objcmd4 As New OleDb.OleDbCommand(strsql4, New SqlClient.SqlConnection(objconn.ConnectionString))

Tycker det låter lite lurigt att det är så här..men då jag själv stött på problemet och inte hittat nån väg runt antar jag att det är så...

...men om nån har nån lösning så posta gärna!

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#18

låter lit e onödigt att skapa en ny anslutning varje gång.

Borde gå att lösa på något annat sätt

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#19
Dim objcmd4 As New OleDb.OleDbCommand(strsql4, New SqlClient.SqlConnection(objconn.ConnectionString))

Fungerar det med access också?

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#20

Nu har jag löst problemet med anslutningen.

Gjorde så här

Dim strsql4 As String = String.Format("update matcher set lagid_a={0},lagid_b={1},dag={2},match_nummer={3}, tid={4} where id={5}", lag1, lag2, dag, match_nummer,tid, m_id)
							response.write(strsql4)
							dim objcmd4 as new oledbcommand(strsql4, objconn)
							
							objconn.close
							objcmd4.connection.open()
							objcmd4.executenonquery()
							objcmd4.connection.close()
							datagrid1.Edititemindex =-1
							datagrid1.databind()
							objconn.open

Nytt problem.
System.Data.OleDb.OleDbException: Syntaxfel (operator saknas) i frågeuttrycket '17:30'.
På rad 81
rad 81:objcmd4.executenonquery()

129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)