OVH Cloud OVH Cloud

ado.recordset et SQL 2005

4 réponses
Avatar
SOW Olivier
Bonjour,

J'ai développé une application en ASP3 y'a un moment de ça qui fonctionne avec SQL2K, cette application continue d'évoluer et tourne
chez des clients trés importants.
Je voulais vérifier si cette application fonctionne avec SQL2K5 et je rencontre un probleme avec ce dernier.
Voici le bout de code qui me pose soucis et qui fonctionne parfaitement sous SQL2K

<%
sConn="Provider=SQLOLEDB; Data Source="+gsBaseSource+"; Initial Catalog="+gsBaseName+"; User ID="+gsBaseUser+";
Password="+gsBasePass+";"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open sConn

set rdst= CreateObject("ADODB.recordset")
rdst.CursorLocation= adUseClient
rdst.CursorType= adOpenStatic

sSql="SELECT channel.Chnl_ID AS id, channel.Chnl_Name AS name, t1.right_value AS checked "& _
"FROM SEUser.channel AS channel, "& _
"(SELECT right_value, right_channelId "& _
"FROM SEUser.seright "& _
"WHERE right_userid='"&gsProfil&"' AND "& _
"right_type="&gRightAccessWindow&") AS t1 "& _
"WHERE channel.chnl_ID*=t1.right_channelId "& _
"ORDER BY channel.Chnl_Name"
rdst.open sSql, CONN, adOpenStatic, adLockReadOnly
bChannelAll=TRUE
dBegin=Now()
Do while Not rdst.eof AND bChannelAll
If Not IsNull(rdst("checked")) Then bChannelAll=false
rdst.MoveNext
Loop
%>

Aprés plusieurs tests, je me suis apperçu que le Recordset renvoyé semble ... bizarre
En effet, si j'essaye d'afficher rdst.eof avant la boucle While ... rien ne m'ais renvoyé (meme pas NULL ?!?)
En googlant un peu le net j'ai trouvé ceci:
http://support.microsoft.com/default.aspx?scid=kb;en-us;914535&sd=rss&spid=2855

