C#/SQL - Was ist mit SqlDbType.Xml in Prozeduren falsch?


5

Ich habe einige Leute gefragt, warum die Verwendung von XML als Parameter in der gespeicherten Prozedur nicht funktioniert und jeder sagte, das ist genau so wie es ist. Ich kann das nicht glauben.

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

Das ist, wo Compiler-Fehler zurückgibt, und ich kann nicht NVarChar verwenden beacouse es zu 4k singt limiteed wird. XML wäre perfekt, da es 2gig groß sein kann.

Wie funktionieren andere SqlDbTypes gut und dieser retrows Fehler?

*

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

*

  0

könnte gut sein, um den Fehler, wenn vorhanden, an den Beitrag anzuhängen. 22 feb. 092009-02-22 13:32:34

  0

Ich gehe davon aus, dass Sie mindestens SQL2005 verwenden und dass Ihre Spalte als XML-Datentyp deklariert ist? 22 feb. 092009-02-22 13:35:36

  0

Wenn Sie SQL Server 2005 verwenden, ist die Größe der NVARCHAR-Zeichenfolgen größer. Siehe das Schlüsselwort MAX - http://msdn.microsoft.com/en-us/library/ms186939.aspx - MAX gibt an, dass die maximale Länge für NVARCHAR 1.073.741.822 ist. 22 feb. 092009-02-22 13:37:59

  0

Wie sieht Ihr XML-Parameter aus und wie konstruieren Sie ihn? 22 feb. 092009-02-22 13:50:07

  0

Dieser Artikel könnte von Interesse sein - http://dotnet.sys-con.com/node/406637 - der gesamte Code ist über Hyperlinks verfügbar 22 feb. 092009-02-22 13:51:33

  0

@GregD - sql2005 tatsächlich; brauche keine XML-Spalten, gespeicherte Prozedur-Prozess-XML und füge Werte zu culums ein (getestet und funktioniert gut). @Russ Cam - Sie sprechen über SQL-Seite, für C# max ist 4k. Versuchte das. 22 feb. 092009-02-22 13:53:28

  0

Mit welcher Version des Frameworks möchten Sie kompilieren? Die SqlDatatype.Xml ist in .NET 1.1 nicht vorhanden. 22 feb. 092009-02-22 13:54:14

  0

Wenn es ein ASP.NET-Projekt ist, gehen Sie in die IIS-Einstellungen und prüfen Sie, ob Sie unter der richtigen Laufzeit laufen. 22 feb. 092009-02-22 13:56:20

  0

Compact Framewrok 3.5 22 feb. 092009-02-22 13:57:31

  0

@ Jacob- Ich schrieb ein Beispiel C# Konsole App neulich zu einem Kollegen zu demonstrieren, dass Sie mehr als 4000 Länge NVARCHAR Zeichenfolge in eine gespeicherte Prozedur übergeben können. Deshalb bin ich überzeugt, dass Sie es tun können. Sie müssen den richtigen CLR-Typ auswählen, um ihn dem NVARCHAR (MAX) SQL-Typ zuzuordnen. 22 feb. 092009-02-22 14:00:07

  0

Was ist der Typ des Befehlsobjekts? 22 feb. 092009-02-22 14:01:37

  0

Sie können die SqlCommand.Parameters.AddWithValue-Methode verwenden, von der ich glaube, dass sie dem Framework den Datentyp des Parameters 22 feb. 092009-02-22 14:05:04

  0

bei Verwendung der SqlCommand.Parameters ableitet.Add-Methode, dann glaube ich, dass der richtige SQLDbtype für NVARCHAR (MAX) ist NTEXT 22 feb. 092009-02-22 14:15:12

  0

Grundsätzlich die neuere VARCHAR (MAX), NVARCHAR (MAX) und VARBINARY (MAX) zugeordnet SQLDBTypes TEXT, NTEXT und IMAGE, 22 feb. 092009-02-22 14:19:19

13

Es funktioniert. Sie müssen den Wert als SqlXml und keine Zeichenfolge einrichten, aber es kann getan werden. Stellen Sie sich diese Tabelle:

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

Und die sproc:

CREATE PROCEDURE XmlTest_Insert 
(
    @XmlText xml 
) 
AS 

INSERT INTO XmlTest (XmlText) 
VALUES (@XmlText) 

Jetzt eine Konsolenanwendung Bild, das wie folgt aussieht:

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!

Dies wurde in Visual Studio 2008 (.NET 3.5) gemacht, aber ich bin ziemlich sicher, dass es auch in Visual Studio 2005 (2.0 Framework) funktionieren sollte.

  0

Ihr Beispiel funktioniert absolut gut, wie es sollte, obwohl, wenn ich es auf meiner CF 3.5 App versuche es sagen, dass SqlDbType.Xml - "angegebene Argument außerhalb des Bereichs der gültigen Werte.Parametername: @ Xmldoc: Ungültige SqlDbType Enumeration Wert: 25 "<- Sieht aus wie enum Xml für SqlDbType existiert nicht 22 feb. 092009-02-22 16:33:18

+1

Ich habe nicht erkannt, dass es Compact Framework war. Bevor ich die Übung ändere, müsste ich mir die CF-Regeln ansehen. Es ist eine Teilmenge der Funktionalität im vollständigen .NET Framework. 25 feb. 092009-02-25 16:31:37


0

Statt die Add-Methode zu verwenden, versuchen AddWithValue mit denen Sie nicht der Typ nur den Namen und den Wert angeben. Es sei denn, Sie verwenden eine andere Richtung für die Eingabe?

  0

I ' Ich habe es versucht, aber es gab mir einen Hinweis. Beim Debuggen habe ich gemerkt, dass der Wert NVarChar ist, also ist mein XML-Parameter falsch, ich benutze: data.Document.ToString(), wo Daten XDocument sind, braucht es vielleicht das Dokument mit Codepage-Informationen? 22 feb. 092009-02-22 14:15:48

  0

Anstatt die .ToString() -Methode zu verwenden, versuchen Sie, das eigentliche Objekt selbst bereitzustellen, da AddWithValue einen Zeichenfolgenparameter, aber einen Objektwert erwartet. Ich hätte gedacht, dass dann, wenn du dein XDocument bereitstellst, es das Format aufgreifen würde, oder wie du sagst, eine Codepage bereitstellen. 22 feb. 092009-02-22 14:32:33


-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 sollten Sie Details zu Ihrer Antwort geben 21 sep. 152015-09-21 15:02:06

  0

@netaholic Kommentare sind bereits hinzugefügt 22 sep. 152015-09-22 04:27:01