Avatar billede Kim Neesgaard Seniormester
11. februar 2006 - 15:48 Der er 36 kommentarer og
1 løsning

Returnering af et dataset fra en funktion/subprocedure

Jeg har følgende kode, der åbner en forbindelse til enten en lokal SQL Server Express 2005 eller en 'rigtig' SQL Server afhængig af om .aspx'en køres lokalt eller på en webserver (http://www.eksperten.dk/spm/685042 og http://www.eksperten.dk/spm/685448):

Dim strSQL As String
        strSQL = "SELECT F1, F2 FROM Table1"
        Dim ConnProd As New SqlConnection("SERVER=mssql.buydomains.dk; UID=xx; PWD=yy; DATABASE=neesdk;")
        Dim SQLTekstProd As New Data.SqlClient.SqlCommand(strSQL, ConnProd)
        Dim dsProd As Data.SqlClient.SqlDataReader

        Dim ConnTest As New Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString)
        Dim SQLTekstTest As New Data.SqlClient.SqlCommand(strSQL, ConnTest)
        Dim dsTest As Data.SqlClient.SqlDataReader

        If Request.ServerVariables("HTTP_HOST") = "www.zzz.dk" Then
            ConnProd.Open()
            dsProd = SQLTekstProd.ExecuteReader()
        Else
            ConnTest.Open()
            dsTest = SQLTekstTest.ExecuteReader()
        End If
       
Det er ikke særlig praktisk at skulle operere med dsTest eller dsProd, så kan man gøre det, at man lægger denne kode ned i en funktion/subprocedure, som man sender strSQL til og modtager et dataset retur, som man så kan arbejde videre med (valget af datakilde foregår jo så i selve funktionen/sub'en)?
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:00 #1
tilføj denne her under din localsqlserver connection string:
<add name="Prodsqlserver" connectionString="SERVER=mssql.buydomains.dk; UID=xx; PWD=yy; DATABASE=neesdk;"/>
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:06 #2
lav en klasse:

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Public Class Database

Public Shared Function getConnectionString() As String
  Dim Constr As String = String.Empty
  If HttpContext.Current.Request.ServerVariables("HTTP_HOST") = "www.zzz.dk" Then
    Constr = ConfigurationManager.ConnectionStrings("Prodsqlserver").ConnectionString
  Else
    Constr = ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString
  End If
  Return Constr
End Function
End Class
Avatar billede Kim Neesgaard Seniormester
11. februar 2006 - 16:10 #3
Nu er jeg kommet på glatis igen! Hvor i ovennævnte kode skal Constr indsættes? Hvordan vides, hvad Prodsqlserver er?
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:11 #4
Dim strSQL As String
        strSQL = "SELECT F1, F2 FROM Table1"
        Dim Conn As New SqlConnection(Database.getConnectionString)
        Dim SQLTekst As New Data.SqlClient.SqlCommand(strSQL, Conn)
        Dim ds As Data.SqlClient.SqlDataReader
Conn.Open()
            dsProd = SQLTekst.ExecuteReader()
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:12 #5
lav en klasse kaldet Database.vb
kopier:

Imports System
Imports System.Data
Imports System.Configuration
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Public Class Database

Public Shared Function getConnectionString() As String
  Dim Constr As String = String.Empty
  If HttpContext.Current.Request.ServerVariables("HTTP_HOST") = "www.zzz.dk" Then
    Constr = ConfigurationManager.ConnectionStrings("Prodsqlserver").ConnectionString
  Else
    Constr = ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString
  End If
  Return Constr
End Function
End Class
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:13 #6
din connectionstrings section web.config skal se ud på denne måde:

<connectionStrings>
    <remove name="LocalSqlServer"/>
    <add name="LocalSqlServer" connectionString="Data Source=.\SQLExpress;Integrated Security=True;User Instance=True;AttachDBFilename=|DataDirectory|Test2005.mdf" providerName="System.Data.SqlClient"/>
<add name="Prodsqlserver" connectionString="SERVER=mssql.buydomains.dk; UID=xx; PWD=yy; DATABASE=neesdk;"/>
  </connectionStrings>
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:14 #7
Prodsqlserver er navnet på connectionstring til din production server i web.config.
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:15 #8
Det laves på denne måde for at du ikke skal tænke over hvornår du skal bruge  den eller den anden connection string.
Avatar billede Kim Neesgaard Seniormester
11. februar 2006 - 16:25 #9
Tak for de mange svar - jeg ser på dem i morgen!
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 16:27 #10
np smider lige et svar hvis det var det du skulle bruge.
spørg bare hvis der er noget:)
Avatar billede arne_v Ekspert
11. februar 2006 - 16:57 #11
undskyld men hvorfor have en if hvis der er en konfigurations fil