mon cas s'en rapproche mais n'est pas tout à fait ça puisque j'utilise un RecordSet adOpenStatic
(j'ai essayé avec leur solution en changeant mon cursorLocation et cursorType mais ca ne change rien)

Es-ce que quelqu'un a des info sur ce problème ?

4 réponses

Avatar
SQLpro [MVP]
SOW Olivier a écrit :
Bonjour,

J'ai développé une application en ASP3 y'a un moment de ça qui fonctionne avec SQL2K, cette application continue d'évoluer et tourne
chez des clients trés importants.
Je voulais vérifier si cette application fonctionne avec SQL2K5 et je rencontre un probleme avec ce dernier.
Voici le bout de code qui me pose soucis et qui fonctionne parfaitement sous SQL2K

<%
sConn="Provider=SQLOLEDB; Data Source="+gsBaseSource+"; Initial Catalog="+gsBaseName+"; User ID="+gsBaseUser+";
Password="+gsBasePass+";"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open sConn

set rdst= CreateObject("ADODB.recordset")
rdst.CursorLocation= adUseClient
rdst.CursorType= adOpenStatic

sSql="SELECT channel.Chnl_ID AS id, channel.Chnl_Name AS name, t1.right_value AS checked "& _
"FROM SEUser.channel AS channel, "& _
"(SELECT right_value, right_channelId "& _
"FROM SEUser.seright "& _
"WHERE right_userid='"&gsProfil&"' AND "& _
"right_type="&gRightAccessWindow&") AS t1 "& _
"WHERE channel.chnl_ID*=t1.right_channelId "& _
"ORDER BY channel.Chnl_Name"
rdst.open sSql, CONN, adOpenStatic, adLockReadOnly
bChannelAll=TRUE
dBegin=Now()
Do while Not rdst.eof AND bChannelAll
If Not IsNull(rdst("checked")) Then bChannelAllúlse
rdst.MoveNext
Loop



C'est tout à fait normal que cela ne merche pas. Vous utilisez des
jointures externes façon SQL Server version 3000 ans avant jésus christ
alors que la norme SQL impose des INNER JOIN depuis 1992.
MS SQL Server à annoncé depuis LONGTEMPS que ce type de jointure "*=" et
consort ne serait plus supporté dans les versions futures.
Exemple d'aide en ligne v 2000 :
"
Jointures Transact-SQL
Dans les versions précédentes de Microsoft® SQL Server™ 2000, il fallait
spécifier les conditions de jointure externe gauche et droite dans la
clause WHERE à l'aide des opérateurs *= et =*. Dans certains cas, cette
syntaxe provoque une requête ambiguë qui peut être interprétée de
différentes manières. Les jointures externes compatibles SQL-92 sont
spécifiées dans la clause FROM et suppriment donc cette ambiguïté. Étant
donné que la syntaxe SQL-92 est plus précise, les informations
détaillées sur l'utilisation de l'ancienne syntaxe de jointure externe
dans la clause WHERE ne sont pas fournies avec cette version. Cette
syntaxe risque de ne plus être prise en charge dans les futures versions
de SQL Server. Toute instruction utilisant les jointures externes
Transact-SQL doivent être modifiées afin d'utiliser la syntaxe SQL-92.
"

Et le futur est devenu aujourd'hui !

DEMO :

SELECT *
FROM sysobjects s, sysindexes i
WHERE s.id *= i.id

réponse de MS SQL Server 2005 :

Msg 4147, Level 15, State 1, Line 3
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this
query without modification, please set the compatibility level for
current database to 80 or lower, using stored procedure sp_dbcmptlevel.
It is strongly recommended to rewrite the query using ANSI outer join
operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of
SQL Server, non-ANSI join operators will not be supported even in
backward-compatibility modes.


Donc, soit vous persistez avec un base version 2000 ou alors vous
récrivez vos requêtes !!!

A +





%>

Aprés plusieurs tests, je me suis apperçu que le Recordset renvoyé semble ... bizarre
En effet, si j'essaye d'afficher rdst.eof avant la boucle While ... rien ne m'ais renvoyé (meme pas NULL ?!?)
En googlant un peu le net j'ai trouvé ceci:
http://support.microsoft.com/default.aspx?scid=kb;en-us;914535&sd=rss&spid(55

mon cas s'en rapproche mais n'est pas tout à fait ça puisque j'utilise un RecordSet adOpenStatic
(j'ai essayé avec leur solution en changeant mon cursorLocation et cursorType mais ca ne change rien)

Es-ce que quelqu'un a des info sur ce problème ?






--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
SQLpro [MVP]
SQLpro [MVP] a écrit :

et plus généralement sur les nouveautés de SQL et du transact SQL de
2005, lisez les articles que j'ai écrit :
http://sqlpro.developpez.com/SQL_Server_2K5/
SQL :
http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
Transact SQL :
http://sqlpro.developpez.com/SQL_Server_2K5/N2.php

A +




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Med Bouchenafa
Après l'ouverture de ton recordset, il serait interessant de tester quel type
de recordset tu obtiens par rdst.State.
Les curseurs ont beaucoup changé en 2005 et même en 2000 SP4


--
Bien Cordialement
Med Bouchenafa


"SOW Olivier" wrote:

Bonjour,

J'ai développé une application en ASP3 y'a un moment de ça qui fonctionne avec SQL2K, cette application continue d'évoluer et tourne
chez des clients trés importants.
Je voulais vérifier si cette application fonctionne avec SQL2K5 et je rencontre un probleme avec ce dernier.
Voici le bout de code qui me pose soucis et qui fonctionne parfaitement sous SQL2K

<%
sConn="Provider=SQLOLEDB; Data Source="+gsBaseSource+"; Initial Catalog="+gsBaseName+"; User ID="+gsBaseUser+";
Password="+gsBasePass+";"
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open sConn

set rdst= CreateObject("ADODB.recordset")
rdst.CursorLocation= adUseClient
rdst.CursorType= adOpenStatic

sSql="SELECT channel.Chnl_ID AS id, channel.Chnl_Name AS name, t1.right_value AS checked "& _
"FROM SEUser.channel AS channel, "& _
"(SELECT right_value, right_channelId "& _
"FROM SEUser.seright "& _
"WHERE right_userid='"&gsProfil&"' AND "& _
"right_type="&gRightAccessWindow&") AS t1 "& _
"WHERE channel.chnl_ID*=t1.right_channelId "& _
"ORDER BY channel.Chnl_Name"
rdst.open sSql, CONN, adOpenStatic, adLockReadOnly
bChannelAll=TRUE
dBegin=Now()
Do while Not rdst.eof AND bChannelAll
If Not IsNull(rdst("checked")) Then bChannelAllúlse
rdst.MoveNext
Loop
%>

Aprés plusieurs tests, je me suis apperçu que le Recordset renvoyé semble ... bizarre
En effet, si j'essaye d'afficher rdst.eof avant la boucle While ... rien ne m'ais renvoyé (meme pas NULL ?!?)
En googlant un peu le net j'ai trouvé ceci:
http://support.microsoft.com/default.aspx?scid=kb;en-us;914535&sd=rss&spid(55

mon cas s'en rapproche mais n'est pas tout à fait ça puisque j'utilise un RecordSet adOpenStatic
(j'ai essayé avec leur solution en changeant mon cursorLocation et cursorType mais ca ne change rien)

Es-ce que quelqu'un a des info sur ce problème ?





Avatar
SOW Olivier
Bonjour,

Tout d'abords merci de votre réponse.
Je ne sais meme pas pourquoi j'ai utilisé une jointure de cette forme la à vrai dire (c'est vraiment pas de moi)
j'ai essayé en transformant ma jointure pour etre de la forme LEFT JOIN et cela fonctionne.
Par contre le comportement de debug est un peu étrange:
Je pensais au début que cela ne fonctionnait pas j'avais une faute de typo (à cause d'un clavier pourri de chez monsieur Compaq qui
avait cru bon de mettre séparer la barre d'espace en 2, à gauche une backspace et a droite un espace standard ...) et cela avait le
meme comportement qu'avec ma jointure en " *= "

enfin bon ca marche merci



"SQLpro [MVP]" a écrit dans le message de news: %
| SQLpro [MVP] a écrit :
|
| et plus généralement sur les nouveautés de SQL et du transact SQL de
| 2005, lisez les articles que j'ai écrit :
| http://sqlpro.developpez.com/SQL_Server_2K5/
| SQL :
| http://sqlpro.developpez.com/SQL_Server_2K5/N1.php
| Transact SQL :
| http://sqlpro.developpez.com/SQL_Server_2K5/N2.php
|
| A +
|
|
|
|
| --
| Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
| Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
| Audit, conseil, expertise, formation, modélisation, tuning, optimisation
| ********************* http://www.datasapiens.com ***********************