Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从adodb记录集Excel VBA中的一列中选择不同的值?_Sql_Vba_Excel_Recordset - Fatal编程技术网

Sql 如何从adodb记录集Excel VBA中的一列中选择不同的值?

Sql 如何从adodb记录集Excel VBA中的一列中选择不同的值?,sql,vba,excel,recordset,Sql,Vba,Excel,Recordset,我有一个ADODB。我从DB得到的录音集。我现在必须重复使用这个记录集两次 这是我的记录集示例: Mike Client John Manager Karen Client Joe Sub Brian Manager Dim rs_clone As ADODB.Recordset Set rs_clone = New ADODB.Recordset rs_clone = rs.getrows() 现在我需要得到所有的标题,所以我想得到: Client M

我有一个ADODB。我从DB得到的录音集。我现在必须重复使用这个记录集两次

这是我的记录集示例:

Mike     Client
John     Manager
Karen    Client
Joe      Sub
Brian    Manager
Dim rs_clone As ADODB.Recordset
Set rs_clone = New ADODB.Recordset
rs_clone = rs.getrows()
现在我需要得到所有的标题,所以我想得到:

Client
Manager
Sub
我知道有rs.过滤器,但我不确定是否可以选择与之不同的

我还知道我可以克隆此记录集:

Mike     Client
John     Manager
Karen    Client
Joe      Sub
Brian    Manager
Dim rs_clone As ADODB.Recordset
Set rs_clone = New ADODB.Recordset
rs_clone = rs.getrows()

是否可以只克隆不同的记录?还是有更好的办法?谢谢

在数据库中触发一个sql字符串,这给了您很大的空间来选择想要返回的内容

使用后期绑定的一个小示例,我更喜欢在生产代码中使用,我要求从表列MyColumn中获得一个不同的列表

strConn需要设置为正确的连接字符串

编辑

在这篇文章的帮助下,我无法在数据库中触发sql字符串,我得到了以下解决方案

如果您喜欢早期绑定,则需要参考以下内容:

Microsoft ActiveX数据对象Im使用6.1库 Microsoft脚本运行时这是为了我们可以使用字典 代码如下:

Option Explicit

Global Const strConn As String = _
    "PROVIDER=MySQLprovider;" & _
    "P*SSWORD=MyPword;" & _
    "USER ID=MyLogin;" & _
    "INITIAL CATALOG=MyDB;" & _
    "DATA SOURCE=MyServer;" & _
    "USE PROCEDURE FOR PREPARE=1;" & _
    "AUTO TRANSLATE=True;"


Sub getDistinctRecords()

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionTimeout = 0
cn.Open strConn

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.ActiveConnection = cn

'>>this mimics your record set with non-distinct members
rs.Open _
    "SELECT 'a' as MyCol UNION ALL " & _
    "SELECT 'a' as MyCol UNION ALL " & _
    "SELECT 'b' as MyCol UNION ALL " & _
    "SELECT 'b' as MyCol"

Dim Arr() As Variant
Arr = rs.GetRows() 

Dim d As Scripting.Dictionary
Set d = New Scripting.Dictionary

Dim i As Long
For i = LBound(Arr, 2) To UBound(Arr, 2)
    d(Arr(0, i)) = 1
Next i

Dim v As Variant
For Each v In d.Keys()

    '>>d.Keys() is a Variant array of the unique values in myArray.
    '>>v will iterate through each of them.

    '>>to print to the immediate window
    Debug.Print v
Next v

'=====================
     'tidy up connection
On Error Resume Next
    Set rs.ActiveConnection = Nothing
On Error GoTo 0

If Not (rs Is Nothing) Then
    If (rs.State And 1) = 1 Then rs.Close
    Set rs = Nothing
End If
If Not (cn Is Nothing) Then
    If (cn.State And 1) = 1 Then cn.Close
    Set cn = Nothing
End If

End Sub

在数据库中触发一个sql字符串会给您很大的空间来选择想要返回的内容

使用后期绑定的一个小示例,我更喜欢在生产代码中使用,我要求从表列MyColumn中获得一个不同的列表

strConn需要设置为正确的连接字符串

编辑

在这篇文章的帮助下,我无法在数据库中触发sql字符串,我得到了以下解决方案

如果您喜欢早期绑定,则需要参考以下内容:

