سؤال

أريد تنفيذ قائمة الاستعلامات مقابل قاعدة بيانات Access باستخدام DAO.يبدو أن الأسلوب "Database.Execute()" مناسب لهذا مع ملاحظة أنه يمكنه فقط تنفيذ "الاستعلامات الإجرائية"، وهي الاستعلامات التي لا تُرجع مجموعة نتائج (مرجع MSDN).بالنسبة للاستعلامات التي ترجع السجلات، يمكن استخدام "Database.OpenRecordset()".ترمي كلتا الطريقتين استثناءات في حالة تمرير نوع الاستعلام الخاطئ.

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

هل كانت مفيدة؟

المحلول 3

ومستوحاة @ HansUp في الجواب بحثت قليلا أكثر هيكل QueryDef التي تقدمها واجهة DAO. هيكل له خاصية "نوع" التي يمكنني استخدامها للتمييز بين أنواع مختلفة الاستعلام (<لأ href = "http://msdn.microsoft.com/en-us/library/bb257317.aspx" يختلط = "نوفولو noreferrer" > MSDN ). انتهى بي الأمر مع تنفيذ التالي:

function TAccessDatabase.SQLExec(AName, AQuery: String): Integer;
var
  I: Integer;
  QDef: QueryDef;
  QDefExists: Boolean;
begin
  Result := 0;

  // Lookup querydef in the database
  QDefExists := False;
  for I := 0 to DB.QueryDefs.Count - 1 do
  begin
    QDef := DB.QueryDefs[I];
    if QDef.Name = AName then
    begin
      QDefExists := True;
      break; //-->
    end;
  end;

  // Create query def if it doesn't exists
  if not QDefExists then
  begin
    QDef := DB.CreateQueryDef(AName, AQuery);
    // Refresh is required to get the correct QDef.Type_
    DB.QueryDefs.Refresh;
  end;

  // Execute the query only if it is not a SELECT
  if QDef.Type_ <> dbQSelect then
  begin
    db.Execute(AQuery, dbInconsistent);
    Result := DB.RecordsAffected;
  end;
end;

وشكرا لكم جميعا على الأجوبة المفيدة والتصريحات.

نصائح أخرى

لاحظ أن ADO تنفيذ طريقة يمكن استخدامها بغض النظر عن وجود أو عدم الاستعلام بإرجاع resultset و.

ولكن هل تريد حقا أن تنفيذ جميع 'الاستفسارات'؟ ما إذا كانت تحتوي على SQL DDL؟ تنظر قمت بإنشاء PROCEDURE باستخدام هذا الرمز SQL DDL:

CREATE PROCEDURE qryDropMe AS DROP PROCEDURE qryDropMe;

.)

والوصول يحافظ على جدول نظام مخفي يسمى MSysObjects التي تضم حقل (أعلام) الذي يخزن قيمة تشير إلى نوع الاستعلام. قد تتمكن من محاولة الدالة التالية مع كل من أسماء الاستعلام من القائمة الخاصة بك واستخدام قيمة الإرجاع لتحديد ما إذا كان استخدام Database.Execute () أو Database.OpenRecordset ()

وظيفة يتطلب إذن القراءة للMSysObjects. لقد سمعت تقارير من بعض وصول يحرمون 2007 المستخدمين الإذن لقراءة MSysObjects. ومع ذلك، لم أصادف هذه المشكلة مع Access 2007.

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

وكان الاستعلام DDL الوحيد الذي يمكنني اختبار DROP TABLE (أعلام = 96).

وبالإضافة إلى ذلك، يرجى أن يكون على علم بأن ليس كل "SELECT ... FROM ..." الاستعلامات استعلامات التحديد لهذا الغرض الخاص (إرجاع السجلات). استعلام مثل "SELECT <م> حقول INTO newtable من oldtable." لا يقوم بإرجاع السجلات، وUI الوصول تصنف بأنها استعلام تكوين جدول.

Public Function QueryType(ByVal pQueryName As String) As String
    Dim lngFlags As Long
    Dim strType As String
    Dim strCriteria As String

    strCriteria = "[Name] = """ & pQueryName & """ And [Type] = 5"
    lngFlags = DLookup("Flags", "MSysObjects", strCriteria)

    Select Case lngFlags
    Case 0
        strType = "Select"
    Case 16
        strType = "Crosstab"
    Case 32
        strType = "Delete"
    Case 48
        strType = "Update"
    Case 64
        strType = "Append"
    Case 80
        strType = "Make Table"
    Case 96
        strType = "Drop Table"
    Case 128
        strType = "Union"
    Case Else
        strType = "Flags " & CStr(lngFlags) & " unrecognized"
    End Select

    QueryType = strType
End Function

لماذا لا يمكنك التقاط استثناء القيت وتحليلها؟

هل لديك أي وسيلة لاستخدام تعليمات beginTrans / الاستعادة؟ هل يمكن بعد ذلك إرسال أمر SQL الخاصة بك، وجمع الأخطاء، ثم التراجع عن المعاملات الخاصة بك، بعد أن غادرت قاعدة البيانات الخاصة بك دون تغيير.

وماذا عن استخدام اتصال ADO وأكثر ذكاء إلى حد ما من ADO واحد، حيث الاتصال تعقد مجموعة "أخطاء" وإرجاع بعض البيانات الأخرى مثل عدد السجلات تتأثر؟

تنطبق هذه المعلومات على نوع الاستعلام.لذا:

  • كافة الاستعلامات التي تنفذ أ يختار ...من ... نكون حدد الاستعلامات
  • الجميع إدراج, تحديث, يمسح نكون الاستعلامات الإجرائية

عليك فقط فحص نص أمر SQL للاستعلام لمعرفة ما إذا كان يبدأ بأي من الكلمات الرئيسية المذكورة أعلاه والتصرف وفقًا لذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top