webForumDet fria alternativet

Ersätta n antal ? i en sträng från en array.

ASP

2 svar · 290 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#1

Satt och funderade en del här i dag på hur jag enklast skall lösa detta på.

Kom aldrig fram till något vettigt.. (läs fungerande)

En array

Dim arr(3)
arr(0) = "Fredrik"
arr(1) = "Testar"
arr(3) = "En enklare lösning"

Denna arrays värden skall i den ordningen de ligger i arrayn ersätta följande frågetecken i en sträng, där index på ? är okänd.
Ex.

 SQL = "INSERT INTO Tabell(col1, col2, col3) VALUES(?,?,?)"

Ge mig lite idéer och så :)

Medlem sedan juni 20019 519 inlägg
#2

inte den bästa lösningen men "splitar" strängen vid ? och loopar igenom den och lägg samma värde som din "sql-array" är... problemet är .. eller "problem" behöver det inte vara.. men vad händer om din SQL måste ha en sträng och ett Interger... (visst detta går också att lösa med TypeName kanske. Om du inte vill splitar gör en split med hjälp av regExp och kör det på det sättet.

Medlem sedan nov. 20014 054 inlägg
#3

voigtann1 skrev:

inte den bästa lösningen men "splitar" strängen vid ? och loopar igenom den och lägg samma värde som din "sql-array" är... problemet är .. eller "problem" behöver det inte vara.. men vad händer om din SQL måste ha en sträng och ett Interger... (visst detta går också att lösa med TypeName kanske. Om du inte vill splitar gör en split med hjälp av regExp och kör det på det sättet.

Körde på den första varianten..

Resultat

Function BuildSql(stringSQL,Params)
	Dim pos
	pos = split(trim(stringSQL),"?")

	if IsArray(Params) Then
		For i = 0 To Ubound(pos)
			Select Case(TypeName(Params(i)))
				Case "String"
					pos(i) = pos(i) & "'" & Params(i) & "'"
				Case "Integer"
					pos(i) = pos(i) & Params(i)
				Case "Double"
					pos(i) = pos(i) & "'" & Params(i) & "'"
				Case "Date"
					pos(i) = pos(i) & "'" & Params(i) & "'"
			End Select

			BuildSql = BuildSql & pos(i) 
		Next

	Else
		For i = 0 To Ubound(pos) - 1
			Select Case(TypeName(Params))
				Case "String"
					pos(i) = pos(i) & "'" & Params & "'"
				Case "Integer"
					pos(i) = pos(i) & Params
				Case "Double"
					pos(i) = pos(i) & "'" & Params & "'"
				Case "Date"
					pos(i) = pos(i) & "'" & Params & "'"
			End Select
			BuildSql = BuildSql & pos(i) 

		Next
		
	End if
End Function

Anropar:

strSQL1 = "INSERT INTO tabell(s,s,s,s) values(?,?,?)"
strSQL2 = "Select * from tabell where id=?"
strSQL3 = "Select * from tabell inner join tabell2 on tabell.uid=tabell2.uid where id=? and email=?"

' Flera parameterar.
Dim parameters(3)
parameters(0) = 100
parameters(1) = "Förnamn"
parameters(2) = "Efternamn"

Response.Write BuildSql(strSQL1, parameters) & "<br />"

' Enstaka parameter
Response.Write BuildSql(strSQL2, 10000) & "<br />"

' Flera parameterar
Dim parameters1(2)
parameters1(0) = 1000
parameters1(1) = "email@email.com"
Response.Write BuildSql(strSQL3, parameters1)

Funkade som tänkt :)

Men optimal.. mja..

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