【问题标题】:How to populate Excel ComboBox with data from SQL Server?如何使用 SQL Server 中的数据填充 Excel ComboBox?
【发布时间】:2014-03-27 19:37:02
【问题描述】:

我正在尝试使用来自 SQL Server 的数据填充 Excel 文件中的组合框。

这里是事件代码:

Private Sub Workbook_Open()

ActiveWorkbook.Sheets("Generation").Activate

Set cn = New ADODB.Connection

On Error Resume Next

With cn
    .ConnectionString = "Provider=SQLOLEDB.1;" & _
                        "Integrated Security=SSPI;" & _
                        "Server=" & "192.160.160.150;" & _
                        "Database=" & "em_Consumer;" & _
                        "User Id= " & "User" & _
                        "Password = " & "server123"
    .Open
End With

Set rs = New ADODB.Recordset

sqltextexec = " SELECT name FROM sys.tables WHERE  schema_id = 7 AND name LIKE 'FinalCalculated%' ORDER BY create_date "

rs.Open sqltextexec, cn

rs.MoveFirst

With Sheets("Generation").ComboBox1
    .Clear
    Do
        .AddItem rs![Name]
        rs.MoveNext
    Loop Until rs.EOF

End With

End Sub

此代码在我的计算机和我同事的计算机上也有效(我们来自 DB 团队),但不使用 DB 的分析师不会在文件中填充列表。

程序是否可以使用 Windows 身份验证来连接数据库?

【问题讨论】:

  • 他们是否有权访问您网络上的数据库服务器?该连接字符串使用服务器身份验证(用户名=用户,密码=server123),而不是 Windows 身份验证。
  • 是的,他们有权访问。该用户是专门为分析师创建的,并且使用这些凭据使该文件连接到数据库是一个想法。但我不知道为什么它在我的电脑上有效,而在他们的电脑上无效。
  • 您是否在他们的计算机上运行了程序的逐行调试器?您是否在任何地方都遇到连接错误?还是返回的记录集由于某种未知原因而只是空白?
  • 不,我没有尝试在他们的计算机上运行调试器
  • 如果可能的话,我会建议作为第一步。查明是否建立了 SQL 连接,如果没有,您会得到什么错误响应?如果它们位于不同的子网(例如 192.160.161.150),则它们所在的网络交换机设备将需要转换流量以允许两个网络相互通信。否则,您需要 (1) 允许通过防火墙对 SQL 服务器进行外部访问并让用户通过公共 IP 进行连接,或者 (2) 他们必须使用 VPN。

标签: sql sql-server excel vba


【解决方案1】:

连接字符串错误

您的连接字符串中似乎有错误。用户 ID 后面需要有一个分号。 改变这个

With cn
 .ConnectionString = "Provider=SQLOLEDB.1;" & _
                        "Integrated Security=SSPI;" & _
                        "Server=" & "192.160.160.150;" & _
                        "Database=" & "em_Consumer;" & _
                        "User Id= " & "User" & _
                        "Password = " & "server123"

到这里

With cn
 .ConnectionString = "Provider=SQLOLEDB.1;" & _
                        "Integrated Security=SSPI;" & _
                        "Server=" & "192.160.160.150;" & _
                        "Database=" & "em_Consumer;" & _
                        "User Id= " & "User;" & _
                        "Password = " & "server123"

那是一个难以捉摸的小家伙。


编辑

我无法在此处查明问题,因此此时也许一个可行的示例会更好地帮助您...

Function getSqlData(queryString As String, myUsername As String, myPassword As String, database As String) As Recordset

Dim conn As New ADODB.Connection
Dim rst As Recordset
Dim serverName As String


serverName = "192.160.160.150"


With conn
        .ConnectionString = "Provider=SQLOLEDB.1;" & _
        "Data Source=" & serverName & ";" & _
        "Initial Catalog=" & database & ";User Id=" & myUsername & ";" & _
        "Password=" & myPassword & ";Trusted_Connection=no"
        .Open
End With


Set rst = conn.Execute(queryString)

Set getSqlData= rst

End Function

这将返回您的记录集。

【讨论】:

  • 此外,SSPI 安全集成可以使用 Windows 身份验证 服务器身份验证(尽管对此显然存在一些争论)。我猜它是在你的机器上执行 win auth。
  • 所以也许我可以将 SSPI 更改为 smth else 以仅使用服务器身份验证?
  • @Almazini 我认为推荐使用 SSPI,但是可以,您可以将 Integrated Security 更改为等于 false,这将强制它使用提供的用户名和密码。但是,SSPI 应该使用提供的用户名和密码 if。所以修复语法错误应该可以工作。
  • 我尝试将参数的值更改为 False,现在我也收到错误:运行时错误 214721887 (8004e21)。语法问题修复后没有任何改变:(
  • 我试过了,还是不行。请看下面我的回答。也许功能无法正常工作?
【解决方案2】:

今天我尝试使用@loplateral 帮助从头开始编写它。代码如下:

Private Sub Workbook_Open()

ActiveWorkbook.Sheets("generation").Activate
            
Dim rstt As Recordset

MsgBox "1"
                    
Set rstt = getData()
                         
End Sub

-------------------------------------------------

Private Function getData()

Dim conn As New Connection
Dim rst As Recordset
Dim sqlstring As String
Dim rwcnt As Integer


MsgBox "2"

sqlstring = "SELECT productname FROM dbo.products WHERE recalc = 1"
     
With conn

 .ConnectionString = "Provider=SQLOLEDB.1;" & _
                     "Data Source=192.160.160.150;" & _
                     "Initial Catalog=em_Consumer;" & _
                     "User Id=User;" & _
                     "Password=server!;" & _
                      "Trusted_Connection=no"

.Open

End With

MsgBox "3"

Set rst = conn.Execute(sqlstring)

rwcnt = rst.RecordCount

MsgBox rwcnt

MsgBox "5"

Set getData = rst

MsgBox "6"

End Function

所以当我打开文件时,我会收到消息:

1 表示程序已启动;

2表示进入函数;

3 表示连接没有问题;

!!然后我得到 -1 值作为记录计数,这意味着有问题

我尝试在 Management Studio 中运行此查询,它返回 50 行

然后程序更进一步,我得到 5 和 6 ...

你知道代码有什么问题吗?

---------------------------------------------- H1>

也许它可以提供帮助,代码可以正常工作但在同一文档中返回表而不是记录集:

Sub Button3_Click()

    ActiveSheet.Cells.Clear
               
    Dim qt As QueryTable
    
    sqlstring1 = "SELECT * FROM dbo.Report"
     
    With ActiveSheet.QueryTables.Add(Connection:=getConnectionStr2, Destination:=Range("A3"), Sql:=sqlstring1)

    .Refresh
    
    End With
           
End Sub

----------------------------------

Private Function getConnectionStr2()
'DRIVER={SQL Server};
getConnectionStr2 = "ODBC;DRIVER={SQL Server};" & _
                   "DATABASE=em_Consumer;" & _
                   "SERVER=192.160.160.150;" & _
                   "UID=user;" & _
                   "PWD=server!;"
End Function

【讨论】:

  • 您昨天遇到的运行时错误是因为密码无效。你解决了这个问题吗?
  • @Lopside 很可能是因为缺少分号!现在没有这样的错误。现在我被困在将列表放入记录集
  • 我们可以在聊天中继续此对话以获得实时支持。 Click here to join.
  • 这是个好主意!也许谷歌谈话?我的账户是 almazini (at) gmail
  • @Lopside 嗨!今天来聊聊吧
猜你喜欢
  • 2018-10-13
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多