PDA

View Full Version : سوال: دریافت خروجی استور پروسیجر sql باC#‎‎‎‎.Net



M aJi D
پنج شنبه 05 شهریور 1388, 19:06 عصر
سلام.
من تازه C#‎‎‎‎‎‎.Net را شروع کردم .1 استور پروسیجر دارم مثل :


Id@@,
Name output@@
Select Name From Table1 Where Id =@Id
حالا میخوام خروجی این استور پروسیجر را که با Name@@ مشخص شده تو صفحم بریزم تو 1 textbox میخوام بدونم چجوری باید این خروجی را دریافت کنم.
با دستور
SqlCommand.executreader
نشد.

ممنون

ممنون

مهدی کرامتی
جمعه 06 شهریور 1388, 00:41 صبح
فرض کن Stored Procedure ات این شکلی است:
CREATE PROCEDURE sp_YourSpName
@Param1 int,
@Param2 int output
as
begin
Select @Param2 = Age from People where ID = @Param1
end
با افزودن یک پارامتر که Direction آن output است می توانی مقدار خروجی را بخوانی:
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrin gs["TestDB2"].ToString());
connection.Open();

SqlCommand cmd = new SqlCommand("sp_YourSpName",connection);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("Param1", 1));

SqlParameter param2 = new SqlParameter();
param2.ParameterName = "Param2";
param2.DbType = DbType.Int32;
param2.Direction = ParameterDirection.Output;

cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

int x = (int)param2.Value;

در خطوط 9 تا 12 مثال فوق کاری که گفتم انجام شده.

M aJi D
یک شنبه 08 شهریور 1388, 22:19 عصر
آقا ممنون برای راهنماییتون .
ولی چون خروجی استور پروسیجر من nvarcharهستش.اون دستورات شما را به شکل زیر تغییر دادم ولی ارور میده که سایز متغییر کمه انگار حقیقتش یادم رفت ارور را ذخیره کنم الانم دسترسی به C#‎‎ ندارم باز تست کنم ولی یادمه همچین چیزی بود که تو پروپرتی متغییرتون سایز 0 است.کمه.

SqlConnection EditGradeconnection = new
SqlConnection("Integrated Security=SSPI;Persist Security Info=False;" +
"Initial Catalog=UniversityComputer;Data Source=varkan1");
SqlCommand EditGradecommand = new SqlCommand();
EditGradecommand.Connection = EditGradeconnection;
EditGradecommand.CommandText = "EditGrade";
EditGradecommand.CommandType = CommandType.StoredProcedure;
EditGradecommand.Parameters.AddWithValue("@Id",
IdTxt.Text);
EditGradeconnection.Open();
SqlParameter Name = new SqlParameter();
Name.ParameterName = "Name";
Name.DbType = DbType.String;
Name.Direction = ParameterDirection.Output;
EditGradecommand.Parameters.Add(Name);
EditGradecommand.ExecuteNonQuery();
GradeTxt.Text = (string)Name.Value;

مهدی کرامتی
یک شنبه 08 شهریور 1388, 23:19 عصر
من در مثال خودم SP را طوری تغییر دادم که یک عبارت رشته برگرداند:
ALTER Procedure [dbo].[sp_YourSpName]
@Param1 int,
@Param2 nvarchar(50) output
as
begin
Select @Param2 = Name from People where ID = @Param1
end

اکنون لازم است کد C# به شکل زیر تغییر کند:
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrin gs["TestDB2"].ToString());
connection.Open();

SqlCommand cmd = new SqlCommand("sp_YourSpName",connection);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add(new SqlParameter("Param1", 1));

SqlParameter param2 = new SqlParameter();
param2.ParameterName = "Param2";
param2.DbType = DbType.String;
param2.Direction = ParameterDirection.Output;
param2.Size = 50;

cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

string x = (string)param2.Value;
تفاوت این مثال با مثال قبلی در افزوده شدن این خط است:
param2.Size = 50;

M aJi D
سه شنبه 10 شهریور 1388, 22:12 عصر
سلام.
اول خیلی ممنون از راهنماییتون دقیقاً همین بود جواب داد ممنون.
اما حالا میخوام چندتا خروجی با نوع های مختلف برگردونم مثلاً
نام و نام خانوادگی string
شماره شناسنامه int
تاریخ تولد date
و....
اونا را از همین راه زدم هر بار 1 اروری داد.
میشه راجع به اونم راهنمایی کنید؟
ممنون

مهدی کرامتی
سه شنبه 10 شهریور 1388, 22:43 عصر
اگر در Stored Procedure چند مقدار خروجی دارید کافیه چند پارامتر از نوع output تعریف کنید و خطوط 9 تا 13 مثال مطرح شده در پست 4 را به ازای آن پارامترها هم تکرار کنید. اگر مشکلی بود آنرا همراه با متن خطا شرح دهید.

