ASP - ORACLE - EXCEL

cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005 - 16 mars 2005 à 09:24
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 - 24 mars 2005 à 17:13
bonjour tout le monde, j'ai un probleme avec une connexion a une base de données
en fait j'ai trouvé un morceau de code qui me permet a partir d'un fichier excel d'extraire les données qui sont dedans afin d'alimenter une base de donées oracle
le probleme que j'ai c'est que ca fonctionne parfaitement avec une base de données oracle en local mais quand je veux attauqer celle qui se trouve sur un serveur je n'y arrive pas
pourriez vous m'aider a corriger mon code ou a me donner une astuce afin d'y arriver
merci de votre aide a tous

je vous joins mon code ainsi que l'erreur qu'y s'affiche (la ligne d'erreur est en rose)

<%
set conn=Application("connexion")


Set Conn2 = Server.CreateObject("ADODB.Connection")
str = "Driver={Microsoft Excel Driver (*.xls)}; DBQ=" & Server.MapPath(".") &"\test.xls"
Conn2.Open str


SQL = "SELECT * from salarie"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn2
rs.movefirst
do while rs("Mat") <> ""
response.Write(rs("matricule")&" | "&rs("nom")& "
")req_verif "Select * from test where matricule " & rs("matricule")
Set rs_verif = Server.CreateObject("ADODB.Recordset")
rs_verif.Open req_verif, connif (rs_verif.EOF True AND rs_verif.BOF True) then
req_insert = "INSERT INTO test(matricule,nom) values(" & rs("matricule") & ", "& rs("nom") & ")"
Set rs_insert = Server.CreateObject("ADODB.Recordset")
rs_insert.Open req_insert, conn
end if


rs.movenext
Loop
rs.close
set rs=nothing
conn2.close
set conn2=nothing
%>





Microsoft OLE DB Provider for ODBC Drivers error '80004005'


[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified


/test1.asp, line 6

12 réponses

cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
17 mars 2005 à 22:43
elle est ou ta chaine de connexion à Oracle ?

yopyop
0
cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005
18 mars 2005 à 08:51
salut en fait toute ma connexion se fait dans un fichier global.asa ou je met tout ca dedans:


<SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">
sub Application_OnStart
Application.Value("dateOuverture")=now()
on error resume next
MM_db_bilmat_STRING = "Provider=MSDAORA;Data Source=INTRANET;USER ID=SPADMIN;PASSWORD=SPADMIN;"
set Application("connexion") = Server.CreateObject("ADODB.Connection")
Application.Value("connexion").Open MM_db_bilmat_STRING
if err <> 0 then
response.write(err.description)
response.end
end if
set conn=Application.value("connexion")
if err <> 0 then
response.write(err.description)
response.end
end if
end sub
sub Application_OnEnd
set conn=Application.value("connexion")
Application.Value("connexion").Close
set Application.value("connexion")=nothing
end sub
sub Session_OnStart
Session.timeout=60
end sub
sub Session_OnEnd
set conn=Application("connexion")
end sub
</script>

et j'appelle ma connexion dans ma page avec ceci:

set conn=Application("connexion")

et je ne comprends pas pourquoi ca ne fonctionne pas
par contre j'aimerais savoir egalement si tu saurais comment passer de .xls en .csv ???
changer dans ma page asp que ce soit du csv et non plus du xls car j'ai essayé de modifier mon fichier mais ca me ressort des erreurs
merci de ton aide
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
18 mars 2005 à 23:53
En fait, c'est peut-être simplement que :
1/ le fichier est-il bien uploadé sur le serveur ?
2/ as-tu les drivers Excel installés sur le serveur qui permettent de te connecter à excel (Microsoft Excel Driver )?

Pourquoi veux-tu convertir ton fichier xls en csv ? Ca fonctionne relativement bien avec Excel non ?
En ce qui me concerne, si c'est toi qui fait l'upload, je te conseille de convertir ton fichier xls en csv avant de l'uploader.
Ensuite tu ouvres ton fichier avec filesystem (comme un fichier text), tu le lis ligne par ligne et tu insert dans Oracle (t'as beaucoup de données ? car tu peux également uploader le pl/sql directement).

Autrement c'est la grosse galère. Il faut créer un objet Excel, lancer l'application (côté serveur), ouvrir ton fichier sur le serveur, et convertir dans oublier de killer excel (et là tu risque d'avoir pas mal de problèmes).

Donc question:
Driver Excel ok ? (as-tu excel sur le serveur en gros)
C'est toi qui fait l'upload (-> utlisateur avancé)

Réponse:
Conversion xls -> csv sur le serveur ... vraiment à éviter.
yopyop
0
cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005
21 mars 2005 à 10:17
salut,
donc en fait c'est bien ce que tu me disais c'est que excel n'est aps installé sur le serveur je me suis renseigné
et en fait le soucis qu'il y a c'est qu'ils veulent que je fasse ca avec des fichiers csv car ils ne veulent pas mettre excel sur le serveur a cause des licences a payer pour ca
donc je voudrais savoir si tu saurais comment faire pour faire la meme chose avec un fichier csv??

je te rejoins mon code que j'ai pour du xls et dis moi si tu vois comment le modifier pour prendre en compte le csv
merci de ton aide

<%
set conn=Application("connexion")
Set Conn2 = Server.CreateObject("ADODB.Connection")
str = "Driver={Microsoft Excel Driver (*.xls)}; DBQ=" & Server.MapPath(".") &"\test.xls"
Conn2.Open str


SQL = "SELECT * from salarie"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL, Conn2
rs.movefirst
do while rs("Mat") <> ""
response.Write(rs("matricule")&" | "&rs("nom")& "
")req_verif "Select * from test where matricule " & rs("matricule")
Set rs_verif = Server.CreateObject("ADODB.Recordset")
rs_verif.Open req_verif, connif (rs_verif.EOF True AND rs_verif.BOF True) then
req_insert = "INSERT INTO test(matricule,nom) values(" & rs("matricule") & ", "& rs("nom") & ")"
Set rs_insert = Server.CreateObject("ADODB.Recordset")
rs_insert.Open req_insert, conn
end if


rs.movenext
Loop
rs.close
set rs=nothing
conn2.close
set conn2=nothing
%>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
21 mars 2005 à 19:28
Salut,

J'en ai parlé un peu plus haut:
tu ouvres ton fichier avec filesystem (comme un fichier text), tu le lis ligne par ligne et tu insert dans Oracle (t'as beaucoup de données ? car tu peux également uploader le pl/sql directement).

Désolé, j'ai pas mon code sous la main :(

Tu check si le fichier existe bien:
http://www.w3schools.com/asp/showfile.asp?filename=demo_fileexists

Tu chopes le fichier
a) http://www.w3schools.com/asp/asp_ref_textstream.asp
et
b) http://www.w3schools.com/asp/met_openastextstream.asp

Pour chaque ligne tu fais un split
MonSeparateur = "++++" <- il faut utiliser une string que tu es sûr de ne pas utiliser dans tes valeurs
MaLigne = f.ReadLine (cf a)
MonTableau = Split(MaLigne, MonSeparateur)

Ensuite tu peux accéder au tableau :
MonTableau (0) = "Nom"
MonTableau (1) = "Prenom"
MonTableau (2) = "Email"

Donc faire un insert ..

sSQL = "INSERT INTO TABLE (champs1, ..., champN) "
sSQL = sSQL & " values (" & MonTableau(0) & "," & ... & ",'" & MonTableau(N) & "') "

Tu peux mettre un BEGIN & ssqL & END si tu veux passer du pl/sql (faut pas qu'il y ai trop de insert).

Avec ca tu devrais t'en sortir ?
Au cas ou, demande... j'irai fouiller dans mes archive si tu veux un example détaillé.

yopyop
0
cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005
22 mars 2005 à 14:45
je te remercie deja pour tout ce que tu fais mais en fait j'ai beaucoup de mal a m'en sortir donc effectivement un exemple détaillé de tes archives m'aiderait beaucoup!!
merci
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
22 mars 2005 à 20:11
oki,

d'ici un-deux jours ca te va ?

yopyop
0
cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005
23 mars 2005 à 10:59
ok pas de probleme


je te remercie


bonne journée
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
23 mars 2005 à 19:43
petites questions encore...

tu insères dans une seule table ?
la table dans laquelle tu insères a-t-elle des foreign keys?

yopyop
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
23 mars 2005 à 20:33
voilà,

j'espère que ca joue pour toi....

yopyop
=========================================
dim sExelFilePath 'Holds the file name & path
dim bExisting 'true if file found on server
dim oFile
dim oRS
dim sSplitValue 'Chaîme pour le split
dim arrDataFromFile 'Tableau pour contenir les valeurs du csv


bExisting = FALSE
sSplitValue = ";"


'Recoit un tableau de string en paramètre et remplace les occurences
'de sStringWhat avec sStringWith
Function fctReplaceStringInArray(arrToCheck,sStringWhat,sStringWith)
dim iLocalCounter
dim iLocalNbColumns

iLocalNbColumns = UBound(arrToCheck)
For iLocalCounter = 0 to iLocalNbColumns
arrToCheck(iLocalCounter) = Replace("" & arrToCheck(iLocalCounter),sStringWhat,sStringWith)
Next
fctReplaceStringInArray = arrToCheck
End Function


function GetFileObject(byval sFilePath)
Dim ofs, oFile

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.FileExists(sFilePath) then
set oFile = ofs.openTextFile(sFilePath)

Set GetFileObject = oFile
Else
Set GetFileObject = Nothing
Response.Write "ok"
Response.End
end if

set oFs = nothing
End function


Function IsExistingFile(byval sFilePath)
On Error Resume Next

Dim ofs

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
IsExistingFile = True
Else
IsExistingFile = False
End if

Set ofs = nothing

If Err Then
Call ShowError(Err,"")
End If
End Function


sub deleteFile(byval sFilePath)
Dim ofs, oFile
set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
ofs.DeleteFile replace(sFilePath, "/", ""), true
end if

If Err Then
Call ShowError(Err,"")
End If

set oFile = nothing
Set ofs = nothing
End sub


sExelFilePath = "path" & Request("File") 'tu récupères le nom du fichier
sExelFilePath = server.mappath(sExelFilePath)
bExisting = IsExistingFile(sExelFilePath) 'tu check si le fichier existe bien (on sait jamais)


If bExisting Then
Response.Write "
Ok - File found on server
"
Else
Response.Write "
Error - File not found !
"
Response.End
End If


Response.Write " Processing insertion

"


'Get all value from file
'for each line
Set oFile = GetFileObject(sExelFilePath)
oFile.ReadLine() 'On passe la première ligne sans rien faire car il y a les headers


'On commence le processus d'insertion
Do while not oFile.AtEndOfStream
arrDataFromFile = Split(oFile.ReadLine(),sSplitValue) 'converti ma chaîne séparée par un ; (sPLitValue) en tableau.
arrDataFromFile = fctReplaceStringInArray(arrDataFromFile,"'","''")
'Construction du insert
sSQL = "INSERT INTO MATABLE (COLONE_1,COLONE_2,COLONE_3, ...,COLONNE_N) VALUES ( "
sSQL = sSQL & arrDataFromFile(0) & ","
sSQL = sSQL & "'" & arrDataFromFile(1) & "'," '<- ici c'est une string par exemple
sSQL = sSQL & arrDataFromFile(2) & ","


...
sSQL = sSQL & arrDataFromFile(N) & ","
sSQL = sSQL & ");"
ExecuteQueryNoError(sSql) 'appel de ta fonction/sub qui execute le sql (pour ca tu devrais avoir ton propre code)
Loop

'on ferme le fichier
oFile.Close()
Set oFile = Nothing


'On efface le fichier
Call deleteFile(sExelFilePath)
================
<%@ Language=VBScript %><%
Option Explicit
%><%

dim sExelFilePath 'Holds the file name & path
dim bExisting 'true if file found on server
dim oFile
dim oRS
dim sSplitValue 'Chaîme pour le split
dim arrDataFromFile 'Tableau pour contenir les valeurs du csv

bExisting = FALSE
sSplitValue = ";"

'Recoit un tableau de string en paramètre et remplace les occurences
'de sStringWhat avec sStringWith
Function fctReplaceStringInArray(arrToCheck,sStringWhat,sStringWith)
dim iLocalCounter
dim iLocalNbColumns

iLocalNbColumns = UBound(arrToCheck)
For iLocalCounter = 0 to iLocalNbColumns
arrToCheck(iLocalCounter) = Replace("" & arrToCheck(iLocalCounter),sStringWhat,sStringWith)
Next
fctReplaceStringInArray = arrToCheck
End Function

function GetFileObject(byval sFilePath)
Dim ofs, oFile

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.FileExists(sFilePath) then
set oFile = ofs.openTextFile(sFilePath)

Set GetFileObject = oFile
Else
Set GetFileObject = Nothing
Response.Write "ok"
Response.End
end if

set oFs = nothing
End function

Function IsExistingFile(byval sFilePath)
On Error Resume Next

Dim ofs

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
IsExistingFile = True
Else
IsExistingFile = False
End if

Set ofs = nothing

If Err Then
Call ShowError(Err,"")
End If
End Function

sub deleteFile(byval sFilePath)
Dim ofs, oFile
set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
ofs.DeleteFile replace(sFilePath, "/", ""), true
end if

If Err Then
Call ShowError(Err,"")
End If

set oFile = nothing
Set ofs = nothing
End sub

sExelFilePath = "path" & Request("File") 'tu récupères le nom du fichier
sExelFilePath = server.mappath(sExelFilePath)
bExisting = IsExistingFile(sExelFilePath) 'tu check si le fichier existe bien (on sait jamais)

If bExisting Then
Response.Write "
Ok - File found on server
"
Else
Response.Write "
Error - File not found !
"
Response.End
End If

Response.Write " Processing insertion

"

'Get all value from file
'for each line
Set oFile = GetFileObject(sExelFilePath)
oFile.ReadLine() 'On passe la première ligne sans rien faire car il y a les headers

'On commence le processus d'insertion
Do while not oFile.AtEndOfStream
arrDataFromFile = Split(oFile.ReadLine(),sSplitValue) 'converti ma chaîne séparée par un ; (sPLitValue) en tableau.
arrDataFromFile = fctReplaceStringInArray(arrDataFromFile,"'","''")
'Construction du insert
sSQL = "INSERT INTO MATABLE (COLONE_1,COLONE_2,COLONE_3, ...,COLONNE_N) VALUES ( "
sSQL = sSQL & arrDataFromFile(0) & ","
sSQL = sSQL & "'" & arrDataFromFile(1) & "'," '<- ici c'est une string par exemple
sSQL = sSQL & arrDataFromFile(2) & ","

...
sSQL = sSQL & arrDataFromFile(N) & ","
sSQL = sSQL & ");"
ExecuteQueryNoError(sSql) 'appel de ta fonction/sub qui execute le sql (pour ca tu devrais avoir ton propre code)
Loop

'on ferme le fichier
oFile.Close()
Set oFile = Nothing

'On efface le fichier
Call deleteFile(sExelFilePath)


%>

<%@ Language=VBScript %><%
Option Explicit
%><%

dim sExelFilePath 'Holds the file name & path
dim bExisting 'true if file found on server
dim oFile
dim oRS
dim sSplitValue 'Chaîme pour le split
dim arrDataFromFile 'Tableau pour contenir les valeurs du csv

bExisting = FALSE
sSplitValue = ";"

'Recoit un tableau de string en paramètre et remplace les occurences
'de sStringWhat avec sStringWith
Function fctReplaceStringInArray(arrToCheck,sStringWhat,sStringWith)
dim iLocalCounter
dim iLocalNbColumns

iLocalNbColumns = UBound(arrToCheck)
For iLocalCounter = 0 to iLocalNbColumns
arrToCheck(iLocalCounter) = Replace("" & arrToCheck(iLocalCounter),sStringWhat,sStringWith)
Next
fctReplaceStringInArray = arrToCheck
End Function

function GetFileObject(byval sFilePath)
Dim ofs, oFile

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.FileExists(sFilePath) then
set oFile = ofs.openTextFile(sFilePath)

Set GetFileObject = oFile
Else
Set GetFileObject = Nothing
Response.Write "ok"
Response.End
end if

set oFs = nothing
End function

Function IsExistingFile(byval sFilePath)
On Error Resume Next

Dim ofs

set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
IsExistingFile = True
Else
IsExistingFile = False
End if

Set ofs = nothing

If Err Then
Call ShowError(Err,"")
End If
End Function

sub deleteFile(byval sFilePath)
Dim ofs, oFile
set ofs = Server.CreateObject("scripting.filesystemobject")

if ofs.fileExists(sFilePath) then
ofs.DeleteFile replace(sFilePath, "/", ""), true
end if

If Err Then
Call ShowError(Err,"")
End If

set oFile = nothing
Set ofs = nothing
End sub

sExelFilePath = "path" & Request("File") 'tu récupères le nom du fichier
sExelFilePath = server.mappath(sExelFilePath)
bExisting = IsExistingFile(sExelFilePath) 'tu check si le fichier existe bien (on sait jamais)

If bExisting Then
Response.Write "
Ok - File found on server
"
Else
Response.Write "
Error - File not found !
"
Response.End
End If

Response.Write " Processing insertion

"

'Get all value from file
'for each line
Set oFile = GetFileObject(sExelFilePath)
oFile.ReadLine() 'On passe la première ligne sans rien faire car il y a les headers

'On commence le processus d'insertion
Do while not oFile.AtEndOfStream
arrDataFromFile = Split(oFile.ReadLine(),sSplitValue) 'converti ma chaîne séparée par un ; (sPLitValue) en tableau.
arrDataFromFile = fctReplaceStringInArray(arrDataFromFile,"'","''")
'Construction du insert
sSQL = "INSERT INTO MATABLE (COLONE_1,COLONE_2,COLONE_3, ...,COLONNE_N) VALUES ( "
sSQL = sSQL & arrDataFromFile(0) & ","
sSQL = sSQL & "'" & arrDataFromFile(1) & "'," '<- ici c'est une string par exemple
sSQL = sSQL & arrDataFromFile(2) & ","

...
sSQL = sSQL & arrDataFromFile(N) & ","
sSQL = sSQL & ");"
ExecuteQueryNoError(sSql) 'appel de ta fonction/sub qui execute le sql (pour ca tu devrais avoir ton propre code)
Loop

'on ferme le fichier
oFile.Close()
Set oFile = Nothing

'On efface le fichier
Call deleteFile(sExelFilePath)


%>
0
cs_tommie Messages postés 40 Date d'inscription jeudi 18 mars 2004 Statut Membre Dernière intervention 11 octobre 2005
24 mars 2005 à 13:38
salut,
en fait plusieurs données d'un fichier csv peuvent etre envoyées vers différentes tables
et oui il y a des foreign key sur quelques tables
pk cela pose t'il probleme?

juste une autre question encore:
cette fonction que tu m'as passé il faut que je l'execute sous quoi?
(dans des balises ASP,ou autre....???)

merci de ton aide
0
cs_Yopyop Messages postés 586 Date d'inscription lundi 7 janvier 2002 Statut Membre Dernière intervention 10 février 2010 1
24 mars 2005 à 17:13
Salut,

C'est bien de l'ASP (attention, pas du ASPX).

Le problème des foreignkey, c'est que si tu tentes d'insérer une ligne et que la foreignkey n'existe pas, tu vas avoir des erreurs.

Example:
Table
PERSONNE
id, nom, pays_id
PAYS
id, nom

Si tu insères tes données dans la table personne, et que tu as une id d'un pays qui n'existe pas -> erreur.

Si tu n'a pas l'id du pays, mais le nom, tu dois faire une 'prérequête' pour avoir l'id du pays.
yopyop
0
Rejoignez-nous