2016-10-19 1 views
5

Y at-il un moyen de définir le CursorType pour un ADODB.RecordSet que j'obtiens de ADODB.Command.Execute?Définition de CursorType avec ADODB.Command.Execute

Je sais qu'il est possible que si je fais:

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

Cependant, j'utilise actuellement Command.Execute avec le paramètre Parameters, qui gère automatiquement les tableaux de variantes de-? paramètres pour l'interpolation en toute sécurité. Par conséquent, l'utilisation de RecordSet.Open ne semble pas être une option.

Plus précisément, mon code ressemble actuellement:

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 

Si je veux maintenir cette même API, mais aussi contrôle CursorType, comment cela peut-il être accompli?

+1

[Apparemment, il ne peut pas] (https://support.microsoft.com/en-us/kb/ 188857). –

+0

Une formulation alternative de cette question serait: Existe-t-il un moyen de gérer automatiquement les variables-tableaux de paramètres '?' Avec 'RecordSet.Open'? –

Répondre

0

La réponse, pour autant que je suis en mesure de déterminer est que c'est impossible avec ADODB.Command.Execute, mais, si vous travaillez dur et croyez en vous-même, il est possible avec l'aide ADODB.RecordSet.OpenADODB.Command.Parameters:

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

Où est le 'CursorType' défini dans ce? – SearchAndResQ

+0

Les constantes nommées ne sont pas définies car VBScript ne connaît pas la bibliothèque de types d'ADO que vous devez lui indiquer - Voir [A: Transmission des paramètres à une procédure stockée à l'aide d'ASP] (http://stackoverflow.com/a/26776169/692942) * (section sur 'METADATA') *. – Lankymart

+0

Ce degré d'encapsulation n'est tout simplement pas nécessaire. Cela fonctionnerait exactement de la même manière si vous installiez une commande en ajoutant le paramètre '.Append (.CreateParameter (...))' dans le contexte de 'ADODB.Command' et lui passiez les valeurs requises et exécutées en utilisant' rs .Open() '. Le problème est cependant comme [@ ansgar-wiechers] (http://stackoverflow.com/users/1630171/ansgar-wiechers) [a déjà souligné] (http: // stackoverflow.com/questions/40134395/setting-cursortype-avec-adodb-command-execute # comment67539996_40134395) même si vous définissez 'CursorType' il sera ignoré. – Lankymart

-5

Hope this vous aide:

ExecuteSQL_CmdObj.ActiveConnection.CursorType = yourType 

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

Syntaxe:

objConnection.CursorLocation 
objRecordset.CursorLocation 
+1

Asker veut spécifiquement éviter l'utilisation d'un jeu d'enregistrements et maintenir l'API déjà utilisée. Cela ne fait pas ça. – Dave

+0

Cela ne gère pas le variant-array 'Parameters', qui est nécessaire pour l'interpolation'? 'En toute sécurité. –

+1

L'OP a demandé un moyen de passer 'CursorTypeEnum' avec la méthode' Execute() 'de l'objet' ADODB.Command', ce n'est pas le cas. – Lankymart