2009-02-22 6 views
5

Ho chiesto a poche persone perché l'uso di xml come parametro nella stored procedure non funzioni e tutti hanno detto, è proprio così. Non posso crederlo.C#/SQL - Cosa c'è di sbagliato con SqlDbType.Xml nelle procedure?

command.Parameters.Add("@xmldoc", SqlDbType.Xml); 

Ecco dove compilatore restituisce un errore e non posso utilizzare nvarchar beacouse è limiteed a 4k canta. XML sarebbe perfetto in quanto può essere grande 2gigs.

Come mai altri SqlDbTypes funzionano correttamente e questo ritorna a errori?

*

Error: Specified argument was out of the range of valid values. Parameter name: @xmldoc: Invalid SqlDbType enumeration value: 25.

*

+0

potrebbe essere utile allegare l'eventuale errore nel post. –

+0

Suppongo che tu stia utilizzando almeno SQL2005 e che la tua colonna sia dichiarata come un tipo di dati XML? – GregD

+0

se si utilizza SQL Server 2005 in poi, esiste un limite maggiore alla dimensione delle stringhe NVARCHAR. Vedere la parola chiave MAX - http://msdn.microsoft.com/en-us/library/ms186939.aspx - MAX indica che la lunghezza massima per NVARCHAR è 1.073.741.822 –

risposta

13

Funziona. Dovrai impostare il valore come SqlXml e non una stringa, ma può essere fatto. Immaginate questa tabella:

CREATE TABLE XmlTest 
(
    [XmlTestId] [int] identity(1,1) primary key, 
    [XmlText] [xml] NOT NULL 
) 

E lo sproc:

CREATE PROCEDURE XmlTest_Insert 
(
    @XmlText xml 
) 
AS 

INSERT INTO XmlTest (XmlText) 
VALUES (@XmlText) 

Ora, immaginate un'applicazione console che assomiglia a questo:

using System.Data.SqlClient; 
using System.Data; 
using System.Data.SqlTypes; 
using System.Xml; 

namespace TestConsole 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      string xmlDoc = "<root><el1>Nothing</el1></root>"; 
      string connString = "server=(local);database=IntroDB;UID=sa;PWD=pwd"; 
      SqlConnection conn = new SqlConnection(connString); 
      SqlCommand cmd = new SqlCommand("XmlTest_Insert", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 
      SqlParameter param = new SqlParameter("@XmlText", SqlDbType.Xml); 
      param.Value = new SqlXml(new XmlTextReader(xmlDoc 
          , XmlNodeType.Document, null)); 
      cmd.Parameters.Add(param); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
      conn.Dispose(); 
     } 
    } 
} 

Bingo!

Questo è stato eseguito in Visual Studio 2008 (.NET 3.5), ma sono abbastanza sicuro che dovrebbe funzionare anche in Visual Studio 2005 (2.0 Framework).

+0

L'esempio funziona bene come dovrebbe, anche se quando lo provo sulla mia app CF 3.5 continua a dire che SqlDbType.Xml - "L'argomento specificato era fuori dall'intervallo di valori validi. Nome parametro: @xmldoc: Enumerazione SqlDbType non valida value: 25 "<- Sembra che enum Xml per SqlDbType non esiste – Jacob

+1

Non mi ero reso conto che fosse Compact Framework. Dovrei guardare le regole della FC prima di modificare l'esercizio. È un sottoinsieme della funzionalità in .NET Framework completo. –

0

Invece di utilizzare il metodo Add, provare a utilizzare AddWithValue in cui non è necessario specificare solo il nome e il valore del tipo. A meno che non si stia utilizzando una direzione diversa per l'input?

+0

I ' Ci ho provato, ma mi ha dato un indizio. Durante il debug ho notato che pensa che il valore sia NVarChar, quindi il mio parametro xml è nel formato sbagliato, io uso: data.Document.ToString(), dove i dati sono XDocument, forse ha bisogno del doc con le informazioni sulla codepage? – Jacob

+0

Invece di usare il metodo .ToString() prova a fornire l'oggetto stesso, poiché AddWithValue si aspetta un parametro stringa ma un valore oggetto. Avrei pensato che quindi fornire il tuo XDocument avrebbe raccolto nel formato, o come si dice fornire una codepage. –

-2
 
//Create The StringWriter Object 

var stringWriter = new System.IO.StringWriter(); 

//Create XmlSerializer Object for the serialization, 
RequestUpdateRBCustomerExternal is the Class of which type having all the values 

var serializer = new XmlSerializer(typeof(RequestUpdateRBCustomerExternal)); 

//request is of type RequestUpdateRBCustomerExternal 

serializer.Serialize(stringWriter, request); 

SqlXml xml = new SqlXml(new XmlTextReader(stringWriter.ToString(), XmlNodeType.Document, null)); 

cmd.CommandText ="insert into SAPDataTracking values('"+DateTime.Now+"','"+xml.Value+"')"; 
+0

IMO dovresti fornire i dettagli sulla tua risposta – netaholic

+0

@ i commenti nazionali sono già stati aggiunti –

Problemi correlati