FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Mycket flitig postare
|
Hej,
skulle behöva lite hjälp med att konvertera om en SQL query från MSSQL till MYSQL. Kod:
IF NOT EXISTS (SELECT * FROM IF_sessions WHERE session_name = '" + sSession_name + "' AND session_id = '"+ sSession_id + "') BEGIN INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data) Values('" + sSession_id + "', GETDATE(), '" + System.DateTime.Now.AddHours(2) + "', '" + sSession_name + "', '" + sSession_data + "') END ELSE BEGIN UPDATE IF_sessions SET expires = GETDATE(), session_data = '" + sSession_data + "' WHERE session_id = '" + sSession_id + "' AND session_name = '"+ sSession_name + "' END Senast redigerad av naak2803 den 2015-10-27 klockan 11:27 |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Flitig postare
|
Börja med att posta din SQL-kod och inte din .NET-kod.
|
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Det är inblandat variabler som inte är SQL (sSession_name m.fl.) och så ligger ett anrop till System.DateTime.Now.AddHours(2) som också är .NET så detta är en del av (troligen) c#-kod som genererar SQL. KAn vi få se den genererade sql-koden (det som faktiskt skickas till databasen) så är det lättare att hjälpa till när man slipper "gissa".
|
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Mycket flitig postare
|
Jag tror inte du kan använda IF-satser i Mysql om du inte har dem i en funktion. Då får du istället bryta ut koden till separata sql-frågor och göra if-satserna i din applikation istället för i databasen:
Jag skall försöka ge mig på en tolkning av din mix av .NET-kod och SQL till en pseudo-variant. "ExecuteSql" nedan är bara en placeholder för vad du nu har för att exekvera sql-kod. Kod:
var count = ExecuteSql("SELECT COUNT(*) FROM IF_sessions WHERE session_name = '" + sSession_name + "' AND session_id = '"+ sSession_id + "'"); if (count == 0) { ExecuteSql("INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data) Values('" + sSession_id + "', NOW(), '" + System.DateTime.Now.AddHours(2) + "', '" + sSession_name + "', '" + sSession_data + "') " } else { ExecuteSql("UPDATE IF_sessions SET expires = NOW(), session_data = '" + sSession_data + "' WHERE session_id = '" + sSession_id + "' AND session_name = '"+ sSession_name + "'") } |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Mycket flitig postare
|
Citat:
|
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Har WN som tidsfördriv
|
Det betyder inte att det blir snabbare för det. Skall du hålla på och extremoptimera (behövs antagligen inte alls) kan du börja med att skriva om det till Stored Procedure.
|
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
Jag skulle också rekommendera att skriva om det till en SP som du skickar in värdena till, det blir bättre struktur och snabbare exekvering jämfört med denna dynamiska SQL-sats.
Använd ADO.NET och parameteriserad ADO/SQL så du omöjliggör SQL-Injections när du ändå fixar till koden. https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx Kod:
// C# OleDbCommand command = new OleDbCommand("SampleProc", connection); command.CommandType = CommandType.StoredProcedure; OleDbParameter parameter = command.Parameters.Add( "RETURN_VALUE", OleDbType.Integer); parameter.Direction = ParameterDirection.ReturnValue; parameter = command.Parameters.Add( "@InputParm", OleDbType.VarChar, 12); parameter.Value = "Sample Value"; parameter = command.Parameters.Add( "@OutputParm", OleDbType.VarChar, 28); parameter.Direction = ParameterDirection.Output; För att skapa en Stored Procedure i MS SQL-Server se här: https://msdn.microsoft.com/en-us/library/ms345415.aspx Kod:
-- Skapa en SP USE AdventureWorks2012; GO CREATE PROCEDURE HumanResources.uspGetEmployeesTest2 @LastName nvarchar(50), @FirstName nvarchar(50) AS SET NOCOUNT ON; SELECT FirstName, LastName, Department FROM HumanResources.vEmployeeDepartmentHistory WHERE FirstName = @FirstName AND LastName = @LastName AND EndDate IS NULL; GO Kod:
-- Anropa en SP för att testa EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar'; -- Or EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar'; GO -- Or EXECUTE HumanResources.uspGetEmployeesTest2 @FirstName = N'Pilar', @LastName = N'Ackerman'; GO Senast redigerad av Conny Westh den 2015-10-28 klockan 16:57 |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Mycket flitig postare
|
Citat:
Ett sätt att optimera är som jayzee skriver att göra en Stored Procedure. En annan variant är att göra primary key till "SESSION_ID + SESSION_NAME" och sen använda INSERT INTO ... ON DUPLICATE KEY UPDATE http://dev.mysql.com/doc/refman/5.1/...duplicate.html Kod:
INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data) Values('...', ..., '...', '...', '....') ON DUPLICATE KEY UPDATE expires = '...', session_data = '...' |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Medlem
|
Ett annat rätt vanligt tillvägagångssätt är att köra en UPDATE och sen kolla om det var några rader som uppdaterades (affected rows, @@rowcount eller liknande). Då behöver du bara köra en query ifall posten redan fanns, i annat fall blir det två. Men det är oundvikligt.
|
||
![]() |
![]() |
Svara |
|
|