2012-01-31 11 views
2

私は、フォームから返された値と配列にダンプされたデータベースの値をGetRowsで比較するために設計されたスクリプトを使用しています。チェックの目的は、フォーム値をデータベース値と比較し、データベース内の一致するIDの行のみを更新することです。 これはフォームの隠し変数で行われていますが、ある時点でオンラインでかなりのユーザーがいるため、ユーザーがフォームを完了している間にdbの値が変更される可能性があります。配列に長すぎるLcaseオペレーション

現在のところ、コードではこの比較を実行するために内部ループと外部ループが使用され、一時変数には前述の配列から現​​在のcol/rowが割り当てられています。この値に対してlcaseおよびtrim操作が実行され、一時変数が取得されます。
これはかなりの性能低下を引き起こしています。ループ状態ではなく、そのアレイの作成中にlcase/trim機能が実行される可能性があるのでしょうか?ここ は私のコードです: **注:このは、このように "FastString" と ".Append" データベース側(MS SQL Server 2008の)上で

dim iRowLoop, iColLoop, zRowLoop, strChange, tempDbValsCase 
Set strChange = New FastString 
for iRowLoop = 0 to ubound(arrDbVals, 2) 

    for zRowLoop = 0 to ubound(arrFormComplete) 

     ''#****below line is what is causing the bottleneck, according 
     ''#****to a timer test 
     tempDbValsCase = lcase(trim(arrDbVals(1, iRowLoop))) 
     ''#**** 

     if (mid(trim(arrFormComplete(zRowLoop)),1,8) = trim(arrDbVals(0, iRowLoop))) AND (mid(trim(arrFormComplete(zRowLoop)),9) <> tempDbValsCase) then 

      dim strFormAllVals 
      strFormAllVals = arrFormComplete(zRowLoop) 
      strChange.Append strFormAllVals & "," 

     end if 

    next 

next 

から表、連結のためのFastStringクラスを利用します配列はビットデータ型列 "Complete"を含むGetRowsによって導出されます。 lcaseとtrim操作は配列のこの列で実行されます。ビットデータ型は出力に隠された文字を追加しますか?視覚的には、私は何も検出されませんが、フォーム入力からの値と "True"のような配列の値を比較すると、一致しません。 「完了」列。

+0

を試してみてください? – AnthonyWJones

+0

'TypeName(yourvariable)'を使用して、データベースのデータとフォームのデータが同じ型であるかどうかを比較することができます。 – stealthyninja

+0

ありがとうございます - 私はMS SQL Server 2008を使用しています。 – buck1112

答えて

1

は、使用しているデータベースであり、何

dim iRowLoop, iColLoop, zRowLoop, strChange, tempDbValsCase 
dim iCount1, iCount2, match 

Set strChange = New FastString 

iCount1 = ubound(arrDbVals, 2) 
iCount2 = ubound(arrFormComplete) 

for iRowLoop = 0 to iCount1 

    for zRowLoop = 0 to iCount2 

     ' Assign array lookup to a variable ' 
     tempDbValsCase = arrDbVals(1, iRowLoop) 

     ' ...and then perform operations on it one at a time ' 
     tempDbValsCase = trim(tempDbValsCase) 
     tempDbValsCase = lcase(tempDbValsCase) 

     ' Assign this array lookup to a variable and perform trim on it ' 
     match = trim(arrFormComplete(zRowLoop)) 

     if (mid(match,1,8) = trim(arrDbVals(0, iRowLoop))) AND (mid(match,9) <> tempDbValsCase) then 

      strChange.Append match & "," 

     end if 

    next 

next 
+0

多くのおかげで - 前のコードの代わりにこれを試しましたが、パフォーマンスの時間は同じです。ブール値を早い段階で文字列に変換する方法はありますか? – buck1112

+1

'CStr'や' CBool​​'を使って同じ型の両方の値を作成するのではなく、全く別の方法を試す必要があります。おそらく、より小さな結果セットで作業し、最初の処理が完了した後に次のセットを非同期にロードして処理するようなものでしょう。パフォーマンスの落ち込みの最大の要因は、ネストされた 'for'ループです。両者を分離することができれば、スクリプト全体のスピードが大幅に向上するはずです。 – stealthyninja

+0

あなたの良いアイデアをありがとう!私は彼らを比較しているので、私はそれらをどのように分けることができるのか分かりません。私は、新しい行を挿入すると、トリガによって "Complete"列の値を新しい列にコピーすることができる別のdb列を追加することを考えていました - 同じ値だが異なるデータ型 - たとえば "nvarchar"。私はそれをやるのが好きではありませんが、データ型が選択プロセスの前に存在する可能性がある場合(その時点での変換を避けるため)、それは良いかもしれません。 – buck1112

関連する問題