Stored procedure e Xml

mercoledì 30 luglio 2003 - 15.01

farfalla Profilo | Newbie

Salve,
avrei bisogno di inserire dei dati in una tabella, per questo utilizzo una stored procedure ,utilizzando una dll ,da noi creata , che richiama la SP, dal momento che i dati da passare alla SP sono molti avevo pensato di utilizzare l'XML.
Qualcuno può suggerirmi qualche esempio da consultare? o una strada alternativa.

Grazie :-)

Brainkiller Profilo | Guru

Anche io mi aggiungo a Coach e ti chiedo ulteriori dettagli.
I tipi di file che devi inserire in che formato sono? Già in XML?
Tu vuoi procedere con un approccio basato più sulle classi del Framework oppure importare i dati tramite SQL Server direttamente?

Nel secondo caso puoi documentarti sulla guida di SQL Server che è completa e dettagliata e cercare le due Stored Procedure sp_xml_preparedocument e sp_xml_removedocument. Inoltre guarda anche all'istruzione T-SQL OPENXML che è molto fondamentale per inserire o estrarre dati.

Ciao
David

farfalla Profilo | Newbie

ok ecco cosa devo fare ho un file .vb che contiene la seguente function

Public Function inserisciUtente(ByVal _utente As String,ByVal _utente1 As String , ByVal _utente2 As String,....) As SqlDataReader

Dim objCmd As SqlCommand

Try
objCmd = New SqlCommand("cmd_inserisciUtenteRegistrato", objConnection)
objCmd.CommandType = CommandType.StoredProcedure
If objConnection.State <> ConnectionState.Open Then
objConnection.Open()
End If
objCmd.Parameters.Add("@hdoc", _utente)
......
inserisciUtente = objCmd.ExecuteReader()
'objConnection.Close()


Catch ex As Exception
'Da gestire
Finally

End Try

End Function

poi dopo aver compilato il tutto e importato la dll generata nel mio progetto richiamo al click sul bottone tale funzione.
in questo modo
inserisciuTente(param1,param2,....)
Ora per evitare di passare tutti i parametri alla SP avevo pensato di usare una stringa xml.

Il mio problema è una volta generato lo stream xml nel mio progetto, quale è la sintassi asp.net per passare alla SP tale stream xml?

per maggior chiarezza vi invio anche il codice della sp

CREATE PROCEDURE dbo.cmd_inserisciUtenteRegistrato(@strXML varchar(8000))
AS

SET NOCOUNT ON

DECLARE @hdoc int
DECLARE @newId int
-- DECLARE @ReturnString varchar(50)
-- DECLARE @data as smalldatetime


--+--------------+----------------------------- Anagrafica -------------------------------------------------------------------------------------------------+

DECLARE @retrievedValues table (Login varchar(50),
Password varchar(50),
Cognome varchar(50),
Nome varchar(50),
Sesso char(1),
CodComuneNas varchar(6),
DataNascita varchar(50),
Email varchar(50),
ServizioMilitare varchar(50),
IndResidenza varchar(100),
CodComuneRes varchar(6),
CapRes char(5),
IndDomicilio varchar(100),
CAPDom char(5),
CodComuneDom varchar(6),
Telefono varchar(20),
Fax varchar(20) )

SELECT @newId = MIN(IdPersona+1 )
FROM Utenti
WHERE IdPersona+1 NOT IN (SELECT IdPersona FROM Utenti )

SET @newId = ISNULL( @newId, 1)

EXEC sp_xml_preparedocument @hdoc OUTPUT, @strXML

BEGIN TRAN

INSERT @retrievedValues
SELECT *
FROM OPENXML(@hdoc,'Root/Login',2)
WITH ( Login varchar(50) '.',
Password varchar(50) '.',
Cognome varchar(50) '.',
Nome varchar(50) '../Nome',
Sesso char(1) '../Sesso',
CodComuneNas varchar(6) '../CodComuneNas',
DataNascita varchar(50) '../DataNascita',
Email varchar(50) '../Email',
ServizioMilitare varchar(50) '../ServizioMilitare',
IndResidenza varchar(100) '../IndResidenza',
CodComuneRes varchar(6) '../CodComuneRes',
CapRes char(5) '../CapRes',
IndDomicilio varchar(100) '../IndDomicilio',
CAPDom char(5) '../CapDom',
CodComuneDom varchar(6) '../CodComuneDom',
Telefono varchar(20) '../Telefono',
Fax varchar(20) '../Fax' )

IF @@ERROR <> 0
BEGIN
GOTO ON_ERROR
END


INSERT INTO UTENTI (IdPersona, Login, Password, Cognome, Nome, Sesso, CodComuneNas, DataNascita, Email, ServizioMilitare, IndResidenza, CodComuneRes, CapRes, IndDomicilio, CAPDom, CodComuneDom, Telefono, Fax)
SELECT @newId, login, password, Cognome , Nome, Sesso, CodComuneNas, CONVERT(smalldatetime,DataNascita,105), Email, ServizioMilitare, IndResidenza, CodComuneRes, CapRes, IndDomicilio, CAPDom, CodComuneDom, Telefono, Fax
FROM @retrievedValues


--+--------------+----------------------------- Inserting records terminated -------------------------------------------------------------------------------------------------+


IF @@ERROR <> 0
BEGIN
GOTO ON_ERROR
END

COMMIT TRAN

SELECT 0 ErrorStatu

Brainkiller Profilo | Guru

Ciao Farfalla,
credo di aver capito cosa vuoi fare, in pratica vuoi eliminare tutta la serie di parametri dalla Stored Procedure e utilizzarne solo uno magari di tipo nvarchar in cui passi tutta una stringa formato XML con all'interno tutti i valori?
Passando da ASP.NET o da .NET comunque a SQL puoi semplicemente aggiungere un parametro e passare una stringa. Secondo me però non è un metodo buono perchè una volta che la stringa XML arriva a SQL Server dovresti scompattarla e ricavare dalla struttura XML i dati.
Il problema è che in SQL Server non c'è a disposizione un vero e proprio DOM per operare su documenti XML e quindi dovresti arrangiarti in altro modo.
A mio avviso già il metodo che stai utilizzando è molto buono, anche se certamente può essere noioso passare numerosi parametri a una Stored Proc, sicuramente però è molto più chiara che passare una stringa XML.
Forse nella prossima versione di SQL chiamata Yukon ci sarà la possibilità di scrivere Stored Procedures sia in T-SQL che in un linguaggio .NET e quindi sarà probabile che ciò che vuoi fare sarà possibile.

Cosa ne pensi tu?
Ciao

farfalla Profilo | Newbie

Cmq, sono riuscita a fare quello che volevo ho creato un varchar di 8000caratteri e tutto sembra funzionare correttamente.

Grazie cmq dell'aiuto
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