2016-01-22 66 views
0

使用VBScript,我通过SQL查询和ADO连接对象创建记录集。我需要能够字段名和最大的字段长度写入一个文本文件,基本为一个二维数组中,字段名的格式| FieldLength参数以一个回车符,例如:VBScript记录集字段名称和长度

物数| X (13)
说明| X(92)
截止日期| X(10)

虽然我可以遍历列和写出来的字段名,我解决不了字段长度的问题。代码如下:

Set objColNames = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF14,2,true) 
For i=0 To LF06 -1 
    objColNames.Write(Recordset.Fields(i).Name & "|x(" & Recordset.Fields(i).ActualSize & ")" & vbCrLf) 
Next 

在这种情况下,只将当前所选字段长度。

+0

请定义“当前选择的字段长度”。 –

+0

@ Ekkehard.Horner记录集包含大约100行,我认为它返回第一行或最后一行的ActualSize属性。 –

回答

0

昏暗连接 昏暗的记录

:多一点研究和测试后,我通过创建一个基于字典的记录字段(列)数,然后通过每个项目迭代和评估每个字段的长度解决的问题
Set Connection = CreateObject("ADODB.Connection") 
Set Recordset = CreateObject("ADODB.Recordset") 

Connection.Open LF08 
Recordset.Open LF05,Connection 

LF06=Recordset.Fields.Count 

Set d = CreateObject("Scripting.Dictionary") 
Set objColNames = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF14,2,true) 
For i=0 to LF06 -1 
    d.Add i, 0 
Next 

Dim aTable1Values 
aTable1Values=Recordset.GetRows() 

Set objFileToWrite = CreateObject("Scripting.FileSystemObject").OpenTextFile(LF07,2,true) 

Dim iRowLoop, iColLoop 
For iRowLoop = 0 to UBound(aTable1Values, 2) 
    For iColLoop = 0 to UBound(aTable1Values, 1) 
    If d.item(iColLoop) < Len(aTable1Values(iColLoop, iRowLoop)) Then 
     d.item(iColLoop) = Len(aTable1Values(iColLoop, iRowLoop)) 
    End If 

    If IsNull(aTable1Values(iColLoop, iRowLoop)) Then 
     objFileToWrite.Write("") 
    Else 
     objFileToWrite.Write(aTable1Values(iColLoop, iRowLoop)) 
    End If 
    If iColLoop <> UBound(aTable1Values, 1) Then 
     objFileToWrite.Write("|") 
    End If 
    next 'iColLoop 
    objFileToWrite.Write(vbCrLf) 
Next 'iRowLoop 

For i=0 to LF06 -1 
    d.item(i) = d.item(i) + 3 
    objColNames.Write(Recordset.Fields(i).Name & "|x(" & d.item(i) & ")" & vbCrLf) 
Next 

然后我有两个文本文件,一个带有字段名称和长度,另一个带有查询结果。使用这个,我可以从结果中在CMS(VisualFiles)中创建一个二维数组。

0

如果我理解正确的问题(我不能肯定我做的)....

如果你改变你的SQL语句,你只需要返回一个记录。

Select Max(Len([Matter Number])) as [Matter Number], 
    Max(Len([Description])) As Description, Max(Len([Due Date])) As [Due Date] FROM TableName 

这将返回每个字段的最大长度。然后从那里构建你的输出。

+0

虽然这个方法是动态的,但这个方法是动态的,所以列的数量可能会有所不同,而我可以将列名提取到数组中,但表名将是未知的,更不用说查询中受到的条件子句。评估传递到方法中的sql,我不确定我将如何实现这一点。 –

0

为了得到一个极值项目(最大,最小,...)的集合,你需要在所有元素的循环,对已知的“极值到目前为止”检查当前元素的值:

>> a = Array(1, 3, 2) 
>> x = a(0) 
>> For i = 1 To UBound(a) 
>>  If a(i) > x Then 
>>  x = a(i) 
>>  End If 
>> Next 
>> WScript.Echo x 
>> 
3 
+0

这与我所预期的那种解决方案相吻合,但我不确定您提供的解决方案是否提供了足够的清晰度。你能详细说明使用提供的语法参考吗? –

+0

特别是当你'预期'在我的示例代码中演示的原则时,你肯定可以将它适应于记录集上的外部循环,极值数组(每列一个元素)以及If循环中的当前)字段。 –

+0

虽然我很欣赏你提供的示例代码的回应,但我并不完全理解提供的引用是如何直接与记录集中的字段相关的。这就是为什么我要求你尝试相关的语法示例。 –