C#/SQL - 프로 시저에서 SqlDbType.Xml의 문제점은 무엇입니까?


5

저는 저장 프로 시저의 매개 변수로 xml을 사용하는 것이 효과적이지 않은 이유를 묻는 사람들이 거의 없었습니다. 나는 그것을 믿을 수 없다.

여기는 컴파일러에서 오류가 발생하여 NVarChar 비어스를 사용할 수 없기 때문에 4k 노래에 한정되어 있습니다. XML은 2 기가비트가 될 수 있으므로 완벽 할 것입니다.

어떻게 다른 SqlDbTypes가 제대로 작동하고이 오류가 다시 실행됩니까?

* *

  0

게시물에 오류가있는 경우 첨부 할 수 있습니다. 22 feb. 092009-02-22 13:32:34

  0

적어도 SQL2005를 사용 중이며 열이 XML 데이터 유형으로 선언되었다고 가정합니다. 22 feb. 092009-02-22 13:35:36

  0

SQL Server 2005 이상을 사용하는 경우 NVARCHAR 문자열의 크기가 더 커집니다. MAX 키워드 - http://msdn.microsoft.com/en-us/library/ms186939.aspx - MAX는 NVARCHAR의 최대 길이가 1,073,741,822임을 나타냅니다. 22 feb. 092009-02-22 13:37:59

  0

XML 매개 변수의 모양과 구성 방법은 무엇입니까? 22 feb. 092009-02-22 13:50:07

  0

이 기사는 관련된 내용 일 수 있습니다 - http://dotnet.sys-con.com/node/406637 - 모든 코드는 하이퍼 링크를 통해 제공됩니다 22 feb. 092009-02-22 13:51:33

  0

@GregD - sql2005 참으로; xml 열, 저장 프로 시저 프로세스 xml 및 culums에 값 삽입 (테스트 및 정상적으로 작동)이 필요하지 않습니다. @Russ Cam - 당신은 SQL 측에 대해 이야기하고 있습니다. 왜냐하면 C# max는 4k입니다. 그것을 시도했다. 22 feb. 092009-02-22 13:53:28

  0

어떤 버전의 프레임 워크를 컴파일하려고합니까? .NET 1.1에는 SqlDatatype.Xml이 없습니다. 22 feb. 092009-02-22 13:54:14

  0

ASP.NET 프로젝트 인 경우 IIS 설정으로 이동하여 올바른 런타임에서 실행 중인지 확인하십시오. 22 feb. 092009-02-22 13:56:20

  0

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

  0

@ Jacob- 요 전날 동료들에게 4000 자 길이 이상의 NVARCHAR 문자열을 저장 프로 시저에 전달할 수 있음을 보여주기 위해 예제 C# console app을 작성했습니다. 그러므로, 나는 당신이 그것을 할 수 있다고 단호합니다. NVARCHAR (MAX) SQL 유형 22 feb. 092009-02-22 14:00:07

  0

에 매핑하려면 올바른 CLR 유형을 선택해야합니다. 명령 객체의 유형은 무엇입니까? 22 feb. 092009-02-22 14:01:37

  0

SqlCommand.Parameters.AddWithValue 메서드를 사용할 수 있습니다.이 메서드는 프레임 워크에서 매개 변수의 데이터 형식을 유추합니다. 22 feb. 092009-02-22 14:05:04

  0

SqlCommand.Parameters를 사용하는 경우.Add 메서드를 사용하면 NVARCHAR (MAX)에 사용할 올바른 SQLDbtype이 NTEXT가됩니다. 22 feb. 092009-02-22 14:15:12

  0

기본적으로 새로운 VARCHAR (MAX), NVARCHAR (MAX) 및 VARBINARY (MAX)는 각각 SQLDBTypes TEXT, NTEXT 및 IMAGE에 매핑됩니다. 22 feb. 092009-02-22 14:19:19

13

작동하지 않습니다. Value는 SqlXml로 설정해야하며 문자열은 설정하지 않아도됩니다.

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

그리고 SPROC를 :이 테이블을 상상해

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(); 
     } 
    } 
} 

빙고 :

CREATE PROCEDURE XmlTest_Insert 
(
    @XmlText xml 
) 
AS 

INSERT INTO XmlTest (XmlText) 
VALUES (@XmlText) 

이제 다음과 같습니다 콘솔 응용 프로그램을 사진!

이 작업은 Visual Studio 2008 (.NET 3.5)에서 수행되었지만 Visual Studio 2005 (2.0 Framework)에서도 작동해야합니다.

  0

당신의 예제는, 필자의 예제에서 absoloutle을 잘 작동하지만, 내 CF 3.5 응용 프로그램에서 SqlDbType.Xml - "지정된 인수가 유효 범위를 벗어났습니다. 매개 변수 이름 : @xmldoc : Invalid SqlDbType enumeration 값 : 25 "<- 열거 형처럼 보이는 SqlDbType의 Xml이 없습니다. 22 feb. 092009-02-22 16:33:18

+1

Compact Framework라는 것을 알지 못했습니다. 나는 운동을 변경하기 전에 CF의 규칙을 봐야 할 것입니다. 전체 .NET Framework의 일부 기능입니다. 25 feb. 092009-02-25 16:31:37


0

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

대신 추가 방법을 사용하면 유형을 단지 이름과 값을 지정할 필요가 없습니다 경우, AddWithValue를 사용해보십시오. 다른 방향으로 입력하지 않는 한?

  0

&apos; ve는 그것을 시도했다. 그러나 그것은 나에게 단서를 줬다. 그것을 디버깅하는 동안 나는 값이 NVarChar라고 생각하여 xml 매개 변수가 잘못된 형식으로되어 있으므로 data.Document.ToString()을 사용합니다. 여기서 데이터는 XDocument이고 코드 페이지 정보가있는 문서가 필요합니까? 22 feb. 092009-02-22 14:15:48

  0

.ToString() 메서드를 사용하는 대신 실제 개체 자체를 제공하십시오. AddWithValue는 문자열 매개 변수이지만 개체 값을 필요로합니다. 그때 당신의 XDocument를 제공하면 그것이 형식을 고를 것이라고 생각했거나 코드 페이지를 제공한다고 말했을 것입니다. 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 답변에 대한 자세한 내용을 제공해야합니다 21 sep. 152015-09-21 15:02:06

  0

@netaholic 덧글이 이미 추가되었습니다. 22 sep. 152015-09-22 04:27:01