1

ADOを介してデータベーステーブルに対してかなりの量の呼び出しを行っています。物事をDRYに保つという精神で、レコードセットから値の配列を返す次の関数を作成しました。これはうさぎの頭脳ですか?私は主にコンボボックスの値などのセットを取得するために使用しますが、巨大な値には使用しません。使用例(簡潔にするためにエラー処理を削除):

Function getEmployeeList()
    getEmployeeList= Array()
    strSQL =  "SELECT emp_id, emp_name from employees"
    getEmployeeList = getSQLArray( strSQL, "|" )
End Function

次に、返された配列を使ってやりたいことを何でもします。

Function getSQLArray( SQL, delimiter )
'*************************************************************************************
' Input a SQL statement and an optional delimiter, and this function
' will return an array of strings delimited by whatever (pipe defaults)
' You can perform a Split to extract the appropriate values. 
' Additionally, this function will return error messages as well; check for 
' a return of error & delimiter & errNum & delimiter & errDescription
'*************************************************************************************
    getSQLArray = Array()
    Err.Number = 0
    Set objCon = Server.CreateObject("ADODB.Connection") 


    objCon.Open oracleDSN


    Set objRS = objCon.Execute(SQL)

    if objRS.BOF = false and objRS.EOF = false then
        Do While Not objRS.EOF
            for fieldIndex=0 to (objRS.Fields.Count - 1)
                    If ( fieldIndex <> 0 ) Then
                        fieldValue = testEmpty(objRS.Fields.Item(fieldIndex))
                        recordString = recordString & delimiter & fieldValue
                    Else 
                        recordString = CStr(objRS.Fields.Item(fieldIndex))
                    End If
            Next 
            Call myPush( recordString, getSQLArray )
            objRS.MoveNext
        Loop
    End If
    Set objRS = Nothing
  objCon.Close
  Set objCon = Nothing
End Function

Sub myPush(newElement, inputArray)
    Dim i
    i = UBound(inputArray) + 1
    ReDim Preserve inputArray(i)
    inputArray(i) = newElement                                          
End Sub


Function testEmpty( inputValue )
    If (trim( inputValue ) = "") OR (IsNull( inputValue )) Then 
      testEmpty = ""
    Else
        testEmpty = inputValue 
    End If
End Function

私が持っている質問は次のとおりです。すべてのレコードセットオブジェクトの作成/開く/エラー処理をこのような独自の関数呼び出しに抽象化することは意味がありますか?私はRubeGoldbergマシンを構築していますか?このコードを管理している人は誰でも私の名前を呪うでしょう?

関数で実行するのではなく、それを吸い上げていくつかのマクロを記述し、ADO接続コードを吐き出す必要がありますか?

私はaspに非常に慣れていないので、その機能/ベストプラクティスに穴が開いているので、どんな入力でもいただければ幸いです。

4

3 に答える 3

4

自分のやり方でやっても問題ありません。ADO ライブラリは実際にはそれほどうまく設計されていませんでした。また、それらを直接使用するとコード行が多すぎます。そのため、私は常に、一般的な作業を簡単にするいくつかのユーティリティ関数を用意しています。たとえば、実行するすべての SELECT COUNT(*) に対して、たまたま 1 つの値を返す SQL を実行する "ExecuteScalar" 関数を作成すると非常に便利です。

しかし- あなたのmyPush機能は非常に非効率的です。ReDim Preserveメモリを再割り当てしてすべてをコピーする必要があるため、長い時間がかかります。これにより、O(n 2 ) パフォーマンス、または私がShlemiel the Painterアルゴリズムと呼んでいるものが得られます。推奨されるベスト プラクティスは、たとえば 16 個の値を格納できる配列を薄暗くすることから始め、いっぱいになるたびにサイズを 2 倍にすることです。そうすれば、Lg 2 nReDim Preserve以上呼び出す必要がなくなります。

于 2009-02-07T22:01:11.250 に答える
2

GetRows を使用しないのはなぜですか。配列を返します。詳細については、http ://www.w3schools.com/ado/met_rs_getrows.asp を参照してください。

GetRows に関する注意事項:

Set objRS = Server.CreateObject ("ADODB.Recordset")
objRS.Open cmd, , adOpenForwardOnly, adLockReadOnly

If Not objRS.EOF Then
   astrEmployees = objRS.GetRows()
   intRecFirst   = LBound(astrEmployees, 2)
   intRecLast    = UBound(astrEmployees, 2)

   FirstField  = 0
   SecondField = 1
End If

'2nd field of the fourth row (record) '
Response.Write (SecondField, 3)
于 2009-02-08T18:21:15.827 に答える
0

はい、一般的なタスクを除外することは理にかなっています。一般的な考え方に間違いはないと思います。区切り文字で区切られた文字列の配列を返す理由が不思議です。配列の配列を返すこともできます。

于 2009-02-07T18:25:47.457 に答える