ali_yousefian19
سه شنبه 17 شهریور 1388, 01:35 صبح
سلام،خسته نباشین
سوال من هم مربوط به همین موضوع میشه برای همین تو این تاپیک میپرسم
من یک پروسیجر دارم به این شکل

create procedure usp_test
@name nvarchar(50),
@id int,
@tel int=null,
@Result int output
...
return @result

توجه کنین که @tel میتونه خالی هم باشه
برای استفاده از این پروسیجر در برنامه ام از این کد استفاده کردم

string constr = ConfigurationManager.ConnectionStrings["test"].ConnectionString;
SqlConnection con = new SqlConnection(constr);

SqlCommand cmd2 = new SqlCommand("usp_test", con);
SqlParameter id_nir2 = cmd2.Parameters.Add("@result", SqlDbType.Int);
id_nir2.Direction = ParameterDirection.ReturnValue;
cmd2.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = TextBox1.Text;
cmd2.Parameters.Add("@id", SqlDbType.Int).Value = convert.toint16(TextBox2.Text);
cmd2.Parameters.Add("@tel", SqlDbType.Int).Value =convert.toint16(TextBox3.Text);

cmd2.CommandType = CommandType.StoredProcedure;

cmd2.ExecuteNonQuery();

int i2 =(int) id_nir2.Value;

حالا دوتا سوال دارم:
1) اگه من textBox3 را خالی بزارم این صفحه ارور میده ، باید چیکار کنم؟
2)آیا روشی هست که برای هر پارامتر ورودی لازم نباشه تغییر نوع بدیم ، منظورم اینه که لازم نباشه (convert.toint16(TextBox3.Text را بنویسم

با تشکر

مهدی کرامتی
سه شنبه 17 شهریور 1388, 02:45 صبح
1- در خط 6 میبایست از نوع ParamaterDirection.Output استفاده کنید، ReturnType فقط برای خواندن مقداری که دستور Return برمیگردونه استفاده میشه.

2- در اینجا لازم نیست نوع پارامترها رو صریحا مشخص کنید. خود SQL Server مقادیری که شما بدون مشخص کردن نوع پاس می دهید به نوع داده پارامتر تبدیل میکند. بنابراین خطوط 7 تا 9 می توانند بدین شکل باشند:
cmd2.Parameters.Add(new SqlParameter("name", TextBox1.Text));
cmd2.Parameters.Add(new SqlParameter("id", TextBox2.Text));
cmd2.Parameters.Add(new SqlParameter("tel", TextBox3.Text));

ali_yousefian19
سه شنبه 17 شهریور 1388, 10:46 صبح
بسیار عالی ، تشکر
تنها مشکلی که داشتم برای فیلدی بود که داخل دیتا بیس money تعریف میکردم که ارور میداد که نمیتونه nvarchar را به money تبدیل کنه و من مجبور شدم بروش زیر عمل کنم


cmd2.Parameters.Add(new SqlParameter("cp_amount",Convert.ToDecimal(TextBox1.Text)));

اینم گفتم برای اطلاع دوستان،البته نمیدونم روش بهتری هم داره یا نه؟

بازم تشکر

M aJi D
یک شنبه 22 شهریور 1388, 20:50 عصر
سلام.
از استاد عزیز DelphiAssistant (http://barnamenevis.org/forum/member.php?u=1206) خیلی خیلی ممنونم مشکلم حل شد دقیقاً همون چیزایی که فرمودید بود .
شما و سایتی که با دوستانتون ایجاد کردید واقعاً فوق العادید.


ممنون

alirezas
پنج شنبه 29 دی 1390, 07:19 صبح
با سلام خدمت اساتيد

من مشكلي دارم، وقتي كدهاي زير را اجرا ميكنم پيغام

Must declare the variable '@Param2'.

داده ميشود

string cmdstr ="select @Param2 = sno from goodsserial where sno = @Param1";

OleDbCommand cmd = new OleDbCommand(cmdstr,DC.DBCon);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new OleDbParameter("Param1", "9010180014"));

OleDbParameter param2 = new OleDbParameter();
param2.ParameterName = "Param2";
param2.DbType = DbType.String;
param2.Direction = ParameterDirection.Output;
param2.Size = 50;

cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();
string x = (string)param2.Value;

MessageBox.Show(x);

vahid.ch013
پنج شنبه 29 دی 1390, 11:54 صبح
string cmdstr ="Declare @Param2 int; select @Param2 = sno from goodsserial where sno = @Param1";

arg.goodarzi
پنج شنبه 29 دی 1390, 16:18 عصر
سلام. من همین مشکل رو با استور پروسیجر دارم با این تفاوت که از linq استفاده می کنم.
استور پروسیجر رو با یک یا چندتا خروجی می نویسم اما زمان فراخوانی با linq نمی تونم خروجی هارو از استور پروسیجر بگیرم.
ممنون میشم راهنماییم کنید.