* gorgi_19 gaat maar even wat duidelijker uitleggen wat ik bedoel..
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| Create PROCEDURE dbo.ProSim_GetPlayersByCountry
(
@UserID int
)
AS
Declare @CountryID int
SELECT
@CountryID = dbo.prosim_country.CountryID
FROM
dbo.prosim_country RIGHT OUTER JOIN
dbo.prosim_user ON dbo.prosim_country.GameID = dbo.prosim_user.GameID
WHERE
(dbo.prosim_user.userID = @UserID)
SELECT
dbo.prosim_player.PersonID AS PlayerID,
dbo.prosim_player.CompanyID,
dbo.prosim_player.Firstname,
dbo.prosim_player.Lastname,
dbo.prosim_player.MiddleInitials,
dbo.prosim_player.occupation,
dbo.prosim_user.UserName
FROM
dbo.prosim_user RIGHT OUTER JOIN
dbo.prosim_company ON dbo.prosim_user.userID = dbo.prosim_company.UserID RIGHT OUTER JOIN
dbo.prosim_player ON dbo.prosim_company.UserID = dbo.prosim_player.CompanyID
WHERE
(dbo.prosim_company.CountryID = @CountryID) |
Dat is een voorbeeld van een SP van mij, en hier de bijbehorende regels uit de datalaag.
De bijbehoreden code om deze uit te lezen:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| ' *********************************************************************************************
'
' GetPlayersByCountry method
'
' Returns all the players (as managers) from a country. Country is identified by
' a UserID
'
' *********************************************************************************************
Public Function GetPlayersByCountry(ByVal UserID As Integer) As ArrayList Implements IDataProvider.GetPlayersByCountry
' Create Instance of Connection and Command Object
Dim myConnection As SqlConnection = GetSqlConnection()
Dim myCommand As New SqlCommand("ProSim_GetPlayersByCountry", myConnection)
' Mark the Command as a SPROC
myCommand.CommandType = CommandType.StoredProcedure
' Add Parameters to SPROC
myCommand.Parameters.Add("@UserID", SqlDbType.Int, 4).Value = UserID
Dim Players As New ArrayList
' Open the connection and execute the Command
myConnection.Open()
Dim result As SqlDataReader = myCommand.ExecuteReader()
While result.Read
Players.Add(Me.PopulatePlayersFromSqlDataReader(result))
End While
result.Close()
myConnection.Close()
Return Players
End Function |
En nu nog de laatste functie:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Private Function PopulatePlayersFromSqlDataReader(ByVal dr As SqlDataReader) As Player
Dim m_oPlayer As New Player
m_oPlayer.PersonID = Int32.Parse(dr("PlayerID"))
m_oPlayer.CompanyID = Int32.Parse(dr("CompanyID"))
m_oPlayer.RegDate = Convert.ToDateTime(dr("RegDate"))
m_oPlayer.Occupation = Convert.ToString(dr("Occupation"))
m_oPlayer.Email = Convert.ToString(dr("Email"))
m_oPlayer.FirstName = Convert.ToString(dr("FirstName"))
m_oPlayer.MiddleInitials = Convert.ToString(dr("MiddleInitials"))
m_oPlayer.LastName = Convert.ToString(dr("LastName"))
m_oPlayer.UserName = Convert.ToString(dr("UserName"))
Return m_oPlayer
End Function |
De player class laat zich grotendeels wel raden..
Deze laatste functie wordt gebruikt om de player class te vullen, en staat in meer methods (bijvoorbeeld ook in GetPlayersByCompany). Op deze wijze wordt een stukje uniformiteit afgedwongen.
Mocht er een fout optreden, op welke wijze dan ook, met een SP, een verkeerde kolomnaam (zeker handig als je een flexibiliteit wil, waarbij je zonder enige moeite kan switchen tussen verschillende databases als backend), dan vind ik dit wel een duidelijke methodiek. Mocht er iets fouts optreden, dan komt deze niet eens voorbij de datalaag.
Eventuele bewerkingen, zoals een formattedname, in het geval van een player, is zo ook eenvoudig te maken. (zeker als er nog enige rules bij zitten, zoals aanhef op basis van geslacht) en dit is wat lastiger voor elkaar te krijgen als je een datatable bindt.
Zit je nu gebonden aan altijd deze kolommen? Nee. Je kan makkelijk 'optionele' velden maken, door middel van
ASP.NET:
1
2
3
4
5
6
| Dim dt As DataTable = dr.GetSchemaTable
If dt.Columns.Contains("InitialPassword") Then
m_oCompany.InitialPassword = dr("InitialPassword")
End If |
Nu de hamvraag: Is het 'binden' in de datalaag veel extra werk? Nee, door het gebruik van de functie scheelt dit enorm in werk. Ook geeft het een stukje extra 'veiligheid'. Ook de functie is bovendien herbruikbaar, zoals ik al eerder aangaf.
* gorgi_19 hoopt dat het nu wat duidelijker wordt waar hij mee bezig is..
[
Voor 6% gewijzigd door
gorgi_19 op 02-07-2003 19:59
]