2013-09-27 3 views
2

Я написал функцию ms-access в модуле под названием «StripLead». Я сделал одну строчную процедуру под названием «CallFunction». Теперь, когда я вызываю эту процедуру из ms-access, она работает нормально. Но когда я называю эту процедуру из C# я получаю ошибку:Как вызвать функцию ms-access из C#?

Undefined function 'Striplead' in expression.

Ms-код доступа модуля:

Public Function StripLead(pstrPhrase As String) As String 
    Dim strFirstWord As String 
    Dim strReturn As String 
    Dim intPos As Integer 

    strReturn = pstrPhrase 
    intPos = InStr(pstrPhrase, " ") 
    If intPos > 0 Then 
    strFirstWord = Left$(pstrPhrase, intPos - 1) 
    Select Case strFirstWord 
     Case "A", "An", "The" 
     strReturn = Right$(pstrPhrase, Len(pstrPhrase) - intPos) 
    End Select 
    End If 

StripLead = strReturn 
End Function 

Ms-доступа процедура "CallFunction" (вид SQL):

SELECT Customers.ID, Striplead([ContactName]) AS a FROM Customers; 

C# код:

public void CallStoredProcedure(string NewQry) 
     { 
      try 
      { 
      DataTable tbl = new DataTable(); 
      using (OleDbConnection connection = new OleDbConnection(ConnectionString)) 
      { 
       OleDbCommand cmd = new OleDbCommand(); 
       cmd.CommandText = "CallFunction"; 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Connection = connection; 

       using (OleDbDataAdapter adp = new OleDbDataAdapter(cmd)) 
       { 
        adp.Fill(tbl); 
       } 
      } 

     } 
     catch(Exception ex) 
     { 
      throw; 
     } 
    } 

Прошу прощения Неправильно ли этот подход. Или, если есть способ сделать вызов функции доступа ms-доступа из C# для извлечения данных. Моя цель - получить измененные данные из ms-access и заполнить datagrid на C#.

ответ

3

Доступ предоставляет возможность вызова пользовательских функций VBA из SQL-запросов, но эта возможность ограничена запросами, которые сделаны от в самом приложении Microsoft Access. Это связано с тем, что для функций VBA требуется, чтобы инфраструктура приложения Access (в частности, служба выражения VBA) выполнялась.

В вашем случае вы можете быть в состоянии работать «реальный» Access запрос из вашего кода С # с использованием Microsoft.Office.Interop.Access, но это даст вам DAO Recordset объект, и возиться с этим работать с OleDbDataAdapter вполне может быть больше проблем, чем это стоит (если это вообще возможно).

Возможно, вам просто лучше будет воссоздать логику функций VBA на C#.

Смежные вопросы