webForumDet fria alternativet

Använda två databaser

ASP

8 svar · 576 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

:)
Hej!

Jag har följande kod:

<%
Dim sSQL, objConn, objRS1, objRS2,  iStatus, sNote, sCategory, sName, sArtNr, sUnit, iPrice, iNextId

'Ange status; 0 = "synkroniserad med SPCS", 1 = "Inte synkroniserad mot SPCS"
iStatus = 0

'Notering
sNote = ""

' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

sSQL = 		"SELECT tblArticle.articlenumber, tblArticle.articleName, tblPrice.articlePrice, tblPrice.articleCategoryNumber, tblArticle.articleUnit, " &_
			"tblCategory.CategoryName, tblCategory.categoryNumber, tblDiscount.articleDiscount, tblSupplier.SupplierName, tblSupplier.SupplierId, " &_
			"CASE WHEN articleDiscount is null THEN articlePrice ELSE articlePrice*(1-([articleDiscount]*0.01)) END AS articlePriceWithDiscount " &_
			"FROM tblArticle " &_
			"INNER JOIN tblPrice ON tblArticle.articlenumber = tblPrice.articleNumber " &_
			"INNER JOIN tblSupplier ON tblPrice.articleSupplierId = tblSupplier.SupplierId " &_
			"LEFT OUTER JOIN tblDiscount ON tblPrice.articleCategoryNumber = tblDiscount.categoryNumber AND tblPrice.articleSupplierId = tblDiscount.supplierId " &_
			"LEFT OUTER JOIN tblCategory ON tblPrice.articleSupplierId = tblCategory.supplierId AND tblPrice.articleCategoryNumber = tblCategory.categoryNumber " &_
			"ORDER BY tblArticle.articlenumber"
			
Set objRS1 = Server.CreateObject("ADODB.Recordset")
objRS1.Open sSQL, objConn, 3, 1

If not objRS1.EOF then
	
	do until objRS1.EOF
	
		sArticleNumber = objRS1("articleNumber")
		sArticleName = objRS1("articleName")
		sUnit = lCase(objRS1("articleUnit"))
		iPrice = replace(cDbl(objRS1("articlePrice")), ",", ".")
		
		'Ta ut de två första tecknena i E-numret
		sList = left(sArtNr, 2)
		
		'Hämta kategorinamn mha sList
		Set objRS2 = objConn.Execute ("SELECT listName FROM tblList WHERE listNr = '" & sList & "'")
		
		If not objRS2.EOF then	
			sCategory = objRS2("listName")	
		End If
				
		objRS2.Close
		Set objRS2 = Nothing
		
		[b]'--------------------------------------------------------------------
		'Här ska det hämtas info från en annan databas...
		
		Set objRS2 = objConn.Execute ("SELECT nextId FROM tblNextId WHERE table = 'tblArticle'")
		
		If not objRS2.EOF then	
			iNextId = cLng(objRS2("NextId")) 	
		End If
				
		objRS2.Close
		Set objRS2 = Nothing
		
		sSQL = 	"INSERT INTO tblarticle ([Id], [Group], [Status], [Modified], ArtNr, [Name], [Category], [Unit], [Price], Custom1, Custom2, [Note]) " &_
				"VALUES(" & iNextId & ", " & iGroup & ", " & iStatus & ", Now(), '" & sArtNr & "', '" & sName & "', " &_
				"'" & sCategory & "', '" & sUnit & "', " & iPrice & ", '" & sCustom1 & "', '" & sCustom2 & "', '" & sNote & "')"
		objConn.execute sSQL,,128
				
		sSQL = "UPDATE tblNextId SET nextId = nextId + 1 WHERE Table = 'tblArticle'"
		objConn.Execute sSQL,, 128[/b]
	
		objRS1.Movenext
	
	Loop

Else
	Response.write "Fel!"	
End if

objRS1.Close
Set objRS1 = Nothing

Response.write "Datat har lagrats!"
%>

Koden hämtar data från en tabell i databas 1 och ska hämta och skriva data till tabeller databas 2.

Det som är i fetstil är ifrån databas 2.

Hur gör jag detta?

Jag har följande connectionstring i Global.asa

Sub Application_OnStart
	Application("sConn") = "Provider=SQLOLEDB.1;Password=xxxxxxx;Persist Security Info=True;User ID=sa;Initial Catalog=IntranetSydostel;Data Source=.\sqlexpress"
End Sub

