محاولة تعلم MySQL والمعاملات
-
19-09-2019 - |
سؤال
على مدار اليومين الماضيين، حاولت كتابة إجراء مخزن في MySQL ولدي بعض مزدوجة الحصول عليها للعمل. آمل أن يكون شخص ما هنا أعطني بعض المدخلات :)
المثال الأول المنشور مخصص عضوية ASP.NET لإنشاء مستخدم جديد. أتوقع إرسال بريد إلكتروني وكلمة مرور إلى DB واحصل على عودة Int للتحقق من كتابة المستخدمين إلى DB.
يمكنني استخدام MySQL DB 5.1 (أعتقد) واكتب SQL إلى Webinterface.
حصلت على 2 سروال، هل يمكن لشخص ما أن يفسر ذلك أيضا :): 1) أنا استخدم محدد، لكن لا أعرف ما يفعله. 2) لست متأكدا مما إذا كان عليك القيام بأشياء أخرى، ثم اضبط AutoCommit = 0 للحصول على المعاملات للعمل، أو إذا كان لدي حتى أن أفعل ذلك.
أعلم أنه كان بإمكاني استخدام عبارة IF / وإلا بدلا من المعاملة، ولكن أود أن أفعل ذلك مع واحد لمعرفة كيفية عمله. (أتوقع استخدامه كثيرا)
الرمز الذي لا أستطيع الوصول إليه:
DELIMITER //
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
DECLARE return_value INT;
BEGIN TRY
START TRANSACTION
INSERT INTO User
(Email
,Password
,Failed_Password_Count
,Creation_Date)
VALUES
(_username
,_Password
,0
,Datetime.Now())
SET return_value = 1;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK
SET return_value = 0;
END CATCH
BEGIN FINALLY
RETURN return_value;
END FINALLY
END//
DELIMITER ;
تحرير: رسالة الخطأ أحصل عليه هو:
1064 - لديك خطأ في بناء جملة SQL الخاص بك؛ حدد الدليل الذي يتوافق مع إصدار خادم MySQL الخاص بك للحصول على بناء الجملة الصحيح لاستخدامه بالقرب من "Int Beving Set Autocommit = 0؛ يعلن العائد_Value int؛ في الخط 4
لا يوجد حل صحيح
نصائح أخرى
للحصول على دعم المعاملات، تأكد من أنك تستخدم محرك تخزين InnoDB بدلا من MyISAM الافتراضي.
فيما يتعلق به هذا القانون نفسه، سيكون سؤالي الأول، لماذا تتغلب على هذا الاستعلام الفردي في المعاملة؟ أيضا، ما هي الأخطاء التي تراها؟
يعيد تحديد محدد أي تسلسل الأحرف التي تستخدمها لإنهاء عبارة SQL. إن إجراء إنشاء كامل هو عبارة واحدة كبيرة وتحتاج إلى إخبار MySQL حيث ينتهي بشيء (سيكون عادة "؛"). ولكن نظرا لأن لديك مجموعة من البيانات الأخرى في "الجسم" (بين البداية والنهاية) من عبارة إنشاء إجراءات إنشاء كل ما يجب انتهاء منه أيضا، فأنت بحاجة إلى إعادة تعريف المحدد حتى لا تنهي بيان إنشاء الإجراء في أول '؛'.
دون إعادة تعريف محدد، تعتقد MySQL أن عبارة إنشاء إجراءات إنشاء تبدو وكأنها وكأنها ثم تبدأ بيان جديد:
CREATE DEFINER=`websharp_dk`@`%` PROCEDURE `CreateUser`(
IN _username VARCHAR(100),
IN _Password VARCHAR(100))
RETURNS INT
BEGIN
SET autocommit = 0;
باستخدام محدد؛ في نهاية البرنامج النصي يغير المحدد إلى "؛" وليس هناك حاجة رغم أنه من الممارسات الجيدة أن تفعل ذلك.