أمثلة على استعلامات SQL لقاعدة بيانات MySQL. استعلام SQL لإضافة السجلات وإزالتها باستخدام SELECT في عبارة INSERT INTO

في هذه المقالة سوف ننظر ربما في بعض من أهمها استعلامات SQL. هذا استعلامات لإضافة وإزالة السجلات من جدول قاعدة البيانات. لأنه في كثير من الأحيان عليك أن تفعل ذلك إضافة سجلات جديدة إلى الجدول، والقيام بذلك تلقائياً، فهذه المادة مطلوبة للدراسة.

للبدأ استعلام SQL لإضافة سجل جديد إلى الجدول:

أدخل في قيم المستخدمين (تسجيل الدخول والنجاح) ("TestUser"، "123456")

عند إضافة إدخال، يظهر الأمر " ادخل في"، ثم اسم الجدول الذي نقوم بإدراج السجل فيه. ويأتي بعد ذلك بين قوسين أسماء الحقول التي نريد ملئها. ثم بين قوسين بعد الكلمة " قيم"نبدأ في سرد ​​قيم الحقول التي اخترناها. بعد تنفيذ هذا الاستعلام، سيظهر إدخال جديد في جدولنا.

مطلوب في بعض الأحيان تحديث إدخال الجدولولهذا يوجد ما يلي استعلام SQL:

تحديث تسجيل دخول المستخدمين = "TestUser2"، تمرير = "1234560" حيث تسجيل الدخول = "TestUser"

هذا الاستعلام أكثر تعقيدًا لأنه يحتوي على البنية " أين"، ولكن المزيد عنها أدناه. أولاً يأتي الأمر " تحديث"، ثم اسم الجدول، وبعد" تعيين"نحن نصف قيم جميع المجالات التي نريد تغييرها. سيكون الأمر بسيطًا، لكن السؤال الذي يطرح نفسه: " ما هو السجل الذي يجب تحديثه؟". ولهذا السبب يوجد" أين". في هذه الحالة، نقوم بتحديث السجل، الحقل " تسجيل الدخول"ما يهم" TestUser". يرجى ملاحظة أنه إذا كان هناك العديد من هذه السجلات، إذن سيتم تحديث كل شيء على الاطلاق! من المهم جدًا أن تفهم ذلك، وإلا فإنك تخاطر بفقدان طاولتك.

دعونا نتحدث أكثر قليلا عن " أين". بالإضافة إلى عمليات التحقق البسيطة من المساواة، هناك أيضًا عدم مساواة، بالإضافة إلى العمليات المنطقية: وو أو.

تحديث تسجيل دخول المستخدمين = "TestUser2"، المرور = "1234560" حيث المعرف< 15 AND login="TestUser"

ال استعلام SQLسيتم تحديث تلك السجلات، بطاقة تعريفوالتي يوجد منها عدد أقل 15 ومجال " تسجيل الدخول"له معنى" TestUser"أتمنى أن تكون قد فهمت التصميم" أين"لأنه مهم جدًا. بالضبط" أين"تستخدم عندما جلب السجلات من الجداولوهذه هي المهمة الأكثر استخدامًا عند العمل مع قواعد البيانات.

وأخيرا، بسيطة استعلام SQL لحذف السجلات من الجدول:

حذف من المستخدمين حيث تسجيل الدخول = "TestUser2"

بعد الأمر " حذف من" هو اسم الجدول الذي تريد حذف السجلات فيه. بعد ذلك نصف بناء "أين". إذا كان السجل يفي بالشروط الموصوفة، فسيتم حذفه. مرة أخرى، انتبه، اعتمادًا على عدد السجلات التي تستوفي الحالة بعد " أين"، ويمكن حذف أي عدد منهم.

تقوم عبارة INSERT بإدراج سجلات جديدة في جدول. في هذه الحالة، يمكن أن تكون قيم الأعمدة ثوابت حرفية، أو تكون نتيجة تنفيذ استعلام فرعي. في الحالة الأولى، يتم استخدام عبارة INSERT منفصلة لإدراج كل صف؛ في الحالة الثانية، سيتم إدراج العديد من الصفوف التي يتم إرجاعها بواسطة الاستعلام الفرعي.

بناء جملة المشغل كما يلي:

    ادخل في [ (،...) ]

    (قيم(،…))

  1. | (قيم افتراضية)