hvorfor ikke bare have en konfigurations fil med forskellig indhold
for prod og test
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 17:04 #12
så er der jo 2 steder man skal opdatere de samme info .
Avatar billede arne_v Ekspert
11. februar 2006 - 17:10 #13
hvilken info i de 2 er ens og relevant at opdatere ?

og hvis man endelig skulle opdatere 2 konfigurations filer saa gik det nok - det er
et ret oplagt sted at lede efter konfiguration

jeg er betydeligt mere bekymret over et hardcoded hostnavn i koden - kan man huske
det den dag man skal skifte hostnavn ?
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 17:16 #14
med hostnavnet kan vi godt være enige.

mht til 2 config filer. Så skal man jo konstant være sikker på at de er ens bortset fra connectionstring.
Og man sikre sig at man ligger den rigtige det rigtige sted så test ikke er aktiv når web stedet er i produktion.

Så er det nemmere bare at ændre i connectionstringen i web.config.
Avatar billede arne_v Ekspert
11. februar 2006 - 17:42 #15
jeg er stadig noget skeptisk overfor ideen om konfigurations filer
som skal vaere ens, men hvor man saa i applikationen tester om det er
det ene eller andet

konfigurations filer enten er forskellige eller kan blive det

det er helt rigtigt at man skal vaere meget omhyggerlig med at det er den
rigtige konfiguration der bruges (<add key="allUsersAdmin" value="true"/> etc.)
Avatar billede arne_v Ekspert
11. februar 2006 - 17:47 #16
der er ogsaa et organisatorisk aspekt

koden ejes af developerne

men ofte vil man sige at developerne kun leverer en template for konfigurations
filer (web.config.sample eller lignende), men at det er den som er ansvarlig
for serveren (test eller drift) som ejer konfigurations filerne
Avatar billede arne_v Ekspert
11. februar 2006 - 17:47 #17
neesgaard>

du ignorerer bare denne lille side diskussion
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 17:51 #18
Til 11/02-2006 17:42:27
den måde som jeg har foreslået til neesgaard har du kun en config fil.

Meget kan gå galt hvis du lave ged i web.config.
I asp.net 2.0 kan det være endnu værre fordi mange flere ting defineres i web.config.
Men hvis test miljøet er en afspejling af produktion bør det 2 config filer være ens.
det samme bør i stykke hen af vejen gælde for anden opsæning med roller oav.
Avatar billede dr_chaos Nybegynder
11. februar 2006 - 17:53 #19
11/02-2006 17:47:25
ja det er jeg enig i.

ofte er der bare det problem at en server admin fatter hat af programmring og kan gøre ting værre ved at rode rundt med config filerne
Avatar billede arne_v Ekspert
12. februar 2006 - 00:01 #20
der er naesten altid forskel paa prod og test, IP adresser, email adresser,
logging etc.

hvis test hw ikke er full size kan der vaere forskel paa dimensionering
(omend det er svaert at lave performance test saa)
Avatar billede dr_chaos Nybegynder
12. februar 2006 - 11:20 #21
Hvis man skal udføre en realistisk test på en test version bør den afspejle produktionsversionen inkl logging osv.

