PDA

View Full Version : سوال: مشکل با SP؟



علیرضا حسن زاده
یک شنبه 02 خرداد 1389, 22:03 عصر
من یه sp به صورت زیر

ALTER PROCEDURE [dbo].[SelectAllData]
AS
SET NOCOUNT ON;
SELECT *
FROM B_Person
return @@rowcount
نوشتم و تو C#‎ هم کد زیر

var con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=E:\MyDB.MDF;Integrated Security=True");
con.Open();
var com = new SqlCommand("dbo.SelectAllData") { Connection = con, CommandType = CommandType.StoredProcedure };
var sqlParam = com.Parameters.Add("@ReturnValue", SqlDbType.Int);
sqlParam.Direction = ParameterDirection.ReturnValue;
var reader = com.ExecuteReader(CommandBehavior.CloseConnection) ;

if (reader == null) return;
MessageBox.Show(reader.RecordsAffected.ToString()) ;
MessageBox.Show(com.Parameters["@ReturnValue"].Value.ToString());
نوشتم می خوام قبل از شروع به دریافت اطلاعات (تعداد سطرهای دیتابیس زیاده) تعداد کل سطر های برگشتی رو داشته باشم تا بتونم روند اجرای عملیات رو به صورت درصد به کاربر نشون بدم (البته فعلا تو Messagebox نوشتم) ولی هر کاری می کنم Messagebox دوم خطا میده که Value مقدارش Null هست تو MessageBox اول هم مقدار -1 رو برمی گردونه
البته SP تو محیط SqlServer درست کار میکنه فکر کنم مشکل از کد C#‎ هست از DaraReader هم برای بالا بردن سرعت دریافت اطلاعات استفاده کردم
لطفا راهنمایی کنید؟:گیج:

M.YasPro
دوشنبه 03 خرداد 1389, 07:47 صبح
سلام


cmd.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

موفق باشید .

علیرضا حسن زاده
دوشنبه 03 خرداد 1389, 07:52 صبح
سلام


cmd.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
موفق باشید .

همین کد رو هم اگه توجه کنید تو سطر بعد از تعریف پارامتر نوشتم؟!:ناراحت:

M.YasPro
دوشنبه 03 خرداد 1389, 08:39 صبح
حواسم نبود ;
با executeNonQuey اجرا کردم . درست بود .

علیرضا حسن زاده
دوشنبه 03 خرداد 1389, 08:51 صبح
حواسم نبود ;
با executeNonQuey اجرا کردم . درست بود .
اگه با executeNonQuey اجرا کنم که دیگه نمی تونم از DataReader استفاده کنم؟ و اطلاعات رو بخونم

M.YasPro
دوشنبه 03 خرداد 1389, 09:19 صبح
نه.
خوب شما یه کاری کن :
دیتا سورست رو با reader پر کن بعد count ش رو message کن .

علیرضا حسن زاده
دوشنبه 03 خرداد 1389, 09:42 صبح
نه.
خوب شما یه کاری کن :
دیتا سورست رو با reader پر کن بعد count ش رو message کن .
دوست عزیز ممنون از راهنماییت ولی شما متن سوال من رو ممکنه درست متوجه نشدید
MessageBox رو من واسه این گذاشتم که عملکرد تابع رو فعلا چک کنم منظور من اینکه قبل از شروع به دریافت اطلاعات بتونم تعداد سطرهایی رو که باید بخونم رو بدست بیارم و از این طریق بتونم میزان پیشرفت کار رو به صورت درصد به کاربر نشون بدم مثلا اگه تعداد کل سطرها رو داشته باشم به صورت زیر می تونم این کار رو انجام بدم:

long count = 1000;//اینجا می خوام تو این متغییر تعداد سطرها رو که توسط مقدار برگشتی SP برمیگرده بگیرم
long cnt=0
while(reader.Read())
{
cnt++;
lbl_Message.Text = Convert.ToInt32(((double) cnt/count)*100).ToString();
}

M.YasPro
دوشنبه 03 خرداد 1389, 10:42 صبح
برای این کار از backgroundWorker (http://www.google.com/custom?hl=en&client=google-coop&cof=FORID:13;AH:left;CX:%25D8%25A8%25D8%25B1%25D9% 2586%25D8%25A7%25D9%2585%25D9%2587%2520%25D9%2586% 25D9%2588%25DB%258C%25D8%25B3;L:http://www.google.com/intl/en/images/logos/custom_search_logo_sm.gif;LH:30;LP:1;VLC:%23551a8b ;DIV:%23cccccc;&cx=010277259273172057471:gbud9yj2nhi&adkw=AELymgWfK1ZI3JP73-Z0zcKV8-366BXnp5DUzN-dNFWy19B4nVsgvygFpgYZftBmwdmfxeCYHfyZnLKdGahKEN8MK HQoUtHJXpCBdpPTU7PH1B_gez150ZPJQ43jYyuJbeoF0jD2wYQ F&boostcse=0&q=کار+background+worker&start=0&sa=N)
استفاده کنید .

علیرضا حسن زاده
دوشنبه 03 خرداد 1389, 12:03 عصر
من کار با backgroundWorker (http://www.google.com/custom?hl=en&client=google-coop&cof=FORID:13;AH:left;CX:%25D8%25A8%25D8%25B1%25D9% 2586%25D8%25A7%25D9%2585%25D9%2587%2520%25D9%2586% 25D9%2588%25DB%258C%25D8%25B3;L:http://www.google.com/intl/en/images/logos/custom_search_logo_sm.gif;LH:30;LP:1;VLC:%23551a8b ;DIV:%23cccccc;&cx=010277259273172057471:gbud9yj2nhi&adkw=AELymgWfK1ZI3JP73-Z0zcKV8-366BXnp5DUzN-dNFWy19B4nVsgvygFpgYZftBmwdmfxeCYHfyZnLKdGahKEN8MK HQoUtHJXpCBdpPTU7PH1B_gez150ZPJQ43jYyuJbeoF0jD2wYQ F&boostcse=0&q=%DA%A9%D8%A7%D8%B1+background+worker&start=0&sa=N) رو بلدم ولی چه جوری میشه این کار رو با backgroundWorker (http://www.google.com/custom?hl=en&client=google-coop&cof=FORID:13;AH:left;CX:%25D8%25A8%25D8%25B1%25D9% 2586%25D8%25A7%25D9%2585%25D9%2587%2520%25D9%2586% 25D9%2588%25DB%258C%25D8%25B3;L:http://www.google.com/intl/en/images/logos/custom_search_logo_sm.gif;LH:30;LP:1;VLC:%23551a8b ;DIV:%23cccccc;&cx=010277259273172057471:gbud9yj2nhi&adkw=AELymgWfK1ZI3JP73-Z0zcKV8-366BXnp5DUzN-dNFWy19B4nVsgvygFpgYZftBmwdmfxeCYHfyZnLKdGahKEN8MK HQoUtHJXpCBdpPTU7PH1B_gez150ZPJQ43jYyuJbeoF0jD2wYQ F&boostcse=0&q=%DA%A9%D8%A7%D8%B1+background+worker&start=0&sa=N) انجام داد؟