كما ترون من بناء الجملة المقدم، فإن قائمة الأعمدة اختيارية (الأقواس المربعة في وصف بناء الجملة تشير إلى ذلك). إذا كانت مفقودة، فيجب أن تكون قائمة القيم المدرجة كاملة، أي توفير قيم لجميع أعمدة الجدول. في هذه الحالة، يجب أن يتوافق ترتيب القيم مع الترتيب المحدد بواسطة عبارة CREATE TABLE للجدول الذي تم إدراج الصفوف فيه. بالإضافة إلى ذلك، يجب أن تكون هذه القيم من نفس نوع البيانات مثل الأعمدة التي تم إدخالها فيها. على سبيل المثال، فكر في إدراج صف في جدول المنتج الذي تم إنشاؤه بواسطة عبارة CREATE TABLE التالية:

    إنشاء منتج الجدول

    صانع شار (1) ليس فارغًا،

    نموذج varchar(4) غير فارغ،

    اكتب varchar(7) ليس فارغًا

لنفترض أنك تريد إضافة طراز الكمبيوتر 1157 من الشركة المصنعة B إلى هذا الجدول، ويمكن القيام بذلك من خلال العبارة التالية:

    أدخل في المنتج

    القيم ("B"، 1157، "PC" ) ؛

إذا قمت بتحديد قائمة من الأعمدة، فيمكنك تغيير ترتيبها "الطبيعي":

    أدخل في المنتج (النوع، الموديل، الشركة المصنعة)

    القيم ("PC"، 1157، "B" ) ؛

يبدو أن هذه ميزة غير ضرورية على الإطلاق، مما يجعل التصميم أكثر تعقيدًا. ومع ذلك، فإنه يفوز إذا كانت الأعمدة لها قيم افتراضية. خذ بعين الاعتبار بنية الجدول التالي:

    إنشاء جدول Product_D

    صانع شار (1) NULL،

    نموذج فارشار (4) فارغ،

    اكتب varchar (7) ليس فارغًا افتراضيًا "PC"

لاحظ أن قيم جميع الأعمدة هنا لها قيم افتراضية (أول عمودين فارغان والعمود الأخير من النوع PC). الآن يمكننا أن نكتب:

    أدخل في Product_D (النموذج، الشركة المصنعة)

    القيم (1157، "ب")؛

في هذه الحالة، سيتم استبدال القيمة المفقودة عند إدراج صف بالقيمة الافتراضية - الكمبيوتر الشخصي. لاحظ أنه إذا لم يتم إعطاء عمود قيمة افتراضية في عبارة CREATE TABLE وتم تحديد قيد NOT NULL لمنع استخدام NULL في عمود الجدول هذا، فسيتم افتراض القيمة الافتراضية NULL.

السؤال الذي يطرح نفسه: هل من الممكن عدم تحديد قائمة الأعمدة، ومع ذلك، استخدام القيم الافتراضية؟ الجواب نعم. للقيام بذلك، بدلاً من تحديد القيمة بشكل صريح، استخدم الكلمة المحجوزة DEFAULT :

    أدخل في Product_D

    القيم ("B"، 1158، الافتراضي) ؛

نظرًا لأن جميع الأعمدة لها قيم افتراضية، لإدراج صف بقيم افتراضية، يمكنك الكتابة:

    أدخل في Product_D

    القيم (الافتراضي، الافتراضي، الافتراضي)؛

ومع ذلك، في هذه الحالة، هناك بناء خاص للقيم الافتراضية (انظر بناء جملة عامل التشغيل)، والذي يمكن من خلاله إعادة كتابة عامل التشغيل أعلاه في النموذج

    أدخل في القيم الافتراضية للمنتج_D؛

لاحظ أنه عند إدراج صف في جدول، يتم التحقق من جميع القيود المفروضة على هذا الجدول. يمكن أن تكون هذه قيود المفتاح الأساسي أو قيود الفهرس الفريدة، أو قيود التحقق، أو قيود التكامل المرجعي. إذا تم انتهاك أي قيد، فسيتم رفض إدراج الصف. دعونا الآن ننظر في حالة استخدام استعلام فرعي. لنفترض أننا بحاجة إلى إدراج جميع الصفوف من جدول المنتج المتعلقة بنماذج الكمبيوتر الشخصي في جدول Product_D (النوع = "كمبيوتر شخصي"). نظرًا لأن القيم التي نحتاجها موجودة بالفعل في بعض الجداول، فإن إنشاء الصفوف المدرجة يدويًا يعد، أولاً، غير فعال، وثانيًا، قد يؤدي إلى حدوث أخطاء في الإدخال. يؤدي استخدام استعلام فرعي إلى حل هذه المشكلات:

إن استخدام الرمز "*" في الاستعلام الفرعي له ما يبرره في هذه الحالة، حيث أن ترتيب الأعمدة هو نفسه لكلا الجدولين. إذا لم يكن الأمر كذلك، فسيتعين تطبيق قائمة الأعمدة إما في عبارة INSERT أو الاستعلام الفرعي أو كليهما، مما سيطابق ترتيب الأعمدة:

هنا، كما كان من قبل، لا يمكنك تحديد جميع الأعمدة إذا كنت تريد استخدام القيم الافتراضية الموجودة، على سبيل المثال:

في هذه الحالة، سيتم استبدال عمود النوع في جدول Product_D بالقيمة الافتراضية PC لجميع الصفوف المدرجة.

لاحظ أنه عند استخدام استعلام فرعي يحتوي على مسند، سيتم إدراج فقط تلك الصفوف التي تكون قيمة المسند لها TRUE (ليست غير معروفة!). بمعنى آخر، إذا كان عمود النوع في جدول المنتج NULLable، وكانت هذه القيمة موجودة في عدد من الصفوف، فلن يتم إدراج تلك الصفوف في جدول Product_D.

تتيح لك التقنية الاصطناعية لاستخدام استعلام فرعي يشكل صفًا باستخدام جملة UNION ALL التغلب على القيود المفروضة على إدراج صف واحد في عبارة INSERT عند استخدام مُنشئ الصف في جملة VALUES. لذا، إذا أردنا إدراج عدة صفوف باستخدام عبارة INSERT واحدة، فيمكننا كتابة:

    أدخل في Product_D

    اختر صانع "B" AS، موديل 1158 AS، نوع "PC" AS

    الاتحاد الكل

    اختر "ج" 2190 "كمبيوتر محمول"

    الاتحاد الكل

    حدد "د"، 3219، "طابعة"؛

يعد استخدام UNION ALL أفضل من UNION حتى لو تم ضمان عدم وجود صفوف مكررة، لأنه في هذه الحالة لن يتم إجراء أي فحص لإزالة التكرارات.

تجدر الإشارة إلى أن إدراج صفوف متعددة باستخدام مُنشئ الصف قد تم تنفيذه بالفعل نظام إدارة قواعد البيانات العلائقية (DBMS)، الذي طورته شركة مايكروسوفت.لغة الاستعلام الهيكلية) هي لغة كمبيوتر عالمية تستخدم لإنشاء البيانات وتعديلها ومعالجتها في قواعد البيانات العلائقية.خادم قاعدة البيانات 2008. بالنظر إلى هذا الاحتمال، يمكن إعادة كتابة الاستعلام الأخير على النحو التالي:

    أدخل في قيم Product_D

    ("ب"، 1158، "كمبيوتر شخصي")،

    ("C"، 2190، "كمبيوتر محمول")،

يتم استخدام عبارات SQL INSERT INTO و INSERT SELECT لإدراج صفوف جديدة في الجدول. هناك طريقتان لاستخدام التعليمات:

  1. القيم فقط: تتضمن الطريقة الأولى تحديد قيم البيانات المراد إدراجها فقط دون أسماء الأعمدة.

بناء الجملة:

INSERT INTO table_name VALUES (value1, value2, value3,...); اسم_الجدول: اسم الجدول. value1, value2,.. : قيم العمود الأول، العمود الثاني،... للسجل الجديد

  1. أسماء الأعمدة وقيمها: الطريقة الثانية تحدد أسماء الأعمدة وقيم الصفوف المراد إدراجها:

بناء الجملة:

INSERT INTO table_name (column1, column2, column3,..) القيم (value1, value2, value3,...); اسم_الجدول: اسم الجدول. column1: اسم العمود الأول، العمود الثاني... value1، value2،.. : قيم العمود الأول، العمود الثاني،... للسجل الجديد

الطلبات:

طريقة 1 ( إدراج القيم فقط):

أدخل في قيم الطالب ("5"، "قاسي"، "غرب البنغال"، "8759770477"، "19")؛

نتيجة :

بعد استخدام INSERT INTO SELECT، سيبدو جدول الطالب الآن كما يلي:

ROLL_NO اسم عنوان هاتف عمر
1 كبش دلهي 9455123451 18
2 راميش جورجاون 9562431543 18
3 سوجيت روهتاك 9156253131 20
4 سوريش دلهي 9156768971 18
3 سوجيت روهتاك 9156253131 20
2 راميش جورجاون 9562431543 18
5 صارِم ولاية البنغال الغربية 8759770477 19

الطريقة الثانية ( إدراج القيم في أعمدة محددة فقط):

أدخل في قيم الطالب (ROLL_NO، الاسم، العمر) ("5"، "PRATIK"، "19")؛