IP adresser og e-mail adresser kan variere men det er for det meste i små tings afdelingen.
Avatar billede arne_v Ekspert
12. februar 2006 - 15:36 #22
jep - samme afdeling som connection strings
Avatar billede Kim Neesgaard Seniormester
12. februar 2006 - 17:33 #23
arne_v -> Jeps - men ser meget interessant ud, så helt ok!
Avatar billede Kim Neesgaard Seniormester
17. februar 2006 - 18:25 #24
Det er ikke af uinteresse, at jeg ikke er vendt tilbage, men jag har været på kursus hele ugen  (i ASP.NET), så jeg tænkte at vente med at nærlæse til jeg var færdig med det.
Avatar billede Kim Neesgaard Seniormester
19. februar 2006 - 19:07 #25
Nu har jeg fået det til at køre lokalt, men når jeg kører det på webserveren, så får jeg meldingen:

Name 'getConnectionString' is not declared.

ved

Dim Conn As New Data.SqlClient.SqlConnection(getConnectionString())

Er det så ikke sådan, at men classkode skal indkapses i et Namespace og det Namespace skal refereres til i Default.aspx.vb (Jeg kører dette i Visual Web Developer Express 2005)?
Avatar billede dr_chaos Nybegynder
19. februar 2006 - 19:10 #26
nej man bruger ikke så meget namespaces i asp.net 2.0
Avatar billede Kim Neesgaard Seniormester
19. februar 2006 - 19:24 #27
Ok, men hvordan får jeg gjort getConnectionString() kendt i default.aspx?
Avatar billede dr_chaos Nybegynder
19. februar 2006 - 19:32 #28
prøv med Database.getConnectionString()
Avatar billede Kim Neesgaard Seniormester
19. februar 2006 - 20:10 #29
Den skriver: Name 'Database' is not declared. Min Database.vb fil ligger i et bibliotek, VWDE har kaldt App_Code, men det er vel godt nok?
Avatar billede dr_chaos Nybegynder
19. februar 2006 - 21:14 #30
prøv med
DataBase db = new DataBase(); <-- c#

db.getConnectionString()
Avatar billede dr_chaos Nybegynder
19. februar 2006 - 21:22 #31
du skal bruge
Dim Conn As Data.SqlClient.SqlConnection = New Data.SqlClient.SqlConnection(DataBase.getConnectionString)
Avatar billede dr_chaos Nybegynder
19. februar 2006 - 21:22 #32
ikke noget med ()
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 16:35 #33
Jeg lukker denne grundet alder, men tak for de mange indlæg!
Avatar billede arne_v Ekspert
19. december 2010 - 18:15 #34
Du har tildelt dig selv de 100 point som belønning for at være næsten 5 år om at vende tilbage??
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 18:53 #35
Ja - jeg kan godt se, at jeg har været ekstremt sløv til at følge op på mine spørgsmål og det beklager jeg meget, når I har brugt tid på det. Jeg vil fremover være meget mere opmærksom på dette. Jeg lukkede for ikke at forstyrre jer med noget, jeg ikke havde fulgt til dørs og ikke havde fået til at virke, men læg meget gerne et svar.
Avatar billede arne_v Ekspert
19. december 2010 - 19:02 #36
Nu var det vist mere dr_chaos der havde fortjent point her end mig (jeg startede bare en lille side diskussion).

Man kan ikke uddele point i et spørgsmål, når der en gang er uddelt point - heller ikke når spørger seælv har taget dem.

Det er godt at få afsluttet game spørgsmål, men kun hvis de bliver afsluttet på en god måde.
Avatar billede Kim Neesgaard Seniormester
19. december 2010 - 19:34 #37
Jeg har forsøgt, men åbenbart ikke lykkes! Som sagt vil jeg følge tæt op fremover.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester