Можно ли отправить данные в базу данных SQL, дождаться ее завершения, а затем вернуть идентификатор, сгенерированный из SQL, с помощью Classic ASP? - PullRequest
4 голосов
/ 22 апреля 2010

У меня есть форма ASP, которая должна отправлять данные в две разные системы. Сначала данные должны быть помещены в базу данных MS SQL, которая получит идентификатор. Затем мне нужно отправить все эти данные формы во внешнюю систему вместе с этим идентификатором.

Практически все в коде работает просто отлично, данные поступают в базу данных, а данные отправляются во внешнюю систему. Проблема в том, что я не получаю свой идентификатор обратно из SQL при выполнении этого запроса. У меня сложилось впечатление, что это происходит из-за того, как быстро все происходит в коде. Я думаю, что база данных добавляет свою строку в то же время, когда моя страница поста запускает свой запрос для получения идентификатора.

Мне нужно знать, как ждать, пока SQL завершит вставку, или, может быть, подождать определенное время. Я уже пытался использовать хаки для "сна" с ASP, что не помогло.

Я уверен, что смогу добиться этого в .Net, мой опыт больше .Net, чем ASP, но это то, с чем мне приходится работать над моим текущим проектом.

Есть идеи?

EDIT: код записи функции в БД.

driis - Это было мое понимание того, как это должно работать, но мой дополнительный запрос для идентификатора ничего не возвращает, поэтому я считаю, что строка еще не закончила вставку или обновление. Может быть, я ошибаюсь, если это так, это еще больше усложняет. (

В любом случае, здесь указан код функции обновления БД. Имейте в виду, этот код унаследован, остальная часть моего проекта написана мной, но я застрял, используя эти функции от предыдущего разработчика.

Sub DBWriteResult
    Dim connLeads
    Dim sSQL
    Dim rsUser
    Dim sErrorMsg
    Dim sLeads_Connection


  ' Connect to the Leads database
  ' -------------------------------------------------------------------
    sLeads_Connection = strDatabaseConnection


    Set connLeads = CreateObject("ADODB.Connection")
    connLeads.Provider = "SQLOLEDB.1"
    On Error Resume Next
    connLeads.Open sLeads_Connection

    If Err.number <> 0 Then

    ' Bad connection display error
        ' -----------------------------------------------------------------    
       Response.Write "Database Write Error: 001 Contact Programmer"
       Set connLeads = Nothing
       Exit Sub
    Else

    ' Verify the transaction does not already exist. 
    ' -----------------------------------------------------------------------
      Set rsUser = Server.CreateObject("ADODB.Recordset")
      rsUser.LockType = 3
      rsUser.CursorLocation = 3
      sSQL = "SELECT * "             
      sSQL = sSQL & " FROM Leads;" 
      rsUser.Open sSQL, connLeads, adOpenDynamic    

      Response.Write Err.Description
      If Err.number = 0 Then
        ' Add the record
        ' -----------------------------------------------------------
            rsUser.AddNew
            rsUser.Fields("LeadDate") = Date()&" "&Time()
            rsUser.Fields("StageNum") = ESM_StageNum
            rsUser.Fields("MarketingVendor") = ESMSourceData
            rsUser.Fields("FirstName") = ESM_FirstName
            rsUser.Fields("Prev_LName") = Request.Form ("Prev_LName")
            rsUser.Fields("LastName") = ESM_LastName
            rsUser.Fields("ProgramType") = ESM_ProgramType
            rsUser.Fields("ProgramofInterest") = ESM_ProgramofInterest
            rsUser.Fields("Phone1") = Phonenumber
                rsUser.Fields("Phone2") = ESM_Phonenumber2
            rsUser.Fields("Address1") = ESM_Address
            rsUser.Fields("Address2") = ESM_Address2
            rsUser.Fields("City") = ESM_City
            rsUser.Fields("State") = ESM_State
            rsUser.Fields("Region") = ESM_Region
            rsUser.Fields("Zip") =  ESM_Zip
            rsUser.Fields("Country") = ESM_Country
            rsUser.Fields("Email") = ESM_Email
            rsUser.Fields("MilitaryBranch") = ESM_MilitaryBranch
            rsUser.Fields("MilitaryStatus") = ESM_MilitaryStatus
            rsUser.Fields("BestTimeToCall") = ESM_BestTimeToCall
            rsUser.Fields("DateofBirth") = ESM_DateofBirth

            rsUser.Update
    Else
 ' There was an error
 Response.Write "There was an error. Error code is: "&Err.number&" "&Err.Desc

     End if

    End If

      ' Close the recordset
      ' ---------------------------------------------------------------
        Call rsUser.Close
        Set rsUser.ActiveConnection = Nothing
        Set rsUser = Nothing


  ' Destroy the connection to the database
  ' -------------------------------------------------------------------
    Set connLeads = Nothing

  End Sub

Ответы [ 2 ]

5 голосов
/ 22 апреля 2010

Похоже, вы пытаетесь сделать это:

  1. Вставить некоторые данные в БД 1
  2. Получить идентификатор из вставленных данных
  3. Отправка данных + идентификатор в БД 2

Это были хорошие пять лет, но я думаю, это выглядело примерно так:

dim connStr1
connStr1 = "[connection string 1]"

dim conn1
set conn1 = server.createobject("adodb.connection")
conn1.open connStr1

dim sql
sql = " SET NOCOUNT ON " & vbCrLf & _
      " INSERT FOO (a, b, c) VALUES (1, 2, 3) " & vbCrLf & _
      " SET NOCOUNT OFF " & vbCrLf & _
      " SELECT SCOPE_IDENTITY() "

dim rs
set rs = conn1.execute(sql)
rs.close

dim id
set id = CInt(rs(0))

conn1.close

dim connStr2
connStr2 = "[connection string 2]"

dim conn2
set conn2 = server.createobject("adodb.connection")
conn2.open connStr2
conn2.execute("INSERT FOO (id, a, b, c) VALUES (" & id & ", 1, 2, 3)")
conn2.close

Удачи, и сойдите с моего газона!

0 голосов
/ 23 апреля 2010

Хорошо, так что я понял это.Проблема была безумной, опечатка.Я избалован .Net и тем фактом, что если я использую переменную, которая на самом деле не существует, я получаю ошибки.Я предполагаю, что ASP не волнует так сильно.

С другой стороны, Дрис был прав.Код не продолжается до завершения транзакции базы данных.Это было моей главной заботой, которая неправильно предполагала, что это так.Я рад, что был прав.

Спасибо за помощь, и, надеюсь, в следующий раз, когда я отправлю сообщение, это будет что-то лучше, чем тиоп.

;)

...