VBA-da SQL so'rovlar qatorini shakllantirish. Microsoft Access VBA-da SQL so'rovidan ma'lumotlarni qanday olish mumkin? VBA tarkibiga kirish uchun SQL so'rovi

Makrosdan foydalanish Ochiq so'rov Access ma'lumotlar bazalarida siz Grid ko'rinishida, Dizayn ko'rinishida yoki Ko'rib chiqish rejimida tanlangan va o'zaro so'rovlarni ochishingiz mumkin. Ushbu harakat o'zgartirish so'rovini keltirib chiqaradi. Shuningdek, so'rov uchun ma'lumotlarni kiritish rejimini tanlashingiz mumkin.

Eslatma: Ushbu so'l faqat Access ma'lumotlar bazasida (MDB yoki ACCDB) mavjud. Agar siz Access Project Environment (ADP) dan foydalanayotgan bo'lsangiz, makrolarni ko'ring OpenView, OpenSavedProcedure va Funktsiyani oching... Ibratli Ochiq so'rov Access veb-ilovalarida mavjud emas.

O'rnatish

Ibratli Ochiq so'rov quyidagi dalillarga ega:

Ibratli argument

Tavsif

Ismni so'rang

Ochish uchun so'rov nomi. Ochiladigan ro'yxatdan ismni tanlang. Bu talab qilinadigan dalil.

Kutubxona ma'lumotlar bazasida so'lni o'z ichiga olgan so'lni bajarishda Ochiq so'rov, Access dastlab kutubxona ma'lumotlar bazasini shu nom bilan so'rovni qidiradi va keyin joriy ma'lumotlar bazasini qidiradi.

So'rov ochiladigan ko'rinish. Qutidagi belgini tanlang Ko'rinish qiymat Jadval, Konstruktor, Oldindan ko'rish, Umumiy jadval yoki Pivot diagrammasi... Sukut bo'yicha Jadval.

Eslatma: PivotTable va PivotChart ko'rinishlari Access 2013 yildan boshlab Access versiyalarida mavjud emas.

Ma'lumotlar rejimi

So'rov uchun ma'lumotlarni kiritish tartibi. Ushbu parametr faqat jadval rejimida ochilgan so'rovlarga tegishli. Iltimos tanlang qo'shish (foydalanuvchilar yangi yozuvlarni qo'shishlari mumkin, ammo mavjudlarini o'zgartirmaydilar), Tahrirlash (foydalanuvchilar mavjud yozuvlarni o'zgartirishlari mumkin, shuningdek yangilarini qo'shishlari mumkin) yoki Faqat o'qish uchun (foydalanuvchilar faqatgina yozuvlarni ko'rishlari mumkin). Sukut bo'yicha Tahrirlash.

Izohlar

Agar bahs uchun Ko'rinish belgilangan qiymat Jadval, Access siz tanlagan so'rovlar, o'zaro so'rovlar, birlashma so'rovlari yoki server so'rovlari, xususiyatlaridan foydalanayotgan bo'lsangiz, natijalar to'plamini aks ettiradi Qaytgan yozuvlar bu muhim Ha... Agar bu mulkni o'zgartirish uchun so'rov, ma'lumotni aniqlash uchun so'rov yoki server so'rovi bo'lsa Qaytgan yozuvlar o'rnatilgan Yo'q, so'rov bajarilmoqda.

Ibratli Ochiq so'rov navigatsiya panelidagi so'rovni ikki marta bosish yoki uni navigatsiya oynasida o'ng tugmasini bosish va ko'rinishni tanlashga o'xshaydi. Makrosdan foydalanganda qo'shimcha variantlarni tanlashingiz mumkin.

