2

ループして各行の ID を取得し、データベースをループして csvID を各 dbID と比較する必要がある CSV があります。IDがデータベースに存在する場合は、CSV からの関連情報でレコードを更新します。

しかし、私は(私が知る限り)無限ループに陥っており、そこから抜け出す方法がわかりません。

    Option Explicit
    Server.ScriptTimeout = 2147483647

    dim conn, rs, updatedUser, updatedDate, filePath
    dim deactivateSQL, csvConn, connCSV, csv, sql
    dim dbID, dbSSN, dbLast, dbFirst, dbMiddle, dbGender, dbScl, dbCls
    dim csvID, csvSSN, csvLast, csvFirst, csvMiddle, csvGender
    dim csvScl, csvCls, csvGrd, csvHrm

    updatedUser = Request.Cookies("UserN")
    updatedDate = date() & " " & time()
    filePath    = "\path\to\file"


' Connect to Students.CSV
    csvConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
               Server.MapPath(filePath) &_
              ";Extended Properties='text;HDR=no;FMT=Delimited';"

    Set connCSV = Server.CreateObject("ADODB.Connection")
    connCSV.Open csvConn
    Set csv = Server.CreateObject("ADODB.recordset")
    csv.open "SELECT * FROM Students.csv", connCSV

        temp = csv.RecordCount
        redim toAdd(temp)


    ' Begin looping through Students.csv 
        do until csv.eof

        ' Get Students.csv Column Values 
        ' please disregard the "replace" stuff for now 
            csvID     = replace(replace(csv.fields(0), " ", ""), "'", "")
            csvSSN    = replace(replace(csv.fields(1), " ", ""), "'", "")
            csvLast   = replace(replace(csv.fields(2), " ", ""), "'", "")
            csvFirst  = replace(replace(csv.fields(3), " ", ""), "'", "")
            csvMiddle = replace(replace(csv.fields(4), " ", ""), "'", "")
            csvGender = replace(replace(csv.fields(5), " ", ""), "'", "")
            csvScl    = replace(replace(csv.fields(6), " ", ""), "'", "")
            csvGrd    = replace(replace(csv.fields(7), " ", ""), "'", "")
            csvHrm    = replace(replace(csv.fields(8), " ", ""), "'", "")


        ' Connect to database 
            set conn=Server.CreateObject("ADODB.Connection")
            conn.Provider="Microsoft.Jet.OLEDB.4.0"
            conn.Open "E:/path/to/file/database.mdb"
            set rs=Server.CreateObject("ADODB.Recordset")
            rs.open "SELECT * FROM tblStudent", conn

        ' Begin looping through tblStudents 
            do until rs.eof

            ' Get tblStudents.StudentID 
                dbID     = rs.fields("StudentID")
                dbSSN    = rs.fields("SSN")
                dbLast   = rs.fields("LastName")
                dbFirst  = rs.fields("FirstName")
                dbMiddle = rs.fields("MiddleName")
                dbGender = rs.fields("Gender")
                dbScl    = rs.fields("School")
                dbCls    = rs.fields("Class")

                if dbID = csvID then

                    ' if dbID matches csvID, 
                    ' update tblStudents with the new CSV data 
                    sql = "UPDATE tblStudent SET " &_
                      "Active='Yes' AND " &_
                      "SSN='" & csvSSN & "' AND " &_
                      "LastName='" & csvlast & "' AND " &_
                      "FirstName='" & csvFirst & "' AND " &_
                      "MiddleName='" & csvMiddle & "' AND " &_
                      "Gender='" & csvGender & "' AND " &_
                      "School='" & csvScl & "' AND " &_
                      "GradeLvl='" & csvGrd & "' AND " &_
                      "HomeRoomID='" & csvHrm & "' AND " &_
                      "PrevClass1='" & dbCls & "' AND" &_
                      "lastUpdatedUser='" & updatedUser & "' AND" &_
                      "lastUpdatedDate='" & updatedDate & "'" &_
                     "WHERE StudentID=" & dbID & ";"

                on error resume next
                    conn.execute(sql)

                else
                    ' I am not sure what to do here...
                    ' I thought about creating a dynamic array:
                    ' adding to the array for each ID not found
                    ' however, I am not THAT skilled.
                    ' If someone could help me with that, 
                    ' I would be grateful
                end if

            rs.movenext
            loop

        csv.movenext
        loop



    ' This is the INSERT SQL I need to execute, 
    ' but do not exactly know where it needs to be placed either 
        sql = "INSERT INTO tblStudent (" &_
          "Active, StudentID, SSN, LastName, FirstName, MiddleName, Gender, "&_
          "School, GradeLvl, HomeRoomID, lastUpdatedUser, LastUpdatedDate" &_
        ") VALUES (" &_
          "'Yes', '" & csvID & "', '" & csvSSN & "', '" & csvLast & "', '" &_
              csvFirst & "', '" & csvMiddle & "', '" & csvGender & "', '" &_
              csvScl & "', '" & csvGrd & "', '" & csvHrm & "', '" &_
      updatedUser & "', '" & updatedDate & _
        "');"

        on error resume next
        conn.execute(sql)


    if error<>0 then
        response.cookies("updated") = "no"
        response.cookies("updated").Expires = dateadd("s", 2, now())
        response.redirect("step-5.asp")
    else
        response.cookies("updated") = "yes"
        response.cookies("updated").Expires = dateadd("s", 2, now())
        response.redirect("step-6.asp")
    end if

