Ik ben bezig met een webapplicatie. Een van de functionaliteiten is dat de gebruiker een "project" (verzameling van instellingen die hij aangepast heeft) kan opslaan in een database. Hiervoor heb ik een functie gemaakt, genaamd SaveProject(string data)
ja ja, erg orgineel allemaal.
data is hier een JSON string, waarin de gebruikersnaam en de directory waarin de gebruiker zijn foto's heeft geupload staan opgeslagen.
De procedure heeft 3 grote stappen in de database,
Controleren of een record al bestaat (oftewel, is het project al eens eerder opgeslagen, of is dit de eerste keer). Als record nog niet bestaat, moet deze worden aangemaakt, dit is de 2e stap.
De 3e stap is de data in het inmiddels bestaande record updaten.
Hierin komen dus de volgende query's voor:
Nu heb ik slechts een basiskennis van SQL, maar ik vraag mij af, hoe ik deze 3 queries in 1 kan combineren, zodat deze functie een stuk korter en dus overzichterlijker kan
data is hier een JSON string, waarin de gebruikersnaam en de directory waarin de gebruiker zijn foto's heeft geupload staan opgeslagen.
De procedure heeft 3 grote stappen in de database,
Controleren of een record al bestaat (oftewel, is het project al eens eerder opgeslagen, of is dit de eerste keer). Als record nog niet bestaat, moet deze worden aangemaakt, dit is de 2e stap.
De 3e stap is de data in het inmiddels bestaande record updaten.
C#:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| [WebMethod] public bool SaveProject(string data) { //data is een json object hier moet eerst wat data uitgehaald worden (user, titel, guid) Debug.Print(data); TextReader myJsonTextReader = new StringReader(data); JsonReader myJsonReader = new JsonReader(myJsonTextReader); string strGuid = ""; string strUser = ""; string strUserId = ""; string strTitle = ""; #region Json uitlezen while (myJsonReader.Read()) { Debug.WriteLine(myJsonReader.Value); if ((string)myJsonReader.Value == "username") { myJsonReader.Read(); strUser = (string)myJsonReader.Value; } if ((string)myJsonReader.Value == "title") { myJsonReader.Read(); strTitle = (string)myJsonReader.Value; } if ((string)myJsonReader.Value == "guid") { myJsonReader.Read(); strGuid = (string)myJsonReader.Value; } } #endregion #region UserId opzoeken adhv usernaam MembershipUser myUser = Membership.GetUser(strUser); strUserId = myUser.ProviderUserKey.ToString(); #endregion #region Controleren of record al bestaat string connstr = ConfigurationManager.AppSettings["MyDB"]; SqlConnection myCon = new SqlConnection(connstr); SqlCommand myCom = new SqlCommand(); myCom.Connection = myCon; myCom.CommandText = "SELECT id FROM Projects WHERE(guid = @guid)"; myCom.Parameters.Add("@guid", SqlDbType.UniqueIdentifier).Value = strGuid; myCon.Open(); myCom.Prepare(); string myResult = myCom.ExecuteScalar().ToString(); myCon.Close(); #endregion #region Record aanmaken indien nodig if (myResult == null) { //Moet nieuw record aangemaakt worden SqlCommand myCom2 = new SqlCommand(); myCom2.Connection = myCon; myCom2.CommandText = "INSERT INTO Projects (user, title, guid) VALUES (@user, @title, @guid)"; myCom2.Parameters.Add("@guid", SqlDbType.UniqueIdentifier).Value = strGuid; myCom2.Parameters.Add("@title", SqlDbType.NVarChar).Value = strTitle; myCom2.Parameters.Add("@user", SqlDbType.UniqueIdentifier).Value = strUserId; myCon.Open(); myCom2.Prepare(); myCom2.ExecuteNonQuery(); myCon.Close(); } #endregion #region Record updaten SqlCommand myCom3 = new SqlCommand(); myCom3.Connection = myCon; myCom3.CommandText = "UPDATE Projects SET title = @title, data = @data WHERE guid = @guid"; myCom3.Parameters.Add("@guid", SqlDbType.UniqueIdentifier).Value = strGuid; myCom3.Parameters.Add("@title", SqlDbType.NVarChar).Value = strTitle; myCom3.Parameters.Add("@user", SqlDbType.UniqueIdentifier).Value = strUserId; myCom3.Parameters.Add("@data", SqlDbType.NVarChar).Value = data; myCon.Open(); myCom3.Prepare(); myCom3.ExecuteNonQuery(); myCon.Close(); #endregion return true; } |
Hierin komen dus de volgende query's voor:
SQL:
1
2
3
4
5
| SELECT id FROM Projects WHERE(guid = @guid) INTO Projects (user, title, guid) VALUES (@user, @title, @guid) UPDATE Projects SET title = @title, data = @data WHERE guid = @guid |
Nu heb ik slechts een basiskennis van SQL, maar ik vraag mij af, hoe ik deze 3 queries in 1 kan combineren, zodat deze functie een stuk korter en dus overzichterlijker kan
[ Voor 15% gewijzigd door ThunderNet op 19-12-2007 10:10 ]
Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?