PDA

View Full Version : نحوه ارسال يك آرايه يا DataTable به stored Procedure



medalion_girl
دوشنبه 21 تیر 1389, 10:06 صبح
http://www.p2p.dotnetsource.com/default.aspx?g=posts&t=90
سلام
براي اين كار به لينك بالا مراجعه كردم ولي كدش سخت بود و متوجه نشدم.
شما روش بهتري نمي دونيد؟

حمیدرضاصادقیان
دوشنبه 21 تیر 1389, 10:39 صبح
سلام.شما دقیقا بفرمائید میخواهید چکاری انجام بدید.شاید اصلا نیازی به ارسال آرایه نباشه و راه حل مناسبتری وجود داشته باشه.

AminSobati
دوشنبه 21 تیر 1389, 12:07 عصر
سلام دوست عزیزم،
از کدوم نسخه SQL Server استفاده میکنید؟

sia_2007
دوشنبه 21 تیر 1389, 13:13 عصر
ارسال جمعی دیتا به SP فقط تو SQL Server 2008 ممکن هستش.


USE NorthWind
GO
DROP PROCEDURE usp_InsertOrder
GO

DROP TYPE OrderDetailsTable
GO

CREATE TYPE OrderDetailsTable AS Table(ProductID INT ,
Quantity INT ,
UnitPrice Money ,
Discount Float);
GO

CREATE PROCEDURE usp_InsertOrder( @OrderDate DateTime ,
@CustomerID nChar(5),
@EmployeeID INT ,
@OrderDetails OrderDetailsTable READONLY ,
@OrderID INT OUTPUT )
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON

BEGIN TRAN

INSERT INTO Orders (OrderDate,CustomerID,EmployeeID)
VALUES (@OrderDate , @CustomerID , @EmployeeID);

SET @OrderID = SCOPE_IDENTITY();

INSERT INTO [Order Details]
SELECT @OrderID , *
FROM @OrderDetails

COMMIT TRAN

END

GO


بعد برا استفاده داریم :




SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=(local);Integrated Security=SSPI;Initial Catalog=NorthWind";

SqlCommand cmd = cn.CreateCommand();

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "usp_InsertOrder";

cmd.Parameters.AddWithValue("@OrderDate", DateTime.Now);
cmd.Parameters.AddWithValue("@CustomerID", txtCustomerID.Text);
cmd.Parameters.AddWithValue("@EmployeeID", 3);

SqlParameter tvparam = cmd.Parameters.AddWithValue("@OrderDetails", northWindDataSet1.OrderDetails);
tvparam.SqlDbType = SqlDbType.Structured;
tvparam.TypeName = "dbo.OrderDetailsTable";

int OrderId = 0;
SqlParameter outparam = cmd.Parameters.AddWithValue("@OrderID", OrderId);
outparam.Direction = ParameterDirection.InputOutput;

cn.Open();
cmd.ExecuteNonQuery();
cn.Close();


موفق باشی

mohsensaghafi
سه شنبه 22 تیر 1389, 02:15 صبح
سلام دوست عزیز.
اگر درست فهمیده باشم منظورت رو، می تونی از فایل های XML هم استفاده کنی.
موفق باشی.

medalion_girl
سه شنبه 22 تیر 1389, 14:36 عصر
با سلام و تشكر از همهي دوستاني كه كمك كردند :
از Visual studio 2008 اسفاده مي كنم و طبق عادت هميشگيم از همون express sql خود VS .
دارم يه فروشگاه آنلاين درست مي كنم و مي خوام وقتي كاربر خريدشو تاييد كرد ، UserID به همراه تمامي ProductID ها و OrderDate كالاهايي كه سفارش داده رو در جدول ShoppingCard ، Insert كنم . خوب اين به ازاي هر كالايي كه سفارش مي ديم نياز به يك Insert داره .

CREATE TYPE OrderDetailsTable AS Table(ProductID INT ,
Quantity INT ,
UnitPrice Money ,
Discount Float);


امتحان كردم گويا Sql Express ، تايپ رو ساپورت نمي كنه . به نظرتون بايد از خود sql 2008 استفاده كنم ؟
در ضمن يه بخش هايي از كدتونو نفهميدم ، مثل :
USE NorthWindGODROP PROCEDURE usp_InsertOrderGO DROP TYPE OrderDetailsTableGO

و
SET XACT_ABORT ONSET NOCOUNT ON

لطفاً اگه ممكنه در مورد اين قسمت ها هم توضيح بديد :
SqlParameter tvparam = cmd.Parameters.AddWithValue("@OrderDetails", northWindDataSet1.OrderDetails); tvparam.SqlDbType = SqlDbType.Structured; tvparam.TypeName = "dbo.OrderDetailsTable"; int OrderId = 0; SqlParameter outparam = cmd.Parameters.AddWithValue("@OrderID", OrderId); outparam.Direction = ParameterDirection.InputOutput;

من سرغ XML هم رفتم ولي چيزي متوجه نشدم :

Suppose the XML is like this:
<?xml version="1.0" encoding="utf-8" ?>
<MESSAGE xmlns="https://tempuri.org">
<HEADER>
<TAG1>test</TAG1>
<TAG2></TAG2>
</HEADER>
<DETAILS>
<TAG1></TAG1>
<TAG2></TAG2>
</DETAILS>
</MESSAGE>

and the stored procedure:
create PROCEDURE ProcessXMLDocument

@xmlDoc varchar(8000)
AS
DECLARE @hDoc int
/*Load the document*/
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmlDoc
DECLARE @message varchar(10)

SELECT @message= [TAG1]
FROM OPENXML
(@hdoc,'//HEADER',2)
WITH
(TAG1 varchar(10))

When this XML is passed into the stored procedure, XPath queries would not always return the correct result. This query would not return anything.
Following code would solve the problem by removing the namespace tags:
create PROCEDURE ProcessXMLDocument
@xmlDoc varchar(8000)
AS
-------------------------------------------------------------------------
DECLARE @hDoc int,
@NSEndPos int
-------------------------------------------------------------------------
/*Remove the xml declaration as it messes up the
document use the first end tag (>) as the marker for text removal*/
-------------------------------------------------------------------------
Select @NSEndPos = PATINDEX('%>%', @xmldoc) +1
Select @xmldoc = Substring(@xmldoc,@NSEndPos,Len(@xmldoc) - @NSEndPos +1)
-------------------------------------------------------------------------
/*Remove the Namespace as it messes up the document use
the first end tag (>) as the marker for text removal*/
-------------------------------------------------------------------------
Select @NSEndPos = PATINDEX('%>%', @xmldoc) +1
Select @xmldoc = '<MESSAGE>' + Substring(@xmldoc,
@NSEndPos,Len(@xmldoc) - @NSEndPos +1)
-------------------------------------------------------------------------
/*Load the document*/
EXEC sp_xml_preparedocument @hDoc OUTPUT, @xmlDoc
DECLARE @message varchar(10)

SELECT @message= [TAG1]
FROM OPENXML
(@hdoc,'//HEADER',2)
WITH
(TAG1 varchar(10))


خيلي برام گنگه . دنبال يه كد ساده تر هستم .