Maslahat

    So'rovni Navigatsiya panelidan Ibratli Dizayner oynasiga sudrab borishingiz mumkin. Bu avtomatik ravishda so'l yaratadi Ochiq so'rovso'rovni jadval ko'rinishida ochadi.

    Agar so'rov ochiq bo'lsa, Konstruktorga o'tsangiz, argument qiymati Ma'lumotlar rejimi olib tashlandi. Agar foydalanuvchi jadval holatiga qaytgan bo'lsa ham, ushbu parametr hech qanday ta'sir ko'rsatmaydi.

    Agar siz odatda o'zgartirish so'rovlarini bajarishda paydo bo'ladigan tizim xabarlarini ko'rsatishni xohlamasangiz (ular bu o'zgartirish so'rovi va unga ta'sir qiladigan yozuvlar sonini bildiradi), ularni so'l yordamida o'chirib qo'yishingiz mumkin. SetWarning.

Ibratli dasturni bajarish uchun Ochiq so'rov Visual Basic for Applications (VBA) modulida ushbu usuldan foydalaning Ochiq so'rov ob'ekt DoCmd.

Access myQuery Query Builder yordamida ishlab chiqilgan so'rovni saqlab qoldi. Ma'lumotlar bazasi tizimga ODBC aloqasi orqali ulangan. Makrolarning barchasi kiritilgan.

Ma'lumotlar bazasiga ulanish uchun Excel ADODB ulanishini o'rnatadi

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con \u003d New ADODB.Connection With con .Provider \u003d "Microsoft.ACE.OLEDB.12.0" .Ochiq "MyDatabase.accdb" bilan tugatish

Odatda siz shunchaki ajoyib ishlaydigan SQL-ni yozasiz va keyin shunga o'xshash narsalarni qilasiz

Dim sqlQuery As String sqlQuery \u003d "SELECT * FROM myTable" rs \u003d New ADODB.Recordset rs.Open sqlQuery, con, ... o'rnating.

Lekin men kirish ma'lumotlar bazasida saqlangan so'rovga kirishni xohlayman. Xo'sh, men hozirgina ulangan ma'lumotlar bazasida saqlangan so'rovni qanday chaqiraman.

Oldindan harakat qildim

  1. con.Execute ("EXEC myQuery"), lekin u menga myQuery-ni topa olmasligini aytdi.
  2. rs "myQuery" ni ochadi, lekin u yaroqsiz va undan SELECT so'zlarini talab qiladi / etc

5 javob

Menimcha, siz buni saqlangan protsedura deb o'ylashingiz mumkin.

Agar biz Dim sqlQuery As String oldidan boshlasak

Yangi ADODB.Command cmd.CommandType \u003d adCmdStoredProc cmd.CommandText \u003d "myQuery" cmd.ActiveConnection \u003d con Set rs \u003d cmd.Execute ()

Undan keyin o'z ishingizni yozuvlar to'plami bilan oling.

Siz deyarli u erda edingiz

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con \u003d New ADODB.Connection With con .Provider \u003d "Microsoft.ACE.OLEDB.12.0" .Open "z: \\ docs \\ MyDatabase.accdb" con.Execute bilan tugatish "MyQuery"

Faqat Exec-ni tark eting.

Siz parametrlarni qo'shishingiz mumkin, bu biroz eskirgan, ammo yordam berishi kerak: Access ma'lumotlar bazasidagi 2 maydonni Excel ma'lumotlari va ehtimol so'l bilan yangilash

Access-da allaqachon saqlangan yangilanish so'rovini quyidagilar yordamida bajarishga muvaffaq bo'ldim:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

So'rov nomidagi bo'shliqlarni Access ma'lumotlar bazasida ham, ijro etuvchi bayonotda ham pastki chiziq bilan almashtirguncha, bu menga xatolarni keltirib chiqardi.

Bu xakerlik ishi, ammo siz so'rovni so'rashingiz mumkin. Ya'ni, SQL qatorini quyidagilar bilan almashtiring:

SqlQuery \u003d "SELECT * FROM QueryName;".

Ishga kirishishdan oldin, Access ma'lumotlar bazasi saqlanganligiga ishonch hosil qilishingiz kerak, ya'ni. Ctrl + S tugmalarini bosing (so'rov Access-da ishlashi uchun etarli emas).

Ushbu mavzu yaratilganidan ancha oldin. Agar men to'g'ri tushunsam, foydali narsalarni qo'shishim mumkin. Men OP bayon qiladigan narsaga nom berdim: bu DACD yoki ADOBD orqali VBA-da ishlash uchun ACCDB-da saqlangan so'rovdan SQL-dan foydalanish jarayoni. Men uni "Ob'ekt mulk ta'minotchisi" deb nomladim, hatto yozuvlarimda OPP qisqartmasi bilan va ob'ekt nomining prefiksi / qo'shimchasi uchun ham.

G'oya shundan iboratki, ACCDB-dagi mavjud ob'ekt (odatda so'rov) VBA-da ishlatilishi kerak bo'lgan xususiyatni (odatda SQL) beradi. Buning uchun so'rovlardan SQL so'rish uchun funktsiyani yig'dim; Pastga qarang. Ogohlantirish: Kechirasiz, ammo barchasi DAO-da, men ADODB-dan foydalanmayman. Umid qilamanki, siz hali ham g'oyalarni foydali deb topasiz.

Hatto ushbu OPP so'rovlaridan kelib chiqqan holda SQL-ga almashtiriladigan parametrlardan foydalanish / kiritish usulini ishlab chiqishga borgan edim. Keyin VBA-da SQL-ni ishlatishdan oldin almashtirish uchun VBA.Replace () dan foydalanaman.

ACCDB-da SQL so'roviga DAO yo'li quyidagicha ko'rinadi:

MySqlStatement \u003d Access.Application.CurrentDb.QueryDefs ("myQueryName"). SQL

Nimani almashtirish kerakligini baholash va haqiqiy ma'lumotlar bazasida mavjud bo'lmagan parametr uchun g'ayrioddiy nomni tanlash orqali almashtiriladigan parametrlardan foydalanaman. Ko'pincha, men faqatgina maydon yoki jadval nomlari yoki WHERE va HAVING iboralar o'rnini bosganman. Shuning uchun men ularni "(ReplaceMe00000001)" kabi chaqiraman va keyin ishni bajarish uchun Replace () funktsiyasidan foydalanaman ...

SqlText \u003d VBA.Replace (sqlText, "(ReplaceMe00000001)", "SomeActualParameter")

Va keyin VBA-da sqlText-dan foydalaning. Mana ishlaydigan misol:

Umumiy funktsiya MySqlThing () Dim sqlText sifatida String Dim myParamater sifatida String Dim myExpression sifatida String "Hammasini o'rnating. SqlText \u003d getSqlTextFromQuery (" myQuery ") myParameter \u003d" (ReplaceMe00000001) "myExpression \u003d" SomeDate 31 " ... sqlText \u003d VBA.Replace (sqlText, myParameter, myExpression) "So'ngra SQL.db.Execute sqlText, dbFailOnError End Funksiya funktsiyasi getSqlTextFromQuery (ByVal oppName As String) as String Dim app As AccessApp Dim DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app \u003d Access.Application Set db \u003d app.CurrentDb Set qdefs \u003d db.QueryDefs Set qdef \u003d qdefs (oppName) oppGetSqlText \u003d qdef.SQL End Function

Kirish "myQuery" deb nomlangan so'rov yaratuvchisi bilan ishlab chiqilgan so'rovni saqlab qoldi. Ma'lumotlar bazasi tizimga ODBC aloqasi orqali ulanadi. Makrolarning barchasi kiritilgan.

Excel orqali ma'lumotlar bazasiga ulanish uchun ADODB ulanishiga ega

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con \u003d New ADODB.Connection With con .Provider \u003d "Microsoft.ACE.OLEDB.12.0" .Ochiq "MyDatabase.accdb" bilan tugatish

Odatda siz davom etasiz va shunchaki SQL-ni yozasiz, bu juda yaxshi va keyin siz shunga o'xshash narsalarni qilasiz

Dim sqlQuery As String sqlQuery \u003d "SELECT * FROM myTable" rs \u003d New ADODB.Recordset rs.Open sqlQuery, con, ... o'rnating.

Lekin men kirish ma'lumotlar bazasida saqlangan so'rovga kirishni xohlayman. Xo'sh, men qanday qilib ulangan ma'lumotlar bazasida saqlangan so'rovni chaqira olaman.

Oldindan sinab ko'rdim

  1. con.Execute ("EXEC myQuery") , lekin u menga bu mening savolimni topib bo'lmasligini aytdi.
  2. rs.Open "myQuery", con lekin bu yaroqsiz va undan SELECT / etc so'zlarini talab qiladi
vba excel-vba ms-access-2007 adodb excel

5 javob


6

Menimcha, unga saqlangan protsedura kabi qarash mumkin.

Agar biz Dim sqlQuery As String oldidan boshlasak

Yangi ADODB.Command cmd.CommandType \u003d adCmdStoredProc cmd.CommandText \u003d "myQuery" cmd.ActiveConnection \u003d con Set rs \u003d cmd.Execute ()

Shundan so'ng yozuvlar to'plamini oling.


1

Siz deyarli u erda edingiz:

Dim con As ADODB.Connection Dim rs As ADODB.Recordset Set con \u003d New ADODB.Connection With con .Provider \u003d "Microsoft.ACE.OLEDB.12.0" .Open "z: \\ docs \\ MyDatabase.accdb" con.Execute bilan tugatish "MyQuery"

Faqat Execni bir chetga qoldiring.

Siz parametrlarni qo'shishingiz mumkin, bu biroz eskirgan, ammo yordam berishi kerak:


0

Bu qandaydir xakerlik, ammo siz so'rovni so'rashingiz mumkin. Ya'ni, sql satrini quyidagilar bilan almashtiring:

SqlQuery \u003d "SELECT * FROM QueryName;".

Ushbu dasturni ishga tushirishdan oldin Access ma'lumotlar bazasi saqlanganligiga ishonch hosil qilishingiz kerak, ya'ni. Ctrl + S tugmalarini bosing (Access-da so'rovni bajarish uchun etarli emas).


0

Access-da allaqachon saqlangan yangilanish so'rovini quyidagilar yordamida bajarishga muvaffaq bo'ldim:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

So'rov nomidagi bo'shliqlarni Access ma'lumotlar bazasida ham, ijro etuvchi bayonotda ham pastki chiziqlar bilan almashtirgunimcha, bu menga xatolarni keltirib chiqardi.


0

Ushbu mavzu yaratilganiga ancha vaqt bo'ldi. Agar men hamma narsani to'g'ri tushunsam, foydali narsalarni qo'shishim mumkin. Men OP bayon qilgan narsaga nom berdim, ya'ni DACD yoki ADOBD orqali VBA-da ishlash uchun ACCDB-da saqlangan so'rovdan SQL-dan foydalanish jarayoni. Men unga "Ob'ekt mulk ta'minotchisi" nomini berdim, hatto yozuvlarimda OPP qisqartmasi bo'lsa ham va ob'ekt nomi prefiksi / qo'shimchasi uchun.

G'oya shundan iboratki, ACCDB-dagi mavjud ob'ekt (odatda so'rov) VBA-da ishlatilishi kerak bo'lgan xususiyatni (odatda SQL) beradi. Buning uchun so'rovlardan SQL so'rish uchun funktsiyani yig'dim; pastga qarang. Ogohlantirish: Kechirasiz, ammo bularning hammasi DAOda, men ADODB ni juda ko'p ishlatmayman. Umid qilamanki, siz hali ham ushbu g'oyalarni foydali deb topasiz.

Hatto ushbu OPP so'rovlaridan kelib chiqadigan SQL-ga almashtiriladigan parametrlardan foydalanish / kiritish usulini o'ylab topishga qadar bordim. Keyin VBA-da SQL-ni ishlatishdan oldin almashtirishni amalga oshirish uchun VBA.Replace () dan foydalanaman.

ACCDB-da SQL so'roviga DAO yo'li quyidagicha ko'rinadi:

MySqlStatement \u003d Access.Application.CurrentDb.QueryDefs ("myQueryName"). SQL

O'zgartiriladigan parametrlardan foydalanaman, nima o'zgarishi kerakligini baholayman va parametr uchun haqiqiy bo'lmagan ma'lumotlar nomini tanlayman. Ko'pincha, men faqatgina maydon yoki jadval nomlari yoki WHERE va HAVING iboralar o'rnini bosganman. Shuning uchun ularni "(ReplaceMe00000001)" kabi narsalar deb atayman va keyin ishni bajarish uchun Replace () funktsiyasidan foydalanaman ...

SqlText \u003d VBA.Replace (sqlText, "(ReplaceMe00000001)", "SomeActualParameter") ...

va keyin VBA-da sqlText-dan foydalaning. Mana ishlaydigan misol:

Umumiy funktsiya MySqlThing () Dim sqlText sifatida String Dim myParamater sifatida String Dim myExpression "String sifatida" Hammasini o'rnating. SqlText \u003d getSqlTextFromQuery ("myQuery") myParameter \u003d "(ReplaceMe00000001)" myExpression \u003d "SomeDateOr ... sqlText \u003d VBA.Replace (sqlText, myParameter, myExpression) "So'ngra SQL.db.Execute sqlText, dbFailOnError End Funksiya funktsiyasi getSqlTextFromQuery (ByVal oppName As String) as String Dim app As AccessApp Dim DAO.QueryDefs Dim qdef As DAO.QueryDef Dim sqlText As String Set app \u003d Access.Application Set db \u003d app.CurrentDb Set qdefs \u003d db.QueryDefs Set qdef \u003d qdefs (oppName) oppGetSqlText \u003d qdef.SQL End Function


So'rovni Excel-dan Access MakeTable-da bajaring

Avtomatlashtirishim kerak bo'lgan Excel fayli bor. Foydalanuvchi Excel hisobotini ochganda, undan ma'lumotlarni yangilash so'raladi. Agar ular "ha" deyishsa, men so'rov o'tkazishim kerak ...


VBA funktsiyasini JS ActiveX ADO-dan MS Access 2013-da ko'rish so'rovi orqali bajaring

MS Access 2013 da JS ActiveX ADO-dan ko'rish so'rovi orqali VBA makrosini qanday bajarish kerak? VBA funktsiyasi joriy foydalanuvchini quyidagi tizimga kirish uchun mo'ljallangan: Public Declare ...


Excel-dan kirish db-da "funktsiya" saqlangan so'rovni bajaring

Excel ma'lumotlar bazasida saqlangan so'rovni Excel vba-dan ishlatishga harakat qilaman. Agar men uni ochish va kirish ma'lumotlar bazasida ishga tushirsam, lekin uni moduldan ishga tushirganimda xatoga yo'l qo'ysam, so'rov yaxshi ishlaydi ...


MS Access - VBA-da saqlangan so'rovlarni nomlari bo'yicha bajarish

MS Access 2007 da saqlangan so'rovni VBA-da qanday bajarishim mumkin? SQL-ni VBA-ga nusxalash va joylashtirishni xohlamayman. Men shunchaki so'rov nomini bajaraman. Bu ishlamaydi ... VBA so'rovni topa olmaydi ....


VBA kodidagi ms-access-da so'rovni qanday bajarishim mumkin?

VBA kodi yordamida ms-access ma'lumotlar bazasidagi yozuvlarni qaytarish uchun qanday qilib so'rovni bajarishim mumkin?


Excel-dan kirish so'rovini ishga tushiring va unga paramerts yuboring

Excel VBA kodi yoki so'lidan MS Access db-da so'rovni qanday bajarish kerak. MS-Access so'rovi ba'zi parametrlarni oladi, ularni Excel-dan uzatish kerak. rahmat


Excel ish kitobini Access 2010 VBA-dan boshqaring

Menda quyidagi xabarga juda o'xshash vaziyat mavjud: vba orqali grafik yaratish uchun Excel 2010-ga kirishni so'rash Mening vaziyatimda men jadvalni eksport qilmoqdaman, lekin fayl uchun juda ko'p narsalarni qilishni xohlayman ...


Access VBA-dan SQL Serverning oxirigacha so'rovini bajaring

Menda Access 2007-da saqlangan so'rov orqali UPDATE parol bor. So'rov orqali uzatishni ikki marta bosganimda, u muvaffaqiyatli bo'ladi. VBA-dan qanday qilib ushbu so'rovni olishim mumkin? Men ...


Excelga VBA orqali ulkan ma'lumotlar to'plamini Access-ga import qilish

Excel-dan Access-ga import qilishim kerak bo'lgan juda katta ma'lumotlar to'plami bor (~ 800k qator). Biroq, men 90% gacha bo'lgan ma'lum bir ustun qiymatiga ega qatorlarni e'tiborsiz qoldira olaman ...


Excel vba ichidagi har qanday MDX so'rovi?

excel VBA ichida MDX so'rovini bajarishning bir usuli bormi? Buni ADO orqali amalga oshirish mumkin deb o'ylardim, xuddi SQL bilan bo'lgani kabi (ha, men bilaman SQL MDXdan farq qiladi - bu muammo ko'p marta ...

Hey, men o'zimning SQL-bayonotlarni VBA-ga qanday joylashtirishni (yoki hech bo'lmaganda ularni yozib qo'yishni) o'rgangan edim, lekin qaytib kelgan ma'lumotlarni qanday olishni bilmaymanmi?

Menda odatiy parametrlarni ishlatadigan so'rovlarga asoslangan bir nechta shakllar (shakllar jadvali) bor, ular faqat vaqtni o'zgartiradi (masalan, har qanday narsaning eng yaxshi 10 oylik savdosi kabi). Keyin menda diagramma ob'ektini avtomatik ravishda PowerPoint taqdimotiga o'tkazadigan protseduralar mavjud. Shunday qilib, menda ushbu so'rovlarning barchasi (masalan, 63) oldindan tuzilgan va shakl diagrammasi mos keladi (ha ... .... 63 ... Men buni yomon deb bilaman) va keyin bularning barchasi ochish / yopish uchun o'rnatildi "Keyingisiga olib boradigan voqea (bu mening xakerlikka bo'lgan eng yaxshi urinishim .... yoki domino; qaysi birini xohlasangiz ham).

Shunday qilib, men VBA-da SQL-bayonotlardan qanday foydalanishni bilishga harakat qilardim, shuning uchun oxir-oqibat men u erda hamma narsani qila olaman (bu shakl diagrammalarini saqlashim kerak bo'lishi mumkin, ammo bilmayman, chunki men aniq yo'qolganman tushunish).

Yuqorida bergan savolimdan tashqari, kim maslahat berishi mumkin? rahmat

6 javob

10

Bu biroz eskirgan, shuning uchun siz ushbu mavzu bo'yicha kitobni olishni xohlashingiz mumkin. Ammo, mana shu manbalardan foydalanishning bir tonnasi, shuningdek bir nechta o'quv qo'llanmalar va misollar. Ammo, asosan ...

Dim dbs Ma'lumotlar bazasi sifatida Dim rs As Recordset Dim strSQL As String o'rnating dbs \u003d CurrentDb strSQL \u003d "bu erda sizning so'rovingizni o'rnating rs \u003d dbs.OpenRecordset (strSQL) If Not (rs.EOF And rs.BOF) So'ngra rs.MoveFirst" yordamida natijalarni oling. rs.Fields () Else "Natijalardan foydalaning

Izoh bo'yicha: Post sinfiga qarang. Unda sizning so'rovingizdan qaytarilgan ustunlar bo'lgan maydonlar deb nomlangan to'plam mavjud. O'zingizning sxemangizni bilmaslik, buni aytish qiyin, ammo shunga o'xshash narsa ...

Rs.MoveFirst Do While Not rs.EOF "rs (" SomeFieldName ") rs.MoveNext Loop kabi bir narsa qiling

Aytganimdek, mavzu bo'yicha kitobni qo'lga olishning eng yaxshisi, ularda juda ko'p misollar bor.

Parametrlangan QueryDef-dan foydalaning va uni VBA-dan chaqiring.
So'rovni loyihalashtirish osonroq ... sinovdan o'tkazilishi oson .. va VBA yoki forma yordamida osonlikcha kirish mumkin.

Dim qd querydef seti sifatida qd \u003d currentdb.querydefs! Myquerydef qd.parameters! Parm1 \u003d val1

yoki qd.execute

Dim rs yozuvlar to'plami sifatida rs \u003d qd.openrecordset () o'rnatildi

Qayta ishlashni navbatga qo'shish haqida o'ylashingiz mumkin bo'lgan funktsiya va siz uni kodingizning istalgan joyida qayta ishlatishingiz mumkin.

Shunday qilib, doimiy ravishda yoki SQL bayonotingiz uchun mag'lubiyatni yarating va sanitariya holatiga kiring, NON SQL INJECTED qatorini argument sifatida :)

StrSQL \u003d "SELECT * FROM Customer from WHERE ID \u003d" & EnsureParamIsNotSQLInjection (customerID)

So'ngra ma'lumotlar / yozuvlar to'plami / bayonotni bajarishingiz kerak bo'lgan funktsiya / sub-ga qo'ng'iroq qiling. UPDATE iborasini ishga tushirishingiz yoki bitta qiymatni olishingiz yoki to'liq yozilgan yozuvlarni olishingiz mumkin bo'lgan bir nechta kirish funktsiyalari / sub-ni yaratish orqali.

Bu erda asosiy nuqta - bu xususiyatlarni bir joyda yashash va hamma joyda ishlatishdir. VBScript-dagi misol.

Sub DoStuff (strSQL) Set adoCon \u003d Server.CreateObject ("ADODB.Connection") strConnString \u003d "Provider \u003d Microsoft.Jet.OLEDB.4.0; Data Source \u003d" & Server.MapPath ("db \\ Database.mdb") "strConnString \u003d "DRIVER \u003d (Microsoft Access Driver (* .mdb)); DBQ \u003d "& Server.MapPath (" db \\ Database.mdb ") adoCon.Open strConnString rsMain \u003d Server.CreateObject (" ADODB.Recordset ") rsMain.Open strSQL, adoCon Do While rsMain.EOF customerName \u003d rsain CustomerName ")" bema'ni misol RsMain.MoveNext Loop rsMain.Close Set adoCon \u003d Hech narsa yo'q Sub

Buni amalga oshirishning yana bir usuli, hech kim eslamagan ko'rinadi, grafigingizni bitta saqlangan QueryDef bilan bog'lash va keyin ish vaqtida QueryDef-ni qayta yozish. Endi men saqlangan QueryDefs-ni ko'p kontekstlar uchun o'zgartirishni tavsiya etmayman, chunki bu frontal shishiradi va odatda kerak emas (saqlangan QueryDefs-ni ishlatadigan ko'pgina kontekstlarda u yoki bu tarzda filtrlanishi mumkin, chunki ular kontekstda masalan, RecordSource shakllaridan biri sifatida foydalaniladi, faqat bitta argumentni DoCmd.OpenForm ga o'tkazasiz).

Grafiklar boshqacha, chunki SQL haydovchi grafikalarini ish vaqtida o'zgartirish mumkin emas.

Ulardan ba'zilari variantlarni taklif qilishdi, lekin parametrlari bo'lgan SQL satridan foydalanadigan grafik bilan shaklni ochish standart variantlar dialog oynasini ochadi. Bunga yo'l qo'ymaslikning bir usuli - mezonlarni yig'ish uchun dialog shaklidan foydalanish va so'ngra parametr sifatida dialog oynasidagi boshqaruv elementlariga havolalarni o'rnatish va hk.:

PARAMETRLAR !! Uzoq;

Agar siz formadagi ma'lumotnomalardan foydalanayotgan bo'lsangiz, buni amalga oshirishingiz muhim, chunki Access 2002 dan boshlab, Jet Expression Service ularni boshqarish har doim ham Null bo'lganda to'g'ri ishlamaydi. Ularni parametr sifatida aniqlash bu muammoni to'g'irlaydi (Access XP ga qadar bo'lmagan).

Grafik uchun QueryDef-ni qayta yozishingiz kerak bo'lgan holatlardan biri, agar siz foydalanuvchiga TOP N SQL bayonotida N ni tanlashiga ruxsat berishni xohlasangiz. Boshqacha qilib aytadigan bo'lsak, TOP 5 yoki TOP 10 yoki TOP 20 ni tanlashni xohlasangiz, saqlangan QueryDef-ni o'zgartirishingiz kerak bo'ladi, chunki N ni parametrlash mumkin emas.

Ushbu darsga e'tibor qaratiladi SQL so'rovlari ma'lumotlar bazasiga VBA-ga kirish... VBA-da ma'lumotlar bazasiga INSERT, UPDATE, DELETE so'rovlari qanday bajarilishini ko'rib chiqamiz, shuningdek SELECT so'rovidan ma'lum bir qiymatni olishni o'rganamiz.

Dasturlashtiradiganlar VBA-ga kirish SQL-server ma'lumotlar bazasi bilan ishlash paytida ular ma'lumotlar bazasiga SQL so'rov yuborish kabi juda sodda va zarur vazifalar bilan duch kelishadi, INSERT, UPDATE yoki oddiy SQL SELECT so'rovi. Va biz boshlang'ich dasturchilar ekanmiz, biz ham bunga qodir bo'lishimiz kerak, shuning uchun bugun biz buni qilamiz.

Biz SQL-serverdan ma'lumotlarni qabul qilish mavzusiga to'xtalib o'tdik, u erda biz ushbu ma'lumotlarni olish uchun faqat VBA-da kod yozgan edik, masalan, MSSql 2008-dan matnli faylga ma'lumotlarni tushirish haqidagi maqolada yoki shuningdek, ma'lumotni Word va Excel shabloniga kirish ma'lumotlaridan tushirish. ammo u erda u yoki bu tarzda biz uni yuzaki ko'rib chiqdik va bugun men bu haqda batafsilroq gaplashishni taklif qilaman.

Eslatma! Quyidagi barcha misollar Access 2003 ADP loyihasi va MSSql 2008 ma'lumotlar bazasidan foydalangan holda ko'rib chiqiladi, agar siz umuman ADP loyihasi nima ekanligini bilmasangiz, biz buni Access ADP loyihasini yaratish va sozlash bo'yicha materialda ko'rib chiqdik.

Misollar uchun dastlabki ma'lumotlar

Aytaylik, bizda test_jadval mavjud bo'lib, unda yil raqamlari va oylari nomlari keltiriladi (so'rovlar yordamida amalga oshiriladi) Boshqaruv studiyasi)

Jadval yarating. (NULL EMAS, (50) NULL) YO'LIDA

Aytganimdek, biz MS SQL 2008 bilan ishlash uchun tuzilgan ADP loyihasidan foydalanamiz, unda men test formasini yaratdim va imzo bilan boshlash tugmachasini qo'shdim "Yugur"biz kodimizni sinab ko'rishimiz kerak, ya'ni. biz barcha kodlarni voqealarni ko'rib chiquvchiga yozamiz " Tugmani bosing».

VBA INSERT, Yangilash, o'chirish so'rovlari

Uzoq vaqtga cho'zilmaslik uchun, darhol boshlaymiz, aytaylik, test jadvalimizga qator qo'shishimiz kerak ( kod izohlanadi)/

Private Sub start_Click () "Dim sql_query so'rovlar qatorini saqlash uchun o'zgaruvchini e'lon qilish" Bizga kerak bo'lgan so'rovni yozing sql_query \u003d "INSERT INTO test_table (id, name_mon) VALUES (" 6 "," June ")" "Uni bajaring DoCmd. RunSQL sql_query End Sub

Bunday holda, so'rov ma'lumotlar bazasiga ulanishning joriy parametrlari yordamida amalga oshiriladi. Ma'lumot qo'shilgan yoki qo'shilmaganligini tekshirishimiz mumkin.

Ko'rib turganingizdek, ma'lumotlar kiritilgan.

Bir qatorni o'chirish uchun quyidagi kodni yozing.

Private Sub start_Click () "So'rovlar qatorini saqlash uchun o'zgaruvchini e'lon qiling Dim sql_query String sifatida" Unga o'chirish so'rovini yozing sql_query \u003d "Test_table WHERE id \u003d 6" "Uni bajaring DoCmd.RunSQL sql_query End Sub

Agar tekshirib ko'rsak, kerakli satr o'chirilganligini ko'ramiz.

Ma'lumotni yangilash uchun sql_query o'zgaruvchisiga yangilash so'rovini yozing, umid qilamanki ma'nosi aniq.

VBA bazasiga qarshi so'rovni tanlang

SQL-ning qolgan tuzilmalariga qaraganda bu erda narsalar biroz qiziqroq.

Birinchidan, aytaylik, biz barcha ma'lumotlarni jadvaldan olishimiz kerak va, masalan, biz ularni qayta ishlaymiz va xabarda ko'rsatamiz va siz, albatta, undan boshqa maqsadlarda foydalanishingiz mumkin, buning uchun quyidagi kodni yozamiz

Private Sub start_Click () "O'zgaruvchilarni e'lon qilish" Ma'lumotlar bazasidan yozuvlar to'plami uchun Dim RS As ADODB.Recordset "So'rovlar qatori Dim sql_query As String" Xabarda xujjatli ma'lumotlarni aks ettirish uchun satr "Dim str As String" yozuvlar to'plami uchun yangi ob'ekt yarating RS \u003d Yangi ADODB .Recordset "Query string sql_query \u003d" SELECT id, name_mon FROM test_table "" So'rovni joriy loyiha ulanish sozlamalari yordamida bajaring. RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Yozuvlar davomida aylanmagan holda (RS.EOF)" To'ldiring " str \u003d str & RS.Fields ("id") & "-" & RS.Fields ("name_mon") & vbnewline xabarlarini ko'rsatish uchun keyingi yozuvga o'ting RS.MoveNext Wend "Xabarni ko'rsatish msgbox str End Sub

Bu erda biz VBA Access ko'chadan yozuvlar to'plamidagi barcha qiymatlarni takrorlash uchun foydalanmoqdamiz.

Ammo, ko'pincha yozuvlar to'plamidan barcha qiymatlarni emas, balki faqat bittasini, masalan, kodni oy nomini olish kerak bo'ladi. Va buning uchun loopdan foydalanish qandaydir qimmatga tushadi, shuning uchun biz faqat bitta qiymatni qaytaradigan so'rovni yozishimiz va unga murojaat qilishimiz mumkin, masalan, biz 5-kod bo'yicha oy nomini olamiz

Private Sub start_Click () "O'zgaruvchilarni e'lon qilish" Ma'lumotlar bazasidan olingan yozuvlar to'plami uchun Dim RS As ADODB.Recordset "So'rovlar qatori Dim sql_query As String" String umumiy qiymatni ko'rsatish uchun Dim str As String "Yozuvlar to'plami uchun yangi ob'ekt yarating RS \u003d New ADODB.Recordset "Query string sql_query \u003d" Tanlang name_mon FROM test_table WHERE id \u003d 5 "" Biz so'rovni joriy loyiha ulanish sozlamalari yordamida bajaramiz. RS.open sql_query, CurrentProject.Connection, adOpenDynamic, adLockOptimistic "Bizning qiymatimizni oling str \u003d RS.Fields (0) msgbox str Yakuniy pastki

Umumjahonlik uchun bu erda biz allaqachon hujayra nomi bilan emas, balki uning indekslari bo'yicha murojaat qildik, ya'ni. 0, va bu birinchi qiymat Yozuvlar to'plami, oxirida biz qiymatni oldik "May".

Ko'rib turganingizdek, hamma narsa juda oddiy. Agar siz tez-tez bazadan ma'lum bir qiymatni olishingiz kerak bo'lsa ( oxirgi misolda bo'lgani kabi), keyin barcha kodlarni alohida funktsiyaga chiqarishni tavsiya qilaman (VBA Access 2003 da qanday funktsiyani yozish kerak) bitta kirish parametri bilan, masalan, oy kodi ( bizning misolimizni ko'rib chiqsak) va shunchaki, agar bu qiymatni chiqarish zarur bo'lsa, kerakli parametrni kerakli parametr bilan chaqiring va shu bilan VBA kodini sezilarli darajada kamaytiradi va bizning dasturimiz idrokini yaxshilaydi.

Bugungi kun uchun barchasi shu. Omad!

Maqola sizga yoqdimi? Do'stlar bilan bo'lishish uchun: