تنفيذ الاستعلامات باستخدام DAO
سؤال
أريد تنفيذ قائمة الاستعلامات مقابل قاعدة بيانات 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 للاستعلام لمعرفة ما إذا كان يبدأ بأي من الكلمات الرئيسية المذكورة أعلاه والتصرف وفقًا لذلك.