2009-02-22 14 views
5

Tôi đã hỏi vài người tại sao sử dụng xml như một tham số trong thủ tục lưu trữ không hoạt động và mọi người đều nói, đó chỉ là cách thực hiện. Tôi không thể tin được điều đó.C#/SQL - Có gì sai với SqlDbType.Xml trong các thủ tục?

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

Đó là nơi trình biên dịch trả về lỗi và tôi không thể sử dụng NVarChar beacouse nó bị giới hạn trong 4k hát. XML sẽ là hoàn hảo vì nó có thể là 2gigs lớn.

Làm cách nào các SqlDbTypes khác hoạt động tốt và lỗi này truyền lại lỗi?

*

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

*

+0

có thể là tốt để đính kèm lỗi nếu có bất kỳ bài đăng nào. –

+0

Tôi giả sử bạn đang sử dụng ít nhất SQL2005 và cột của bạn được khai báo là một kiểu dữ liệu XML? – GregD

+0

nếu bạn đang sử dụng SQL Server 2005 trở đi, có giới hạn lớn hơn đối với kích thước của chuỗi NVARCHAR. Xem từ khóa MAX - http://msdn.microsoft.com/en-us/library/ms186939.aspx - MAX chỉ ra rằng chiều dài tối đa cho NVARCHAR là 1.073,741,822 –

Trả lời

13

Nó hoạt động. Bạn sẽ phải thiết lập Value như SqlXml chứ không phải một chuỗi, nhưng nó có thể được thực hiện. Hãy tưởng tượng bảng này:

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

Và sproc:

CREATE PROCEDURE XmlTest_Insert 
(
    @XmlText xml 
) 
AS 

INSERT INTO XmlTest (XmlText) 
VALUES (@XmlText) 

Bây giờ hình dung ra một ứng dụng giao diện điều khiển trông giống như thế này:

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!

Điều này đã được thực hiện trong Visual Studio 2008 (.NET 3.5), nhưng tôi khá chắc chắn nó sẽ làm việc trong Visual Studio 2005 (2.0 Framework), là tốt.

+0

Ví dụ của bạn hoạt động tốt đẹp như nó phải, mặc dù khi tôi thử nó trên ứng dụng CF 3.5 của tôi nó tiếp tục nói rằng SqlDbType.Xml - "Đối số được chỉ định nằm ngoài phạm vi giá trị hợp lệ. Tên thông số: @xmldoc: SqlDbType không hợp lệ liệt kê giá trị: 25 "<- Hình như enum Xml cho SqlDbType không tồn tại – Jacob

+1

Tôi đã không nhận ra đó là Compact Framework. Tôi sẽ phải xem xét các quy tắc của CF trước khi thay đổi bài tập. Nó là một tập con của chức năng trong Khuôn khổ .NET đầy đủ. –

0

Thay vì sử dụng Add Method, hãy thử sử dụng AddWithValue mà bạn không cần phải xác định loại chỉ là tên và giá trị. Trừ khi bạn đang sử dụng một hướng khác để nhập?

+0

I ' đã thử điều đó, nhưng nó đã cho tôi một đầu mối. Trong khi gỡ rối nó tôi đã nhận thấy rằng nó nghĩ rằng giá trị là NVarChar, vì vậy tham số xml của tôi là ở định dạng sai, tôi sử dụng: data.Document.ToString(), nơi dữ liệu là XDocument, có lẽ nó cần doc với thông tin mã? – Jacob

+0

Thay vì sử dụng phương thức .ToString(), hãy thử cung cấp chính đối tượng thực, vì AddWithValue mong đợi một tham số chuỗi nhưng một giá trị đối tượng. Tôi đã nghĩ rằng sau đó cung cấp XDocument của bạn nó sẽ nhận về định dạng, hoặc khi bạn nói cung cấp một mã. –

-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 bạn nên cung cấp thông tin chi tiết về câu trả lời của bạn – netaholic

+0

nhận xét @netaholic đã được thêm –