نتيجة :

سيبدو جدول الطالب الآن كما يلي:

ROLL_NO اسم عنوان هاتف عمر
1 كبش دلهي 9455123451 18
2 راميش جورجاون 9562431543 18
3 سوجيت روهتاك 9156253131 20
4 سوريش دلهي 9156768971 18
3 سوجيت روهتاك 9156253131 20
2 راميش جورجاون 9562431543 18
5 براتيك باطل باطل 19

لاحظ أن الأعمدة التي لم يتم تحديد قيم لها يتم تعيينها على null .

استخدام SELECT في عبارة INSERT INTO

يمكنك استخدام عبارة MySQL INSERT SELECT لنسخ الصفوف من جدول واحد وإدراجها في جدول آخر.

استخدام هذا البيان يشبه استخدام INSERT INTO. الفرق هو أن عبارة SELECT تستخدم لتحديد البيانات من جدول آخر. فيما يلي الطرق المختلفة لاستخدام INSERT INTO SELECT:

  • إدراج كافة أعمدة الجدول: يمكنك نسخ كافة البيانات الموجودة في جدول ولصقها في جدول آخر.

بناء الجملة:

أدخل في first_table SELECT * FROM Second_table؛ first_table: اسم الجدول الأول. Second_table: اسم الجدول الثاني.

استخدمنا عبارة SELECT لنسخ البيانات من جدول واحد وعبارة INSERT INTO لإدراجها في جدول آخر.

  • إدراج أعمدة الجدول الفردية. يمكنك فقط نسخ أعمدة الجدول التي تريد لصقها في جدول آخر.

بناء الجملة:

أدخل في first_table(column_names1) حدد column_names2 من Second_table؛ first_table: اسم الجدول الأول. Second_table: اسم الجدول الثاني. col_names1: أسماء الأعمدة المفصولة بفاصلة (،) للجدول 1. col_names2: أسماء الأعمدة المفصولة بفاصلة (،) للجدول 2.

استخدمنا عبارة SELECT لنسخ البيانات فقط من الأعمدة المحددة في الجدول الثاني وعبارة MySQL INSERT INTO SELECT لإدراجها في الجدول الأول.

  • نسخ صفوف معينة من الجدول. يمكنك نسخ صفوف معينة من جدول للصقها لاحقًا في جدول آخر باستخدام عبارة WHERE مع عبارة SELECT. في هذه الحالة، تحتاج إلى استخدام الشرط المناسب في WHERE.

بناء الجملة:

الجدول 2: الطالب الجانبي

ROLL_NO اسم عنوان هاتف عمر
7 سوفيك دمدم 9876543210 18
8 نيراج نويدا 9786543210 19
9 سوميش روهتاك 9687543210 20

الطلبات:

طريقة 1 ( إدراج كافة الصفوف والأعمدة):

إدراج في تحديد الطالب * من LateralStudent؛

نتيجة :

سيقوم هذا الاستعلام بإدراج كافة البيانات من جدول LateralStudent في جدول Student. بعد استخدام SQL INSERT INTO SELECT، سيبدو جدول الطالب كما يلي:

ROLL_NO اسم عنوان هاتف عمر
1 كبش دلهي 9455123451 18
2 راميش جورجاون 9562431543 18
3 سوجيت روهتاك 9156253131 20
4 سوريش دلهي 9156768971 18
3 سوجيت روهتاك 9156253131 20
2 راميش جورجاون 9562431543 18
7 سوفيك دمدم 9876543210 18
8 نيراج نويدا 9786543210 19
9 سوميش روهتاك 9687543210 20

الطريقة الثانية ( إدراج أعمدة فردية):

أدخل في الطالب (ROLL_NO، الاسم، العمر) حدد ROLL_NO، الاسم، العمر من LateralStudent؛

نتيجة :

سيقوم هذا الاستعلام بإدراج بيانات من أعمدة ROLL_NO وNAME وAge في جدول LateralStudent في جدول Student. سيتم تعيين الأعمدة المتبقية في جدول الطالب على قيمة خالية. بعد استخدام SQL INSERT SELECT، سيبدو الجدول كما يلي:

ROLL_NO اسم عنوان هاتف عمر
1 كبش دلهي 9455123451 18
2 راميش جورجاون 9562431543 18
3 سوجيت روهتاك 9156253131 20
4 سوريش دلهي 9156768971 18
3 سوجيت روهتاك 9156253131 20
2 راميش جورجاون 9562431543 18
7 سوفيك باطل باطل 18
8 نيراج باطل باطل 19
9 سوميش باطل باطل 20
  • تحديد صفوف معينة لإدراجها:

نتيجة :

سيحدد هذا الاستعلام الصف الأول فقط من جدول LateralStudent لإدراجه في جدول Student. بعد استخدام INSERT SELECT، سيبدو الجدول كما يلي:

ROLL_NO اسم عنوان هاتف عمر
1 كبش دلهي 9455123451 18
2 راميش جورجاون 9562431543 18
3 سوجيت روهتاك 9156253131 20
4 سوريش دلهي 9156768971 18
3 سوجيت روهتاك 9156253131 20
2 راميش جورجاون 9562431543 18
7 سوفيك دمدم 9876543210 18

هذا المنشور هو ترجمة للمقال "SQL INSERT INTO بيان"، الذي أعده فريق المشروع الصديق

في بعض الأحيان، يكون لدى المبرمجين رغبة شديدة في قراءة شيء ما من قاعدة البيانات. يصبح المبرمجون عصبيين وسريعي الانفعال، ويفقدون النوم ويشيرون بأصابعهم بشكل محموم إلى لوحة المفاتيح. من أجل مصلحة الجميع والسلام العالمي، دعونا نلقي نظرة على بعض إدارة قواعد البيانات البسيطة من C# باستخدام ADO.NET وOLE DB. على الرغم من أن هذه الآلية تدعم قواعد بيانات مختلفة مثل Oracle، إلا أننا سنستخدم هنا والآن MS SQL Server.

مهمتان رئيسيتان عند العمل مع قاعدة البيانات

