Errore Incorrect syntax near 'nome funzione'

venerdì 08 aprile 2011 - 15.21
Tag Elenco Tags  C#  |  .NET 2.0  |  Visual Studio 2005  |  SQL Server 2008 R2

mattekr Profilo | Newbie

Ciao a tutti, sto facendo un po di sperimentazione con SQL Server 2008.

A tal proposito ho creato una Stored Procedure che si occupa di inserire in tabella e di ritornare l'ID del record appena inserito

USE [NomeDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Inserisci_I]
@ID_I INT OUTPUT,
@Me VARCHAR(20),
@Me_Ca VARCHAR(20),
@De VARCHAR(255),
@C_T_I INT,
@In VARCHAR(255),
@CP VARCHAR(10),
@Cm VARCHAR(100),
@C_P INT,
@Te VARCHAR(20) = NULL,
@Fa VARCHAR(20) = NULL,
@Ma VARCHAR(100) = NULL
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Istituti
([Me],
[Me Ca],
[De],
[C T I],
[In],
[CP],
[Cm],
[C P],
[Te],
[Fa],
[Ma])
VALUES (@Me,
@Me_Ca,
@De,
@C_T_I,
@In,
@CP,
@Co,
@C_P,
@Te,
@Fa,
@Ma);
SET @ID_I = (SELECT @@IDENTITY);
END

Se chiamo la SP da Management Studio funziona correttamente, senza alcun problema.

Mentre se utilizzo il seguente codice da una pagina asp

string strConnection = Application["StrConnection"].ToString();
SqlConnection myConnection = new SqlConnection(strConnection);
myConnection.Open();

SqlCommand myCommand = new SqlCommand("Inserisci_I", myConnection);

myCommand.Parameters.Add("@Me", SqlDbType.VarChar).Value = "3";
myCommand.Parameters.Add("@Me_Ca", SqlDbType.VarChar).Value = "2";
myCommand.Parameters.Add("@De", SqlDbType.VarChar).Value = "3";
myCommand.Parameters.Add("@C_T_I", SqlDbType.Int).Value = 4;
myCommand.Parameters.Add("@In", SqlDbType.VarChar).Value = "5";
myCommand.Parameters.Add("@CP", SqlDbType.VarChar).Value = "6";
myCommand.Parameters.Add("@Co", SqlDbType.VarChar).Value = "7";
myCommand.Parameters.Add("@C_P", SqlDbType.Int).Value = 8;
myCommand.Parameters.Add("@Te", SqlDbType.VarChar).Value = "9";
myCommand.Parameters.Add("@Fa", SqlDbType.VarChar).Value = "10";
myCommand.Parameters.Add("@Ma", SqlDbType.VarChar).Value = "11";

SqlParameter IDIstituto = new SqlParameter("@ID_I", SqlDbType.Int);
IDIstituto.Direction = ParameterDirection.Output;
myCommand.Parameters.Add(IDIstituto);

myCommand.ExecuteNonQuery();

TextBox1.Text = myCommand.Parameters["@ID_I"].Value.ToString();

myConnection.Close();

mi ritorna l'errore "Incorrect syntax near 'Inserisci_I'.

Dove sbaglio?

Grazie, ciao

alexmed Profilo | Guru

Ciao
Credo che anche senza dichiarare il parametro di output si possa avere l'ultimo ID facendo al posto di SET =

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
RETURN [SCOPE_IDENTITY]

Prova e fammi sapere

Ciao

alexmed

mattekr Profilo | Newbie

Ciao, grazie per la risposta.

Ho provato ad utilizzare il tuo suggerimento ma il problema persiste.

Mi sono dimenticato di dire che l'istruzione che da errore è:

myCommand.ExecuteNonQuery();

Grazie, ciao.

alexmed Profilo | Guru

Usa "ExecuteScalar"

http://support.microsoft.com/kb/308049/it

Ciao

alexmed

mattekr Profilo | Newbie

Ciao, stesso errore anche con quel metodo. Mi sono letto anche tutto l'interessante articolo. Sembrerebbe che anche ExecuteNonQuery vada bene per quello che devo fare.

Adesso provo a semplificare la SP, diminiusco il numero di parametri e provo ad evitare di far tornare un valore. Spero così di capire dove si trova l'anomalia.

grazie, ciao.

alexmed Profilo | Guru


...

myCommand.Parameters.Add(IDIstituto);

newID As Integer = myCommand.ExecuteScalar();

TextBox1.Text = newID

myConnection.Close();

...
alexmed

alexmed Profilo | Guru

Ciao
Stavo riguardando il codice ... prova ad utilizzare questa procedura per eseguire la stored
Nel primao post: http://www.dotnethell.it/forum/messages.aspx?ThreadID=38844

Perchè in effetti non hai mai specificato che devi eseguire una stored

Ciao

alexmed

alx_81 Profilo | Guru

>Ciao
Ciao,
devi indicare che si tratta di una sp:

Comando.CommandType = CommandType.StoredProcedure

Quoto alexmed
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mattekr Profilo | Newbie

Grazie mille a entrambi, aggiungendo

Comando.CommandType = CommandType.StoredProcedure;

tutto funziona correttamente!



alx_81 Profilo | Guru

>Grazie mille a entrambi,
accetta la risposta di alexmed , perchè ti ha fatto notare anche un'altra cosa che vorrei approfondire ora.

Attenzione ad usare @@IDENTITY rispetto SCOPE_IDENTITY().

La prima ti torna l'ultima identità inserita effettivamente in tutta l'eventuale nidificazione di transazioni. Mi spiego meglio..
prendi l'esempio di una tabella con identity che lancia successivamente un trigger che, al suo interno, inserisce un'altra identity in una ulteriore tabella.
@@IDENTITY torna l'id inserito nella tabella all'interno dell trigger. Quindi l'ultimo della transazione globale.
SCOPE_IDENTITY() invece è quello di contesto, quello della transazione corrente, quindi torna quello della tabella che invoca la insert.

Quindi attenzione
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5