Microsoft ActiveX数据对象Im使用6.1库 Microsoft脚本运行时这是为了我们可以使用字典 代码如下:

Option Explicit

Global Const strConn As String = _
    "PROVIDER=MySQLprovider;" & _
    "P*SSWORD=MyPword;" & _
    "USER ID=MyLogin;" & _
    "INITIAL CATALOG=MyDB;" & _
    "DATA SOURCE=MyServer;" & _
    "USE PROCEDURE FOR PREPARE=1;" & _
    "AUTO TRANSLATE=True;"


Sub getDistinctRecords()

Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionTimeout = 0
cn.Open strConn

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.ActiveConnection = cn

'>>this mimics your record set with non-distinct members
rs.Open _
    "SELECT 'a' as MyCol UNION ALL " & _
    "SELECT 'a' as MyCol UNION ALL " & _
    "SELECT 'b' as MyCol UNION ALL " & _
    "SELECT 'b' as MyCol"

Dim Arr() As Variant
Arr = rs.GetRows() 

Dim d As Scripting.Dictionary
Set d = New Scripting.Dictionary

Dim i As Long
For i = LBound(Arr, 2) To UBound(Arr, 2)
    d(Arr(0, i)) = 1
Next i

Dim v As Variant
For Each v In d.Keys()

    '>>d.Keys() is a Variant array of the unique values in myArray.
    '>>v will iterate through each of them.

    '>>to print to the immediate window
    Debug.Print v
Next v

'=====================
     'tidy up connection
On Error Resume Next
    Set rs.ActiveConnection = Nothing
On Error GoTo 0

If Not (rs Is Nothing) Then
    If (rs.State And 1) = 1 Then rs.Close
    Set rs = Nothing
End If
If Not (cn Is Nothing) Then
    If (cn.State And 1) = 1 Then cn.Close
    Set cn = Nothing
End If

End Sub

这在vba Dim rs_克隆中作为ADODB.Recordset=New ADODB.Recordset合法吗?在vb.net中可以,但不确定是否可以在vba的一行中指定变量和实例化。对了,我只是在这里键入了它,但想法很清楚。对不起=永远不会再这样做=rs_clone=rs.getrows似乎无法在我的Excel上运行。这在vba中合法吗?Dim r_clone As ADODB.Recordset=New ADODB.Recordset?在vb.net中可以,但不确定是否可以在VBA的一行中分配变量和实例化。对,我只是在这里键入了它,但想法很清楚。对不起=永远不会再这样做=rs_clone=rs.getrows在我的Excel中似乎不起作用either@KarlRookey它有助于避免版本问题。@ckuhn203-这是所有对象变量的通用语句,还是仅仅用于处理数据库对象?我一直尝试提前绑定,因为它速度更快,但我想我听到你和whytheq说你会受到性能的影响,以减少版本兼容性问题的可能性。这是对的吗?@KarlRookey这是一个一般性的说法。使用vba时,后期绑定减少了臭名昭著的缺少引用。特别是在不同用户使用不同版本软件的情况下。比如说Office2003和Office2010。这里有两个链接,提供了有关该主题的更多信息,这一个在,@ckuhn203很容易使用早期绑定,所以你有intellisense等。然后一旦对代码感到满意,并且所有运行正常,我相信最好是转换到晚期binding@Bryuk在我的情况下,你说我必须用代码做是什么意思?您是否无法使用DISTINCT运算符在数据库中触发sql字符串?@KarlRookey它有助于避免版本问题。@ckuhn203-那么,这是所有对象变量的常规语句,还是仅用于处理数据库对象?我一直尝试提前绑定,因为它速度更快,但我想我听到你和whytheq说你会受到性能的影响,以减少版本兼容性问题的可能性。这是对的吗?@KarlRookey这是一个一般性的说法。使用vba时,后期绑定减少了臭名昭著的缺少引用。特别是在不同用户使用不同版本软件的情况下。比如说Office2003和Office2010。这里有两个链接,提供了有关该主题的更多信息,这一个在,@ckuhn203很容易使用早期绑定,所以你有intellisense等。然后一旦对代码感到满意,并且所有运行正常,我相信最好是转换到晚期binding@Bryuk在我的情况下,你说我必须用代码做是什么意思?是否无法使用DISTINCT运算符在数据库中激发sql字符串?