2015-02-10 59 views
1

即使表中有记录,我的查询也不会返回任何值。我正在尝试根据输入的姓名检索职业编号。我不断收到消息“没有员工ID”。就Access VBA而言,我是一个新的学习者。我曾与Access表和其他表没有问题。我没有验证表单字段具有正确的值和变量strEmpName未收到查询结果

Set cnn1 = New ADODB.Connection 
    mydb = "C:\accesssamp\Documents\Tasks.accdb" 
    strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & mydb 
    cnn1.Open strCnn 

    'This statement added here just to indicate that I am getting the value 
    strEmpName = cboEmployeeName.Text ' Getting employee name from form field 

    Set cmd = New ADODB.Command 

    With cmd 
     .ActiveConnection = CurrentProject.Connection 
     .CommandText = "SELECT [EmployeeId] FROM [Employees] " & _ 
         "WHERE [EmployeeName] = [strEmpName]" 
     .CommandType = adCmdUnknown 
     .Parameters.Append cmd.CreateParameter(_ 
        "[strEmpName]", adChar, adParamInput, 50) 
     .Parameters("[strEmpName]") = strEmpName 
    End With 

    ' Execute the Query and return the employeeId 
    Set rstEmp = cmd.Execute 

    If rstEmp.RecordCount < 1 Then 
     MsgBox "No Employee Id" 
    Else 
     MsgBox rstEmp(0).Value 
    End If 
+0

'Debug.Print'告诉你什么? – PaulFrancis 2015-02-10 16:42:31

+0

@PaulFrancis我在哪里添加该语句?我浏览了代码并得到了消息框“没有员工ID” – rajeev 2015-02-10 16:49:24

+1

RecordCount对ADO来说可能有点奇怪,尽管使用了立即窗口来获得'firstEmp(0).Value'。为什么使用MS Access而不是DAO使用ADO? DAO是首选。 – Fionnuala 2015-02-10 16:51:34

回答

2

你的样品有多个问题被抓获。我不确定这是否正是您想要的,但它在我的系统上无误地运行。

With cmd 
    '.ActiveConnection = CurrentProject.Connection 
    .ActiveConnection = cnn1 
    .CommandText = "SELECT [EmployeeId] FROM [Employees] " & _ 
        "WHERE [EmployeeName] = [strEmpName]" 
    .CommandType = adCmdUnknown ' or adCmdText; either works 
    .Parameters.Append cmd.CreateParameter(_ 
       "strEmpName", adVarChar, adParamInput, 255, strEmpName) 
End With 

' Execute the Query and return the employeeId 
Set rstEmp = cmd.Execute 

'If rstEmp.RecordCount < 1 Then 
If rstEmp.BOF And rstEmp.EOF Then 
    MsgBox "No Employee Id" 
Else 
    MsgBox rstEmp(0).value 
End If 

注:

  1. 我假设你想从CNN1连接到其他数据库,而不是从CurrentProject.Connection运行查询。
  2. CreateParameter提供兼容数据类型。对于文本参数,请为其最大长度提供一个值。最后包含参数的值。
  3. rstEmp.RecordCount正在返回-1,即小于1,因此即使记录集不为空,您的代码也会显示为“无员工ID”。而不是检查RecordCount,检查记录集是否为空。
+1

它看起来像你做的其他事情,但没有提及(我忘记了这是否真的很重要,但是)你将参数名称从'[strEmpName]'改为' strEmpName'创建参数时。 – Brad 2015-02-10 17:27:09

+0

是的,我做到了,但没关系。使用ADO时,参数名称完全被忽略。 – HansUp 2015-02-10 17:33:21

+0

啊右键,只有顺序很重要。我只是总是说出名字,但我想我总是把它们整理好,所以我也忘记了。谢谢! – Brad 2015-02-10 17:34:48