これは、これを行うための最良の方法でさえないかもしれません。私はここでも提案を受け付けています。しかし、最初にこの作業が必要です。CSV をループし、DB に csvID が存在する場合は DB を更新し、存在しない場合は csvID 行情報を挿入します。

//アップデート

Richard Bensonのおかげで、ほとんどの場合、自分のコードを適切に動作させることができました:

csvLast = replace(csv.fields(2), "'", "")
csvFirst = replace(csv.fields(3), "'", "")
if csv.fields(4) <> NULL then
   csvMiddle = replace(csv.fields(4), "'", "")
else
   csvMiddle = csv.fields(4)
end if

このreplace()機能は姓と名で機能しますが、ミドルネームになると機能しません。そのままにしておくとcsvMiddle = replace(csv.fields(4), "'", "")、ミドルネームフィールドが空になることがあるため、エラーが発生することがあります。これを正しく機能させるにはどうすればよいですか?これは、このコードがスムーズに実行される前の最後の問題である可能性が高いです。

4

3 に答える 3

2

後でこれをより多くのコンテキストに入れようとします。今のところ、dbにない場合は挿入を実行しようとしたときに何をするかについてのポインター、ある場合は更新します。

Set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = "whateveryourconnectionstringis"
rs.Source = "SELECT * FROM Table WHERE ID = '" & intValue & ";"
rs.CursorType = 2
rs.CursorLocation = 3
rs.LockType = 3
rs.Open()

'If at this point we have no records, it doesnt exist so add it and any data all new records need'
If rs.BOF AND rs.EOF Then
    rs.AddNew
    rs("ID") = intValue
End If

    'Update the rest of the fields
rs("Field1") = Value1
rs("Field2") = Value2
rs("Field3") = Value3
rs.Update()

rs.Close()
Set rs = Nothing

ループの方法と通過するループの数によっては、これは集中的すぎる場合がありますが、コードの観点からは最も単純です。

于 2011-10-25T11:09:13.690 に答える
0

私が最初に気付くのは、あなたがloop前にやっているということですrs.movenext。これは、rs.eofを使用して前に進むことがなくrs.movenext、実際に無限ループになるため、決して発生しないことを意味します。

外側の CSV ループに対して正しく行うため、これは単なるタイプミスだと思います。

于 2011-10-24T19:47:12.663 に答える
0

これが私が最終的に使用したもの です(他の誰かがこのような問題に遭遇した場合に備えて)
助けてくれてありがとう。

Server.ScriptTimeout = 2147483647
Response.Buffer = False
on error resume next


dim conn1, conn, rs, updatedUser, updatedDate, filePath, 
dim deactivateSQL, csvConn, connCSV, csv, sql
dim csvID, csvSSN, csvLast, csvFirst, csvMiddle
dim csvGender, csvScl, csvGrd, csvCls, dbCls

    updatedUser = Request.Cookies("UserN")
    updatedDate = date() & " " & time()
    filePath    = "\path\to\file"


