HELP: Errore SQL2000 quando faccio un INSERT

mercoledì 18 ottobre 2006 - 12.43

joko Profilo | Newbie

Salve,
ho un problema con un sito web che si interfaccia ad un database SQL2000.
Quando la pagina ASP cerca di fare un insert in una qualsiasi tabella del db appare questo errore:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Riga 1: sintassi non corretta in prossimità di ','.

Gli update invece funzionano.
La cosa strana è che la medesima pagina ASP su un altro server win2003/sql2005 funziona senza problemi mentre sul mio win2003/sql2000 genera questo errore. Escludo quindi sia un problema del codice ASP.
Il database è stato correttamente ripristinato da un backup effettuato dall'altro server con sql2005.

Il DB sembra configurato correttamente a livello di permission dell'utente in quanto nelle tabelle in questione è stato abilitato sia l'INSERT che l'UPDATE che il DELETE.

Qualcuno può aiutarmi?

Grazie

lbenaglia Profilo | Guru

>Quando la pagina ASP cerca di fare un insert in una qualsiasi
>tabella del db appare questo errore:
>
>Microsoft OLE DB Provider for SQL Server error '80040e14'
>Riga 1: sintassi non corretta in prossimità di ','.

Ciao joko,

a quanto pare si tratta di un errore di sintassi.
Potresti postare cortesemente la struttura della tabella (CREATE TABLE) ed il codice ADO che esegue il comando di INSERT?

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

us01739 Profilo | Expert

>Microsoft OLE DB Provider for SQL Server error '80040e14'
>Riga 1: sintassi non corretta in prossimità di ','.

Postaci la riga 1, così possimo interpretare l'errore.
Bye Bye

---------------------------------------------------
Roberto Gelmini - Microsoft Certified Professional
www.robertogelmini.com
---------------------------------------------------

joko Profilo | Newbie

Vi allego le prime righe della pagina ASP in questione.
Il file incluso connDB.asp funziona sicuramente in quanto cono tutte le altre pagine che fanno queries di lettura o update non ho problemi.
Come vi accennavo la stessa pagina su un altro server funziona senza problemi e quindi non vorrei che fosse un prob sul DB SQL... ma cosa?

Questo è l'errore completo:

Microsoft OLE DB Provider for SQL Server error '80040e14'
Riga 1: sintassi non corretta in prossimità di ','.
/adm/inserimento_settore.asp, line 48

Questo sono le prime righe dell'ASP del file inserimento_settore.asp:

<!--#include file="inclusioni/connDB.asp" -->
<!--#include file="inclusioni/repstring.asp" -->
<%
if session("username")="" then
response.Redirect("index.asp")
else
Dim objConn
Set objConn=Server.CreateObject("ADODB.Connection")
objConn.ConnectionString= connString
objConn.Open
if request.QueryString("mod")<>"" then
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "SELECT settore.gruppo, settore_it.nome AS nome_it, settore_en.nome AS nome_en from settore INNER JOIN settore_it ON settore.id=settore_it.id INNER JOIN settore_en ON settore.id=settore_en.id WHERE settore.id="& request.QueryString("mod")
rs.Open sql, objConn,3,3
if not rs.eof then
gruppo=rs("gruppo")
nome_it=rs("nome_it")
nome_en=rs("nome_en")
end if
rs.close
set rs=nothing
titolo="MODIFICA SETTORE"
btn_name="Modifica"
else
titolo="INSERISCI NUOVO SETTORE"
btn_name="Inserisci"
end if
if request.Form("invia")<>"" and request.Form("nome_it")<>"" and request.Form("nome_en")<>"" then

if request.Form("mod")="" then
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "SELECT TOP 1 ord FROM settore WHERE gruppo="& request.Form("gruppo") &" ORDER BY ord DESC"
rs.Open sql, objConn,3,3
if not rs.eof then
lastord=rs("ord")
end if
rs.close
set rs=nothing

sql="INSERT INTO settore (gruppo, ord) VALUES ("& request.Form("gruppo")&","& lastord+1 &")"
objConn.Execute(sql)

Set rs = Server.CreateObject("ADODB.Recordset")
sql = "SELECT @@IDENTITY AS idsettore FROM settore"
rs.Open sql, objConn,3,3
if not rs.eof then
sql="INSERT INTO settore_it (id, nome) VALUES("& rs("idsettore") &", '"& repstring(request.Form("nome_it")) &"')"
objConn.Execute(sql)
sql="INSERT INTO settore_en (id,nome) VALUES("& rs("idsettore") &", '"& repstring(request.Form("nome_en")) &"')"
objConn.Execute(sql)
end if
rs.close
set rs=nothing
else
sql="UPDATE settore SET gruppo="& request.Form("gruppo") &" WHERE id="& request.Form("mod")
objConn.Execute(sql)
sql="UPDATE settore_it SET nome='"& repstring(request.Form("nome_it")) &"' WHERE id="& request.Form("mod")
objConn.Execute(sql)
sql="UPDATE settore_en SET nome='"& repstring(request.Form("nome_en")) &"' WHERE id="& request.Form("mod")
objConn.Execute(sql)
end if
response.Redirect("gestione.asp")
else
%>

lbenaglia Profilo | Guru

>Questo è l'errore completo:
>
>Microsoft OLE DB Provider for SQL Server error '80040e14'
>Riga 1: sintassi non corretta in prossimità di ','.
>/adm/inserimento_settore.asp, line 48

Senza il codice delle due include non possiamo capire quale sia la linea 48, non è che potresti dircelo tu?

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

