C#/SQL - Có gì sai với SqlDbType.Xml trong các thủ tục?


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 đó.

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. 22 feb. 092009-02-22 13:32:34

  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? 22 feb. 092009-02-22 13:35:36

  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 22 feb. 092009-02-22 13:37:59

  0

Thông số XML của bạn trông như thế nào và bạn đang xây dựng nó như thế nào? 22 feb. 092009-02-22 13:50:07

  0

Bài viết này có thể được quan tâm - http://dotnet.sys-con.com/node/406637 - tất cả các mã có sẵn thông qua các siêu liên kết 22 feb. 092009-02-22 13:51:33

  0

@GregD - sql2005 thực sự; không cần các cột xml, quy trình thủ tục lưu trữ xml và chèn các giá trị vào các nút con (được thử nghiệm và hoạt động tốt). @Russ Cam - Bạn đang nói về mặt sql, cho C# max là 4k. Đã thử điều đó. 22 feb. 092009-02-22 13:53:28

  0

Phiên bản nào của khung công tác mà bạn đang cố gắng biên dịch? SqlDatatype.Xml không tồn tại trong .NET 1.1. 22 feb. 092009-02-22 13:54:14

  0

Nếu đó là một dự án ASP.NET đi vào các thiết lập IIS và kiểm tra xem bạn đang chạy dưới thời gian chạy chính xác. 22 feb. 092009-02-22 13:56:20

  0

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

  0

@ Jacob- Tôi đã viết một ví dụ ứng dụng giao diện điều khiển C# ngày khác để chứng minh cho một đồng nghiệp rằng bạn có thể vượt qua chuỗi dài hơn 4000 chiều dài NVARCHAR vào một thủ tục được lưu trữ. Do đó, tôi kiên quyết rằng bạn có thể làm điều đó. Bạn cần phải chọn kiểu CLR chính xác để ánh xạ tới kiểu câu lệnh NVARCHAR (MAX) 22 feb. 092009-02-22 14:00:07

  0

Loại đối tượng lệnh là gì? 22 feb. 092009-02-22 14:01:37

  0

Bạn có thể sử dụng phương thức SqlCommand.Parameters.AddWithValue, mà tôi tin rằng rời khỏi khung để suy ra kiểu dữ liệu của tham số 22 feb. 092009-02-22 14:05:04

  0

Nếu sử dụng SqlCommand.Parameters.Thêm phương pháp, sau đó tôi tin rằng SQLDbtype đúng để sử dụng cho NVARCHAR (MAX) là NTEXT 22 feb. 092009-02-22 14:15:12

  0

Về cơ bản, VARCHAR (MAX), NVARCHAR (MAX) và VARBINARY (MAX) mới nhất được ánh xạ tới SQLDBTypes TEXT, NTEXT và IMAGE, tương ứng 22 feb. 092009-02-22 14:19:19

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 22 feb. 092009-02-22 16:33:18

+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 đủ. 25 feb. 092009-02-25 16:31:37


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ã? 22 feb. 092009-02-22 14:15:48

  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ã. 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 bạn nên cung cấp thông tin chi tiết về câu trả lời của bạn 21 sep. 152015-09-21 15:02:06

  0

nhận xét @netaholic đã được thêm 22 sep. 152015-09-22 04:27:01