( vbali | 2006. 04. 21., p – 11:25 )

Ok, egy példa:
Ha a sztornozást nézzük, adatkezelés szintjén ez most vhogy így néz ki:

db.Query("CALL sp_updateisstorno(" + treeFej.invoice.InvoiceID.ToString() + ")");
db.FreeResult();

Ha az SQL utasítások a kódba kerülnek tárolt eljárás helyett akkor a következő utasításokat kell a db.Query-vel meghívogatni.

	DECLARE NextInvoiceNumber VARCHAR(20);
	DECLARE lastid INTEGER;
	DECLARE IsOrder TINYINT(1);
	DECLARE origSzamlaszam INTEGER;
	DECLARE origPartnernev VARCHAR(50);
	DECLARE origPartnercim VARCHAR(106);
	DECLARE origPartnerBankszamlaszam VARCHAR(26);
	DECLARE origPartnerAdoszam VARCHAR(15);
	DECLARE origFizMod INTEGER;
	DECLARE origTeljesitesIdopontja DATE;
	DECLARE origSzamlaKelte DATE;
	DECLARE origFizetesHatarideje DATE;
	DECLARE origIsSztorno TINYINT(1);
	DECLARE origIsPrinted TINYINT(1);
	DECLARE origMegjegyzes TEXT;
	DECLARE origOrigSzamlafejID INTEGER;
	DECLARE origIsMegrendeles TINYINT(1);
	DECLARE tetelSzamlafejID INTEGER;
	DECLARE tetelTermek VARCHAR(100);
	DECLARE tetelMennyiseg INTEGER;
	DECLARE tetelAFA INTEGER;
	DECLARE tetelEgysegar INTEGER;
	DECLARE tetelKategoriaID INTEGER;
	DECLARE tetelITJ VARCHAR(10);
	DECLARE tetelMeId INTEGER;
	DECLARE tetelProductID INTEGER;
	DECLARE uniqueSzamlafejID INTEGER;
	DECLARE uniqueUniqueDescID INTEGER;
	DECLARE uniqueValue VARCHAR(255);
	DECLARE done INT DEFAULT 0;
	DECLARE curSZAMLATETEL CURSOR FOR SELECT
		SzamlafejID,
		Termek,
		Mennyiseg,
		AFA,
		Egysegar,
		KategoriaID,
		ITJ,
		MeId,
		ProductID
	FROM SZAMLATETEL 
	WHERE SzamlafejID = ID;
	DECLARE curUNIQUEFIELDS CURSOR FOR SELECT
		UniqueDescID,
		Value
	FROM UNIQUEFIELDS 
	WHERE SzamlafejID = ID;
	DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
	SELECT IsMegrendeles INTO IsOrder FROM SZAMLAFEJ WHERE SzamlafejID = ID;
	SELECT MAX(Szamlaszam) AS KovSorszam INTO NextInvoiceNumber 
	FROM SZAMLAFEJ
	WHERE Year(SzamlaKelte) = Year(Now()) AND IsMegrendeles = IsOrder;
	SELECT IFNULL(NextInvoiceNumber+1, 1) INTO NextInvoiceNumber;
	SELECT 
		Szamlaszam,
		Partnernev,
		Partnercim,
		PartnerBankszamlaszam,
		PartnerAdoszam,
		FizMod,
		TeljesitesIdopontja,
		SzamlaKelte,
		FizetesHatarideje,
		IsSztorno,
		IsPrinted,
		Megjegyzes,
		OrigSzamlafejID,
		IsMegrendeles
	INTO 
		origSzamlaszam, 
		origPartnernev,
		origPartnercim,
		origPartnerBankszamlaszam,
		origPartnerAdoszam,
		origFizMod,
		origTeljesitesIdopontja,
		origSzamlaKelte,
		origFizetesHatarideje,
		origIsSztorno,
		origIsPrinted,
		origMegjegyzes,
		origOrigSzamlafejID,
		origIsMegrendeles
	FROM SZAMLAFEJ WHERE SzamlafejID = ID;
	IF origIsSztorno > 0 THEN
		LEAVE sproc;
	END IF;
	INSERT INTO SZAMLAFEJ (
		szamlaszam,
		partnernev,
		partnercim,
		partnerbankszamlaszam,
		partneradoszam,
		fizmod,
		teljesitesidopontja,
		szamlakelte,
		fizeteshatarideje,
		issztorno,
		isprinted,
		megjegyzes,
		OrigSzamlafejID,
		ismegrendeles)
	VALUES (
		NextInvoiceNumber,
		origPartnernev,
		origPartnercim,
		origPartnerBankszamlaszam,
		origPartnerAdoszam,
		origFizmod,
		origTeljesitesidopontja,
		Now(),
		origFizetesHatarideje,
		0,
		0,
		origMegjegyzes, 
		ID,
		origIsMegrendeles);
	SELECT LAST_INSERT_ID() INTO lastid;
	OPEN curSZAMLATETEL;
	REPEAT
		FETCH curSZAMLATETEL INTO
			tetelSzamlafejID,
			tetelTermek,
			tetelMennyiseg,
			tetelAFA,
			tetelEgysegar,
			tetelKategoriaID,
			tetelITJ,
			tetelMeId,
			tetelProductID;
		IF NOT done THEN
			CALL sp_insertinvoiceitem(
				lastid,
				tetelTermek,
				tetelMennyiseg * -1,
				tetelAFA,
				tetelEgysegar,
				tetelKategoriaID,
				tetelITJ,
				tetelMeId,
				tetelProductID);
		END IF;
	UNTIL done END REPEAT;
	CLOSE curSZAMLATETEL;
	SET done = 0;
	OPEN curUNIQUEFIELDS;
	REPEAT
		FETCH curUNIQUEFIELDS INTO
			uniqueUniqueDescID,
			uniqueValue;
		
		IF NOT done THEN
			CALL sp_insertuniquefield(
				uniqueUniqueDescID,
				lastid,
				uniqueValue);				
		END IF;
	UNTIL done END REPEAT;
	CLOSE curUNIQUEFIELDS;
	UPDATE SZAMLAFEJ SET IsSztorno = 1, OrigSzamlafejID = lastid WHERE SzamlafejID = ID; 

A végeredmény természetesen ugyanaz, de a kód áttekinthetősége lényeges eltéréseket mutat. Ismétlem ez szubjektív, de nekem könnyebbséget jelent, hogy a kódban csak egy CALL-t eresztek el, a többit pedig MySQL Query Browser-ben szerkesztem.
Természetesen ez nem zárja ki, hogy mondjuk a MySQL-es rész tárolt eljárásokat használjon míg mondjuk egy Sqlite-os konfiguráció esetén az adatkezelő layert megvalósító osztály maga tartalmazza az SQL utasításokat.