Hai ragione, scusa.

Questi sono i due include:


<%
database="nomedb"
user="utente"
password="password"
connString="Provider=sqloledb;Data Source=localhost;Initial Catalog="& database &";User Id="& user &";Password="& password &";"
%>


<%
function repstring(stringtorep)
repstring=replace(stringtorep, "'","''")
end function
%>


Se non ho contato male la riga 48 dovrebbe essere questa:

sql="INSERT INTO settore (gruppo, ord) VALUES ("& request.Form("gruppo")&","& lastord+1 &")"

lbenaglia Profilo | Guru

>Se non ho contato male la riga 48 dovrebbe essere questa:
>
>sql="INSERT INTO settore (gruppo, ord) VALUES ("& request.Form("gruppo")&","&
>lastord+1 &")"

La sintassi di questa INSERT sembra corretta e dato che si tratta di una contatenazione di stringhe non dovrebbe generare alcun errore.
Secondo me il problema è su una objConn.Execute(sql).
Prova a debuggure il codice mettendo subito dopo sql="..." una Response.Write sql in modo da vedere il comando che andrai ad eseguire...
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

Ecco il risultato con il Response.Write:

INSERT INTO settore (gruppo, ord) VALUES (10,40)

Microsoft OLE DB Provider for SQL Server error '80040e14'

Riga 1: sintassi non corretta in prossimità di ','.

/adm/inserimento_settore.asp, line 49

lbenaglia Profilo | Guru

>Ecco il risultato con il Response.Write:
>
>INSERT INTO settore (gruppo, ord) VALUES (10,40)

Bene, se le colonne gruppo e ord della tabella settore sono numeriche e le altre eventuali colonne hanno un default o sono nullable, quel comando di INSERT è corretto.

>Microsoft OLE DB Provider for SQL Server error '80040e14'
>
>Riga 1: sintassi non corretta in prossimità di ','.
>
>/adm/inserimento_settore.asp, line 49

Eh boh, l'errore si riferisce a qualcos'altro...
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

gruppo e ord sono degli interi e quindi non è un problema di questo tipo....

lbenaglia Profilo | Guru

>gruppo e ord sono degli interi e quindi non è un problema di
>questo tipo....

Appunto. Ti sei fissato che l'errore è in quella INSERT invece molto probabilmente è in qualche altro punto.
Ti conviene debuggare riga per riga la pagina asp...
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

Non mi sono fissato...è che l'errore viene dato su quella riga

Comunque sia, a mio parere, il problema non è nel codice ASP perchè come ti dicevo su un altro server funziona tutto. Credo sia un problema di permissions nel DB...anche se personalmente mi sembra di aver settato tutto bene come già fatto per altri db...

lbenaglia Profilo | Guru

>Non mi sono fissato...è che l'errore viene dato su quella riga
>

Come ho già avuto modo di dire quella riga non fa altro che concatenare delle stringhe!
Mi spieghi come fa a generare un errore sull'OLEDB Provider di SQL Server?!?!

L'errore ce l'hai nella Execute di qualche comando SQL.
Quello riguardante l'INSERT "incriminata" abbiamo visto che è corretto.
Prosegui e debugga ogni singola esecuzione e vedrai che lo troverai facilmente.

>Comunque sia, a mio parere, il problema non è nel codice ASP
>perchè come ti dicevo su un altro server funziona tutto. Credo
>sia un problema di permissions nel DB...
Un errore di sintassi non c'entra proprio niente con le permission sugli oggetti di un database.
Piuttosto c'entra la lingua associata alla login utilizzata per accedere all'istanza e le Regional Options del web server.
Stai a vedere che utilizzi valori decimali che fanno uso della virgola come separatore decimale incece che il punto... SQL Server ha ragione ad arrabbiarsi.

Lo sai perché succedono queste cose? Perché utilizzi codice SQL dinamico mischiato al codice script della pagina. Se tu avessi incapsulato tutti gli accessi tramite una serie di stored procedures parametriche, non avresti tutti questi problemi e anzi miglioreresti di molto:

- la sicurezza dato che sarebbe impossibile effettuare attacchi di SQL Injection;
- le prestazioni dato che i piani di esecuzione verrebbero riutilizzati ad ogni chiamata;
- la manutenibilità del codice perché avresti ben separati l'application layer dal data layer;
...

Mi fermo qua, ma la lista è ancora MOOOOOOOLTO lunga
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

Proverò a verificare anche queste cose... il discorso della lingua associata alla login potrebbe essere una cosa da provare in quanto di default l'ho settata in italiano ma effettivamente il server precedente era in una server farm americana...

Per ora grazie mille del supporto.

lbenaglia Profilo | Guru

>Proverò a verificare anche queste cose... il discorso della lingua
>associata alla login potrebbe essere una cosa da provare in quanto
>di default l'ho settata in italiano ma effettivamente il server
>precedente era in una server farm americana...

E guarda a caso gli americani utilizzano il punto "." come separatore decimale, mentre noi la virgola
Verifica anche le Regional Options del web server...

>Per ora grazie mille del supporto.
Di niente

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

joko Profilo | Newbie

Ho trovato l'errore.

Il problema nasceva dal fatto che il DB esportato da SQL2500 ed importato in SQL2000 perdeva in alcune tabelle l'autoincroemento del campo id.... per questo motivo il valore id del record veniva scritto <NULL> e di conseguenza le pagine ASP si piantavano.

Ho quindi messo l'autoicremento nella struttura delle tabelle e ora funziona tutto.



Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5