' --- Connect to DZ database
    set conn1=Server.CreateObject("ADODB.Connection")
    conn1.Provider="Microsoft.Jet.OLEDB.4.0"
    conn1.Open "E:/path/to/database.mdb"    

' --- Deactivate ALL students
    deactivateSQL = "UPDATE tblStudent SET Active=False " &_
                    "AND lastUpdatedUser='" & updatedUser & "' "&_
                    "AND lastUpdatedDate='" & updatedDate & "';"
    conn1.execute(deactivateSQL)
    conn1.close


    ' --- Connect to Students.CSV exported by iNOW
        csvConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
                       Server.MapPath(filePath) &_
                   ";Extended Properties='text;HDR=no;FMT=Delimited';"

        Set connCSV = Server.CreateObject("ADODB.Connection")
            connCSV.Open csvConn
        Set csv = Server.CreateObject("ADODB.recordset")
            csv.open "SELECT * FROM Students.csv", connCSV


    ' --- Begin looping through Students.csv
        do until csv.eof


        ' --- Get Students.csv Column Values
            csvID     = csv.fields(0)

            if isnull(csv.fields(1)) then
                csvSSN = NULL
            else
                csvSSN = csv.fields(1)
            end if

            csvLast   = replace(csv.fields(2), "'", "")
            csvFirst  = replace(csv.fields(3), "'", "")

            ' --- Using IsNull() fixed the 2nd problem 
            ' --- I was having after updating the question
            if isnull(csv.fields(4)) then
                csvMiddle = csv.fields(4)
            else
                csvMiddle = replace(csv.fields(4), "'", "")
            end if

            csvGender = csv.fields(5)
            csvScl    = csv.fields(6)
            csvGrd    = csv.fields(7)
            csvCls    = csv.fields(8)


        ' --- Connect to database
            set conn=Server.CreateObject("ADODB.Connection")
            conn.Provider="Microsoft.Jet.OLEDB.4.0"
            conn.Open "E:/path/to/database.mdb"
            set rs=Server.CreateObject("ADODB.Recordset")
            rs.open "SELECT * FROM tblStudent " &_
                    "WHERE StudentID='" & csvID & "';", conn

                if rs.bof and rs.eof then

                    ' --- if rs.bof & rs.eof, the csvID is NOT in the table
                    ' --- Add the new csvID to DB, we'll add the rest in 
                    ' --- the UPDATE statement below
                    conn.execute("INSERT INTO tblStudent (StudentID) " &_
                                 "VALUES ('" & csvID & "');")

                    ' --- Set to 0 since it's supposed to be a number
                    dbCls = 0
                else
                    ' --- Get tblStudents.Class from existing record
                    dbCls = rs.fields("Class")
                end if

            ' --- UPDATE the table with the appropriate info
                sql = "UPDATE tblStudent SET " &_
                        "Active=True, " &_
                        "SSN=" & csvSSN & ", " &_
                        "LastName='" & csvlast & "', " &_
                        "FirstName='" & csvFirst & "', " &_
                        "MiddleName='" & csvMiddle & "', " &_
                        "Gender='" & csvGender & "', " &_
                        "School=" & csvScl & ", " &_
                        "GradeLvl=" & csvGrd & ", " &_
                        "Class=" & csvCls & ", " &_
                        "PrevClass1='" & dbCls & "', " &_
                        "lastUpdatedUser='" & updatedUser & "', " &_
                        "lastUpdatedDate='" & updatedDate & "' " &_
                      "WHERE StudentID='" & csvID & "';"

                conn.execute(sql)

            csv.movenext
            loop


    if error<>0 then
        response.cookies("updated") = "no"
        response.cookies("updated").Expires = dateadd("s", 2, now())
        response.redirect("step-5.asp")
    else
        response.cookies("updated") = "yes"
        response.cookies("updated").Expires = dateadd("s", 2, now())
        response.redirect("step-6.asp")
    end if
于 2011-10-27T15:44:23.677 に答える