2016-10-19 95 views
5

Czy istnieje sposób ustawienia CursorType dla ADODB.RecordSet, którą otrzymuję od ADODB.Command.Execute?Ustawienie CursorType z ADODB.Command.Execute

wiem, że to jest możliwe, jeśli robię:

rs = Server.CreateObject("ADODB.RecordSet") 
rs.Open(cmd) 

Jednak Używam obecnie Command.Execute z parametrem Parameters, który automatycznie obsługuje wariant tablic ? parametrów bezpiecznego interpolacji. Dlatego używanie opcji RecordSet.Open nie wydaje się być opcją.

Konkretnie mój kod wygląda obecnie:

function ExecuteSQL(conn, sql, args) 
    set ExecuteSQL_CmdObj = Server.CreateObject("ADODB.Command") 
    ExecuteSQL_CmdObj.CommandType = adCmdText 
    ExecuteSQL_CmdObj.CommandText = sql 
    ExecuteSQL_CmdObj.ActiveConnection = conn 
    if Ubound(args) = -1 then 
     set ExecuteSQL = ExecuteSQL_CmdObj.Execute 
    else 
     set ExecuteSQL = ExecuteSQL_CmdObj.Execute(,args) 
    end if 
end function 

Jeśli chcę utrzymać ten sam API, ale również kontroli CursorType, w jaki sposób można to osiągnąć?

+1

[Najwyraźniej nie może] (https://support.microsoft.com/en-us/kb/ 188857). –

+0

Alternatywne sformułowanie tego pytania brzmi: czy istnieje sposób automatycznego obsługiwania tablic wariantów z parametrów? Z 'RecordSet.Open'? –

Odpowiedz

0

odpowiedź, o ile byłem w stanie ustalić, że jest to niemożliwe przy ADODB.Command.Execute, ale jeśli ciężko pracować i wierzyć w siebie, to możliwe z użyciem ADODB.Command.ParametersADODB.RecordSet.Open:

function CreateSQLParameter(arg) 
    set param = Server.CreateObject("ADODB.Parameter") 

    select TypeName(arg) 
     case "String" 
      param.Type = adVarChar 
      param.Size = Len(CStr(arg)) 
      param.Value = CStr(arg) 
     case "Integer" 
      param.Type = adInteger 
      param.Value = CLng(arg) 
     case "Double" 
      param.Type = adDouble 
      param.Value = CDbl(arg) 
     case else 
      ' 13 is the "Type Mismatch" error code 
      Err.Raise(13,,, "Type '" & TypeName(arg) "' is not handled. Please add support for it to CreateSQLParameter") 
    end select 

    set CreateSQLParameter = param 
end function 

function CreateSQLCommand(sql, args) 
    set cmd = Server.CreateObject("ADODB.Command") 
    'From http://www.w3schools.com/asp/prop_comm_commandtype.asp. 
    'adCmdText is for some reason undefined in our scope. 
    cmd.CommandType = 1 
    cmd.CommandText = sql 

    for i = Lbound(args) to Ubound(args) 
     set param = CreateSQLParameter(args(i)) 
     cmd.Parameters.Append(param) 
    next 

    set CreateSQLCommand = cmd 
end function 

function ExecuteSQL(conn, sql, args) 
    set cmd = CreateSQLCommand(sql, args) 
    set rs = Server.CreateObject("ADODB.RecordSet") 
    rs.Open(cmd, conn) 

    set ExecuteSQL = rs 
end function 
+0

Gdzie jest ustawione 'CursorType'? – SearchAndResQ

+0

Podane stałe są niezdefiniowane, ponieważ VBScript nie wie o bibliotece typów ADO, którą musisz przekazać - Zobacz [A: Przekazywanie parametrów do zapisanej procedury za pomocą ASP] (http://stackoverflow.com/a/26776169/692942) * (sekcja dotycząca "METADATA") *. – Lankymart

+0

Ten stopień enkapsulacji nie jest wymagany. Działałoby dokładnie tak samo, jeśli konfiguracja polecenia dodała parametr za pomocą '.Append (.CreateParameter (...))' w kontekście 'ADODB.Command' i przekazał mu wymagane wartości i wykonane przy użyciu' rs .Open() '. Problem jednak jest taki, jak [@ ansgar-wiechers] (http://stackoverflow.com/users/1630171/ansgar-wiechers) [już wskazał] (http: // stackoverflow.com/questions/40134395/setting-cursortype-with-adodb-command-execute # comment67539996_40134395) nawet jeśli ustawisz 'CursorType', to zostanie zignorowane. – Lankymart

-5

Nadzieja to pomaga:

ExecuteSQL_CmdObj.ActiveConnection.CursorType = yourType 

Od: http://www.w3schools.com/asp/prop_conn_cursorlocation.asp

Składnia:

objConnection.CursorLocation 
objRecordset.CursorLocation 
+1

Pytający w szczególności chce uniknąć użycia 'zestawu rekordów' i utrzymania już posiadanego interfejsu API. To nie robi tego. – Dave

+0

To nie obsługuje tablicy wariantów "Parameters", która jest niezbędna do bezpiecznej interpolacji '' '. –

+1

Program OP zażądał sposobu przekazania 'CursorTypeEnum' za pomocą metody' Execute() 'obiektu ADODB.Command', to nie jest to. – Lankymart