| 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 12:27 |
||
|
|
Svara med citat
|
|
|
#2 | ||
|
|||
|
Flitig postare
|
Börja med att posta din SQL-kod och inte din .NET-kod.
|
||
|
|
Svara med citat
|
|
|
#3 | ||
|
|||
|
Medlem
|
|||
|
|
Svara med citat
|
|
|
#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".
|
||
|
|
Svara med citat
|
|
|
#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 + "'")
}
|
||
|
|
Svara med citat
|
|
|
#6 | ||
|
|||
|
Mycket flitig postare
|
Citat:
|
||
|
|
Svara med citat
|
|
|
#7 | ||
|
|||
|
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 17:57 |
||
|
|
Svara med citat
|
|
|
#8 | ||
|
|||
|
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 med citat
|
| Svara |
| Ämnesverktyg | |
| Visningsalternativ | |
|
|