我在名为'StripLead'的模块中编写了一个ms-access函数。我做了一个名为'CallFunction'的单行程序。现在,当我从ms-access调用此过程时,它可以正常工作。但是,当我从C#调用此过程时,我收到错误:
表达式中未定义的函数'Striplead'。
Ms-access模块代码:
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-access procedure“CallFunction”(sql view):
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;
}
}
请说明方法是否不正确。否则,如果有办法从C#调用ms-access函数来获取数据。 我的目标是从ms-access中获取修改后的数据并在C#中填充数据网格。
答案 0 :(得分:3)
Access提供了从SQL查询调用用户定义的VBA函数的功能,但该功能仅限于从Microsoft Access应用程序本身中的进行的查询。这是因为VBA函数需要执行Access应用程序的基础结构(特别是VBA“表达式服务”)。
在您的情况下,您可以使用Microsoft.Office.Interop.Access
在C#代码中运行“真正的”访问查询,但这会产生DAO Recordset
个对象,并且摆弄它与OleDbDataAdapter
合作可能比它的价值更麻烦(如果可能的话)。
你最好在C#中重新创建VBA函数逻辑。