2. تنفيذ أمر SQL للقيام بشيء ما على الخادم (إدراج أو تحديث أو حذف أو استدعاء وظيفة أو إجراء مخزن

3. قراءة متتابعة من خط التحديد سطرًا تلو الآخر. يتم استخدامه بشكل أساسي في تطبيقات الويب؛ وفي تطبيقات سطح المكتب، من الأسهل تنزيل التحديد بأكمله في ذاكرة الوصول العشوائي مرة واحدة؛

4. حالة نادرة. التحديث التلقائي لجدول في قاعدة البيانات بناءً على التغييرات في DataTable (يتم تحريره عادةً من خلال واجهة مرئية). في الحياة الواقعية، تتم قراءة البيانات عادةً من خلال استعلام أو عرض معقد لربط الكومة، لذا فإن المزامنة التلقائية ليست مناسبة.

الفئات الرئيسية المستخدمة لهذه الأغراض: OleDbConnection - اتصال بقاعدة البيانات، تم إنشاؤه باستخدام سلسلة تحتوي على معلمات الاتصال، فتح، إغلاق، OleDbCommand - تم إنشاؤه باستخدام مثيل اتصال وأمر SQL، إذا كنت بحاجة فقط إلى إجراء تحديث أو الحصول على قيمة واحدة، فهذه فئة كافية، OleDbDataAdapter - تم إنشاؤه باستخدام OleDbCommand، وهو متخصص في قراءة مجموعات الصفوف في DataTable لمرة واحدة، ويمكنه إنشاء أعمدة DataTable تلقائيًا بناءً على التحديد، ونقل التغييرات من DataTable إلى جدول في قاعدة البيانات، OleDbDataReader - القراءة المتسلسلة للصفوف في DataTable واحدًا تلو الآخر (يعمل داخليًا OleDbDataAdapter)، DataTable / DataSet - الحاوية الرئيسية للبيانات. يقوم تعداد OleDbType بتخزين أنواع البيانات الخاصة بقاعدة البيانات.

باستخدام System.Data؛ باستخدام System.Data.OleDb؛ // سلسلة الاتصال، يتم استخدام نظام مستخدم Windows (الأمان المتكامل = SSPI؛) string connString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;معلومات الأمان المستمرة=False;Initial Catalog=databaseName;Data Source=serverName"; // سلسلة اتصال بديلة باستخدام مصادقة MS SQL Server // connString = "Provider=SQLOLEDB.1;معلومات الأمان المستمرة=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = new OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter("select COLUMN1, COLUMN2 from TEST_TABLE ORDER BY COLUMN2", dbConn); // سيتم إنشاء البنية الداخلية للجدول الفارغ تلقائيًا بناءً على البيانات المقروءة، إذا تم تحديد بنية الجدول بالفعل (على سبيل المثال، من خلال مجموعة بيانات مكتوبة)، فسيتم كتابة البيانات في أعمدة ذات أسماء متطابقة أو أعمدة جديدة. ستتم إضافة الأعمدة dbAdapter.Fill(someDataTable); // خيار بديل لملء جدول في DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();

2. تنفيذ أمر SQL للقيام بشيء ما على الخادم (إدراج أو تحديث أو حذف أو استدعاء وظيفة أو إجراء مخزن.

ومن الجدير بالذكر بشكل خاص المشاكل المتعلقة بالتواريخ. يعد تنفيذ التواريخ في .Net ملتويًا للغاية - لا يمكن أن تكون التواريخ فارغة في البداية، ولكنها في الحياة الواقعية تكون فارغة طوال الوقت. الحل الصحيح هو استخدام فئة تاريخ خاصة تعمل على تصحيح أخطاء مبرمجي Microsoft. يحتفظ مطورو Lazier بجميع التواريخ في التعليمات البرمجية كسلاسل ويقومون بتحويلها إلى DateTime فقط عند الضرورة، على سبيل المثال عند الكتابة إلى قاعدة بيانات أو DataTable. لا يساعد Nullable DateTime، نظرًا لأن التاريخ الفارغ في الواجهة يجب أن يبدو كسلسلة فارغة، وعند كتابته في قاعدة البيانات كـ DBNull.Value، حتى القيمة الخالية المبتذلة في الكود لا يتم تحويلها إلى هذه القيم دون رقص إضافي معها الدف.

يتضمن الخيار الأول ببساطة دمج سلسلة استعلام. تعتبر ممارسة سيئة وخطيرة بشكل خاص في تطبيقات الويب لأنها معرضة لهجمات القراصنة. لا يتم حل مشكلة التواريخ الفارغة بسهولة. بالإضافة إلى ذلك، عند العمل مع التواريخ، تظهر مشكلة إضافية - تنسيقات مختلفة لسلسلة التاريخ اعتمادًا على الإعدادات الإقليمية لـ .Net Framework وبيئة التطوير وخادم SQL. قد يبدو الأمر سرياليًا - يعمل نفس الاستعلام في SQL Managment Studio، ولكنه يتعطل عند تنفيذه من التعليمات البرمجية. يتم حفظها جزئيًا بواسطة التنسيق الخاص لسلسلة التاريخ، ومع ذلك، يتم ذلك غالبًا في برامج صغيرة للاستخدام الداخلي، والتي لن يعرف العالم الخارجي وجودها أبدًا.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable" , " + dateTimeVariable.ToString("yyyyMMdd") +"); dbCommand.ExecuteNonQuery();

يتضمن الخيار الصحيح إنشاء أمر بمجموعة من المعلمات المكتوبة بقوة. اعتبر أن الفقرة السابقة لم تكن موجودة.

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; إذا (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN"، OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN"، OleDbType.DateTime).Value = Convert.ToDateTime(stringDate); dbCommand.ExecuteNonQuery();

يتم استدعاء الإجراء المخزن بنفس الطريقة تمامًا، ومن أجل التنوع هناك خيار آخر لكتابة القيم في المعلمات (لا يتعلق بالإجراء المخزن على وجه التحديد):

OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1"، OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2"، OleDbType.VarChar); someDbComm.Parameters.Value = "لكل مشكلة دائمًا حل - بسيط ومريح وخاطئ بالطبع"; someDbComm.Parameters.Value = "هنري لويس مينكين"; someDbComm.ExecuteNonQuery(); !}

نسخة موسعة من وصف المعلمة تشير إلى حجم الحقل والارتباط بعمود جدول محدد.

DbCommand.Parameters.Add("VARCHAR_COLUMN"، OleDbType.VarChar، 100، "VARCHAR_COLUMN").Value = stringVariable؛

إذا لم نكن بحاجة إلى ربط معلمة أمر بحقل DataTable محدد، فمن الأفضل عدم تحديد الحجم على الإطلاق، على سبيل المثال، إذا كانت السلسلة أقل من طول Varchar المحدد، فسيضيف إطار عمل .Net الجيد مسافات إلى السلسلة حتى الطول المحدد، مما يؤدي إلى إتلاف البيانات المرسلة إلى الخادم.

تتم قراءة قيمة حقل واحد بواسطة طريقة ExecuteScalar()

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ؟"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; نتيجة int = Convert.ToInt32(dbCommand.ExecuteScalar());

تجدر الإشارة بشكل خاص إلى أن ExecuteScalar يقوم بإرجاع كائن وإذا لم يُرجع الطلب أي شيء على الإطلاق، فستكون النتيجة فارغة وسيفشل التحويل إلى نوع بيانات عادي مع حدوث خطأ. إذا كان هناك موقف ممكن حيث لا نحصل على أي رد، فنحن بحاجة إلى القيام بذلك:

OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ؟"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; نتيجة الكائنObj = dbCommand.ExecuteScalar() نتيجة int = -1; // القيمة الافتراضية تعني نتيجة فارغة if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )

3. قراءة متسلسلة من اختيار سطرًا تلو الآخر
قراءة سطر واحد (يتم قراءة العديد منها في حلقة)؛

OleDbCommand dbCommand = new OleDbCommand(select PERSON_ID, NAME, SURNAME from TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); اسم السلسلة = Convert.ToString(dbReader["NAME"]); سلسلة اللقب = Convert.ToString(dbReader["SURNAME"]); dbReader.Close();

4. حالة نادرة. التحديث التلقائي لجدول في قاعدة البيانات بناءً على التغييرات في DataTable (يتم تحريره عادةً من خلال واجهة مرئية).

من الضروري كتابة أربعة أوامر لـ DbAdapter لكل حالة محتملة - تحديد، إدراج، تحديث، حذف.

DbAdapter.InsertCommand = new OleDbCommand("insert into TEST_TABLE (NAME, FAMIL, AGE) ​​(?, ?, ?)", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // بالنسبة لأنواع البيانات ذات الطول الثابت، يتم تجاهل الطول المحدد في الأمر dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // إضافة أمر تحديث dbAdapter.UpdateCommand = new OleDbCommand("update TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? Where ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NAME", OleDbType.VarChar,100, "NAME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // إضافة أمر حذف dbAdapter.DeleteCommand = new OleDbCommand("حذف من TEST_TABLE حيث المعرف =؟"، dbConnection)؛ dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); حاول ( // ينقل جميع التغييرات من DataTable إلى الجدول في قاعدة البيانات dbAdapter.Update(table);) قبض على (خطأ استثناء) (MessageBox.Show("خطأ في حفظ البيانات!" + خطأ.رسالة); return;) messageBox عرض("تم حفظ التغييرات!");

بالإضافة إلى عبارة SELECT التي تمت مناقشتها سابقًا، تحتوي لغة معالجة البيانات (DML) على ثلاث عبارات أخرى: INSERT وUPDATE وDELETE. مثل عبارة SELECT، تعمل هذه العبارات الثلاثة إما على الجداول أو طرق العرض. تتناول هذه المقالة عبارة INSERT، ويتم تناول العبارتين الأخريين في المقالة التالية.

إدراج بيانإدراج صفوف (أو أجزاء من الصفوف) في جدول. هناك نوعان مختلفان من هذه التعليمات:

INSERT tab_name [(col_list)] القيم الافتراضية | القيم ((افتراضي | NULL | تعبير) [،...n]) INSERT INTO tab_name | view_name [(col_list)] (select_statement | تنفيذ_بيان) اصطلاحات بناء الجملة

يسمح لك النموذج الأول من التعليمات بإدراج صف واحد (أو جزء منه) في الجدول. والنموذج الثاني من عبارة INSERT يسمح لك بإدراج مجموعة نتائج عبارة SELECT أو الإجراء المخزن الذي يتم تنفيذه بواسطة عبارة EXECUTE في جدول. يجب أن يقوم الإجراء المخزن بإرجاع البيانات المراد إدراجها في الجدول. عند استخدامها مع عبارة INSERT، يمكن لعبارة SELECT تحديد قيم من جدول مختلف أو نفس الجدول الذي يتم إدراج البيانات فيه، طالما أن أنواع بيانات الأعمدة المقابلة متوافقة.

بالنسبة لكلا النموذجين، يجب أن يكون نوع البيانات لكل قيمة مدرجة متوافقًا مع نوع البيانات الخاص بعمود الجدول المقابل. يجب وضع جميع البيانات النصية والمؤقتة بين علامتي اقتباس؛ لا يلزم وضع القيم الرقمية بين علامات الاقتباس.

إدراج صف واحد

بالنسبة لكلا نموذجي عبارة INSERT، يعد تحديد قائمة الأعمدة بشكل صريح أمرًا اختياريًا. عدم إدراج الأعمدة هو نفس تحديد جميع الأعمدة في الجدول.

معلمة القيم الافتراضيةإدراج القيم الافتراضية لجميع الأعمدة. يتم إدراج الأعمدة التي تحتوي على نوع بيانات TIMESTAMP أو خاصية IDENTITY بشكل افتراضي مع القيم التي يتم إنشاؤها تلقائيًا بواسطة النظام. بالنسبة لأعمدة أنواع البيانات الأخرى، يتم إدراج القيمة الافتراضية المقابلة غير الخالية إذا كانت متوفرة، أو فارغة بخلاف ذلك. إذا كان العمود لا يسمح بالقيم الخالية ولا يحتوي على قيمة افتراضية محددة، فستفشل عبارة INSERT ويتم عرض رسالة.

يقوم المثال أدناه بإدراج صفوف في جدول الموظف في قاعدة بيانات SampleDb، مما يوضح استخدام عبارة INSERT لإدراج كمية صغيرة من البيانات في قاعدة البيانات:

استخدم SampleDb; أدخل في قيم الموظف (34990، "أندري"، "باتونوف"، "d1")؛ أدخل في قيم الموظف (38640، "أليكسي"، "فاسين"، "d3")؛

هناك طريقتان مختلفتان لإدراج القيم في صف جديد. تستخدم عبارة INSERT في المثال أدناه الكلمة الأساسية NULL بشكل صريح وتقوم بإدراج قيمة NULL في العمود المقابل:

استخدم SampleDb; أدخل في قيم الموظف (34991، "Andrey"، "Batonov"، NULL)؛

لإدراج قيم في بعض (وليس كل) أعمدة الجدول، عادةً ما تحتاج إلى تحديد تلك الأعمدة بشكل صريح. يجب أن تسمح الأعمدة غير المحددة بقيم فارغة أو أن يكون لها قيمة افتراضية محددة.

استخدم SampleDb; أدخل في قيم الموظف (المعرف، الاسم الأول، اسم العائلة) (34992، "أندري"، "باتونوف")؛

المثالان السابقان متساويان. في جدول الموظفين، العمود الوحيد الذي يسمح بالقيم الخالية هو عمود DepartmentNumber، وتم تعطيل جميع الأعمدة الأخرى بواسطة جملة NOT NULL في عبارة CREATE TABLE.

ترتيب القيم في عرض القيمقد تختلف عبارات INSERT عن الترتيب المحدد في عبارة CREATE TABLE. وفي هذه الحالة، يجب أن يتطابق ترتيبها مع الترتيب الذي يتم به إدراج الأعمدة المقابلة في قائمة الأعمدة. فيما يلي مثال على إدراج البيانات بترتيب مختلف عن الأصل:

استخدم SampleDb; أدخل في قيم الموظف (رقم القسم، اسم العائلة، المعرف، الاسم الأول) ("d1"، "باتونوف"، 34993، "أندري")؛

إدراج صفوف متعددة

يقوم النموذج الثاني من عبارة INSERT بإدراج صف واحد أو أكثر تم تحديده بواسطة استعلام فرعي في الجدول. يوضح المثال أدناه كيفية إدراج صفوف في جدول باستخدام النموذج الثاني من عبارة INSERT. في هذه الحالة، يتم تنفيذ استعلام لتحديد أرقام وأسماء الأقسام الموجودة في موسكو، ويتم تحميل مجموعة النتائج الناتجة في جدول جديد تم إنشاؤه مسبقًا.

يحتوي جدول قسم موسكو الجديد الذي تم إنشاؤه في المثال أعلاه على نفس الأعمدة الموجودة في جدول القسم الموجود، باستثناء عمود الموقع المفقود. يقوم الاستعلام الفرعي الموجود في عبارة INSERT بتحديد كافة الصفوف في جدول الأقسام التي تكون قيمة عمود الموقع لها هي "موسكو"، والتي يتم بعد ذلك إدراجها في الجدول الجديد الذي تم إنشاؤه في بداية الاستعلام.

يوضح المثال أدناه طريقة أخرى لإدراج صفوف في جدول باستخدام النموذج الثاني من عبارة INSERT. في هذه الحالة، يتم تنفيذ استعلام لتحديد أرقام الموظفين وأرقام المشروع وتواريخ بدء المشروع لجميع الموظفين الذين يشغلون منصب "مدير" والذين يعملون في المشروع p2 ثم تحميل مجموعة النتائج الناتجة في جدول جديد تم إنشاؤه في بداية الاستعلام:

استخدم SampleDb; إنشاء TABLE ManagerTeam(EmpId INT NOT NULL, ProjectNumber CHAR (4) NOT NULL, EnterDate DATE); أدخل في ManagerTeam (EmpId، ProjectNumber، EnterDate) حدد EmpId، ProjectNumber، EnterDate FROM Works_on WHERE Job = "Manager"؛

قبل إدراج صفوف باستخدام عبارة INSERT، كان جدولا موسكوديبارتمينت وManagerTeam (في الأمثلة أعلاه) فارغين. إذا كان الجدول موجودًا بالفعل ويحتوي على صفوف تحتوي على بيانات، فسيتم إضافة صفوف جديدة إليه.