Jag använder MS SQL-server

Kanske frågan är i fel forum... flytta i så fall... :)

Mvh
Henrik

Medlem sedan mars 2005232 inlägg
#2

Jag kan inte asp eller så och har inte kolla igenom koden speciellt noga. Men är det inte smidigare att ha två tabeller i en databas, istället för två databaser med en tabell i varje?

Medlem sedan dec. 19996 721 inlägg
#3

Om du har två databaser så har du väl två connectionstring:ar?

Alternativt, om användaren för koppling 1 även har rätt till databas 2, så kan du komma åt den direkt, genom att ange tabellnamnen med databasnamn.ägarnamn.tabellnamn, där ägarnamnet oftast är tomt (dbo), ex. "SELECT * FROM AndraDatabasen..Tabellen".

OBS! Att köra med sa-användaren rekommenderas inte!! Major säkerhetshål.

Medlem sedan jan. 20013 582 inlägg
#4

emission skrev:

Om du har två databaser så har du väl två connectionstring:ar?

Så här menar du?

' Öppna databasen
' ***************
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = Application("sConn")
objConn.Open

...

Set objConn2 = Server.CreateObject("ADODB.Connection")
objConn2.ConnectionString = Application("sConn2")
objConn2.Open

emission skrev:

Alternativt, om användaren för koppling 1 även har rätt till databas 2, så kan du komma åt den direkt, genom att ange tabellnamnen med databasnamn.ägarnamn.tabellnamn, där ägarnamnet oftast är tomt (dbo), ex. "SELECT * FROM AndraDatabasen..Tabellen".

Skulle du kunna utvecla det lite... är inte riktigt med.. :r

emission skrev:

OBS! Att köra med sa-användaren rekommenderas inte!! Major säkerhetshål.

Ska åtgärda det... Är bara test och utveckling just nu... i den skarpa versionen ska jag inte ha sa-kontot...

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#5

Skulle du kunna utvecla det lite... är inte riktigt med..

Jag provar väl, även om det inte är så himla lätt att beskriva på något annat sätt...

Om användaren som användes för inloggning i din första connection har rättigheter i databas två kan du prata med den databasen genom att prefixa tabellnamnen med databasnamn...

Medlem sedan jan. 20013 582 inlägg
#6

:)

Jag provade att göra så här:

(utskrift av SQL)

INSERT INTO UppdragNu.dbo.tblArticle ([Id], [Status], [Modified], [Nr], [Name], [Category], [Unit], [Price], [Note]) VALUES(10002, 0, '2006-07-31 18:00:00', '0000040', 'EKKJ 1x10/10', '', 'm', 360, '')

Det verkar ju funka.. Var det så du menade?

Jag får dock ett felmeddelande...

Feltyp:
Microsoft OLE DB Provider for SQL Server (0x80040E2F)
Det går inte att infoga rad med dubblettnyckel i objektet dbo.tblArticle med det unika indexet IDX_tblArticle_Nr.
/createUppdragNuDb/addUppdragNuArticles.asp, line 80

Line 80 är när jag försöker exekvera ovanstående SQL...

Det kanske inte har så mycket med frågan att göra egentligen... Jag lyckas dock inte lösa det och vet inte riktigt vad det betyder... Någon?

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#7

:)

Jag lyckades klura ut vad:

Feltyp:
Microsoft OLE DB Provider for SQL Server (0x80040E2F)
Det går inte att infoga rad med dubblettnyckel i objektet dbo.tblArticle med det unika indexet IDX_tblArticle_Nr.
/createUppdragNuDb/addUppdragNuArticles.asp, line 80

Betydde...

Jag försökte lägga till samma artikelnummer två gånger och det går ju givetvis inte... Frågan är dock varför det blev så... Scriptet skall ju loopa ut alla artikelnummer från databasen...

Mvh
Henrik

Medlem sedan juni 200032 967 inlägg
#8

Vad gör rad 80 då?

Medlem sedan jan. 20013 582 inlägg
#9

@nders skrev:

Vad gör rad 80 då?

Det var jag som strulade till det som vanligt....

Rad 80 exekverar inserten...

Men jag hade klippt och klistart fel sql.... så när jag körde koden så försökte jag sätta in dubletter, vilket inte är tillåtet...

Har åtgärdat det nu... :)

Och jag fattade till slut vad ni menade! Det gick utmärkt att använda sig av en annan databas som hade "samma rättigheter"

Mvh
Henrik

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