Как да извикате функция от ms sql сървър от достъп

Има програми за 2013 Access. В тях са линковани таблици от 2008 ms sql на сървъра. Програмите имат формуляри, в които хората редактират данни и промените се записват на сървъра чрез заявки за актуализиране към свързани таблици. Проблемът е, че едно от полетата трябва да бъде записано в криптирана форма. Например, човек въвежда стойността 1342 във формуляра и тя трябва да бъде написана като Lr$k#yi!&

На ms sql сървъра има функции ID_Decrypt, ID_Encrypt (не съхранени процедури, но, подчертавам,скаларни функции), които правят само това криптиране. Те вземат един параметър от тип varchar, дешифрират го \ криптират го и връщат получената стойност, също varchar.

Въпросът е как мога да приложа тези функции към желаното поле в достъпа?

Какво опитах: 1. Направете заявка за актуализация на преминаване в достъпа. В този случай той не ругае непозната функция, което означава, че го вижда. Освен това, ако не дадете входен параметър, той казва, че е необходим параметър; 2. Код във VBA чрез ADO. Използвах около пет различни опции, гугъл на stackoverflow, нито една от тях не работи. Твърде много опции и комбинации в тях. Някой го направи чрез Recordset, някой чрез Command + добави различни варианти на извикването на функцията, a la "select ID_Decrypt ('1234') as res", "exec ID_Decrypt '123'" и други подобни.

Ако може би иматеработеща(т.е. гарантирано е, че работи за вас в подобна ситуация) версия на кода, моля, споделете.

Поставете следния код в събитието „След актуализация“ на формуляра:

Съответно dbo.IDEncrypt е името на скаларната функция на ms sql сървъра, а hostel е базата данни, в която се намира тази функция. Кодът работи със сигурност, идентификаторът се съхранява в базата данни вкриптиран.

Добре. При тази настройка: Опция 1 е проста и не изисква допълнителни жестове. Какво не ти харесва в него, защо ти трябва втори?

Аз лично съм смутен: "на полето при присъединяване." И защо всъщност да не направим съхранена процедура с параметри, да формираме низ от достъп и да изпълним всичко като цяло, а не конкретно да актуализираме едно поле, от страна на сървъра?

В първия случай, въпреки че заявката е изпълнена (поне VBA не се натъква на реда, който е извикан), промените не се запазват. На сървъра има таблица dbo.guest_names, в access тя също е свързана под името dbo_guest_names. Кое трябва да се посочи? Ако dbo.guest_names, необходимо ли е да напишете името на сървъра и преди името на таблицата? По принцип в тази форма заявката вижда само сървърни таблици или и локални? Тоест, мога ли да го използвам за достъп до функции от ms sql сървър и да вмъкна обработените от тях данни в локални таблици?

Можете също да опитате с xp. Но тогава все още имам нужда от пример как да го приложа технически правилно. Извикайте xn от заявка или от VBA и работещ пример. Защото, както казах, примерите за stackoverflow не работят. Може би човек е видял пример там, по някакъв начин го е променил и го е маркирал като решение, въпреки че самият пример може да не е напълно правилен.

Юджийн: а, т.е. това не е идеологически подход. Добре, там всичко е просто. Идеологията трябва да бъде следната: не е нужно да плъзгате в достъпа какво трябва да се направи от страна на сървъра. Т.е. направете ред, вмъкнете вашата функция в него от страната за достъп: -------- Публична функция SQLExecute(QueryText As String) При грешка GoTo err

Dim qdf As QueryDef Set qdf = CreateTempQueryDef(QueryText) 'querydef от функцията връща записи. qdf.ReturnsRecords = False 'изпълнено qdf.Изпълни 'не е забравил да затвори. qdf.Close Exit Function err: MsgBox "Няма връзки със сървъра, моля, обадете се на разработчика", vbInformation, "Сървърна грешка" qdf.Close End Function - тук трябва да посочите името на съществуваща заявка за преминаване. - запишете най-малкото select top 1 от mytable в него и го наречете RunServerSQLHelper

Частна функция CreateTempQueryDef(strSQL като низ, по избор strQdfNamePrefix като низ = "") Като QueryDef ' Dim strQdfName като низ Ако Len(strQdfNamePrefix) > 0 Тогава strQdfName = RandomName("_" & strQdfNamePrefix) Else

Dim qdf As QueryDef Set qdf = CurrentDb.CreateQueryDef(strQdfName, "SELECT 1 FROM RunServerSQLHelper;") 'копира низа за свързване от съществуващ querydef qdf.Connect = CurrentDb.QueryDefs("RunServerSqLHelper").Connect qdf .SQL = strSQL qdf.Returns Records = True qdf.ODBCTimeout = CurrentDb.QueryDefs("RunServerSqLHelper").ODBCTimeout

'върна резултата Set CreateTempQueryDef = qdf End Function -- 'генерира произволно име за обекта за достъп Public Function RandomName(Optional strPrefix As String = "_tmp") As String

'преобразува времето до най-близката стотна от секундата в низ Dim strTimeAsString As String strTimeAsString = CStr(Int(CDbl(Now) * 10000000))

'произволен низ в случай, че извикванията са твърде близки Dim strRndString As String strRndString = CStr(Int(100000 * Rnd + 1))

' формира низа RandomName = strPrefix & "_" & strTimeAsString & "_" & strRndString