PDA

View Full Version : StackOverflow



mina1363
پنج شنبه 25 مرداد 1386, 16:12 عصر
سلام من یه برنامه نوشتم که error زیر را میدهد یک کلاس connection دارم میخواهم وقتی ازش instance میسازم بتونم نام storedproceduram را بهش پاس بدم باید چه کار کنم ؟

An unhandled exception of type 'System.StackOverflowException' occurred in TestDatagridView.exe

PC2st
پنج شنبه 25 مرداد 1386, 16:51 عصر
خطای StackOverflow زمانی رخ میده که شما بخوهید یک متد رو به مدت زمان زیادی، پشت سر هم صدا بزنید و حافظه stack سرریز میشه. ببینید در کجای کدتون همچنین کاری رو انجام دادید.

mina1363
پنج شنبه 25 مرداد 1386, 21:13 عصر
چون نمیدونم اشکال کارم کجاست کدم رو براتون می فرستم

classConnection
{
publicstring StoredPName;
public Connection(string StoredPName) {
SqlConnection cn = newSqlConnection();
cn.ConnectionString = "Data Source=.;Initial Catalog=Ghazalnama;Integrated Security=True";
SqlCommand cmd = newSqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = newSqlDataAdapter(cmd);
DataSet ds = newDataSet();

cn.Open();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = StoredPName1;
cmd.ExecuteNonQuery();
da.Fill(ds, StoredPName1);
System.Windows.Forms.DataGrid dataGridView1 = newDataGrid();
dataGridView1.DataSource = ds;
dataGridView1.DataMember = StoredPName1;
dataGridView1.Height = 212;
dataGridView1.Width = 536;
dataGridView1.Top = 12;
dataGridView1.Left = 42;
cn.Close();

this.StoredPName = StoredPName;
}
publicstring StoredPName1
{

get{
return StoredPName1;

}
set {
StoredPName1 = value;

}

}

}


و در برنامه اصلی که ازش instance
ساختم اینو نوشتم:

Connection connection = newConnection("sp_select");

connection.StoredPName1 = "sp_select";

باز هم ممنون میشم اگر بگید اشکالم کجاست.

MH2538
پنج شنبه 25 مرداد 1386, 21:33 عصر
سلام
اگر StoredPName خودش یک Property توی کلاست باشه StackOverFlow مال اون می تونه باشه. یعنی این کد this.StoredPName = StoredPName; چون شما یک پراپرتی رو با خودش ست می کنی و در نتیجه همواره خودش رو صدا می زنه

PC2st
پنج شنبه 25 مرداد 1386, 21:38 عصر
بله، همانطور که MH2538 اشاره کردند، شما در خاصیت StoredPName1 در بلاک get، خود خاصیت را صدا میزنید! یعنی میخواهید مقدار خاصیت را از خاصیت بگیرید که این حرکت بی نهایت به پیش میرود!

به شکل زیر خاصیت رو پیاده سازی کنید:


public string StoredPName1
{
get
{
return StoredPName;
}
set
{
StoredPName = value;
}
}

یعنی عدد 1 رو از جلوی کدهای داخلش بردارید تا مقدار رو از متغیر بگیره نه از خودش.

mina1363
جمعه 26 مرداد 1386, 08:19 صبح
خب حالا میخوام اسم StoredProceduram
پاس داده بشه به commandtext اگه کدم درست باشه ولی میگی که :

ExecuteNonQuery: CommandText property has not been initialized

یعنی پس نام SP رو بهش پاس نداده حالا چیکار کنم؟

PC2st
جمعه 26 مرداد 1386, 10:19 صبح
خب، شما از دستور زیر استفاده کردید:


cmd.CommandText = StoredPName1;

اما هنوز خاصیت StoredPName1 را مقدار دهی نکردید، پس قبل از دستور بالا، دستور زیر را اضافه کنید:


StoredPName1 = "Your SQL Command Here...";

mina1363
جمعه 26 مرداد 1386, 10:53 صبح
خب، شما از دستور زیر استفاده کردید:


cmd.CommandText = StoredPName1;

اما هنوز خاصیت StoredPName1 را مقدار دهی نکردید، پس قبل از دستور بالا، دستور زیر را اضافه کنید:


StoredPName1 = "Your SQL Command Here...";


آخه میدونید این یک کلاس ثابت است که میخوام 100 تا hnstance ازش بسازم و هر بار که خواستم instance بسازم داخل)( اسم storedProceduram را بنویسم که اونو اجرا کنه شاید اصلا کلا کدم برای این کار اشتباه باشه حالا باید چیکار کنم ؟ ممنونم از راهنمایی های شما
باز هم کمکم کنید لطفا
مرسی

PC2st
جمعه 26 مرداد 1386, 12:06 عصر
شاید اصلا کلا کدم برای این کار اشتباه باشه حالا باید چیکار کنم ؟
اینکار که نام storedProcedure را از طریق سازنده (متد Connection) برای کلاس Connection معرفی کنید، کار صحیح است و کدهای شما درست است (تاجائی که نگاه کردم)، متد سازنده را به شکل زیر تغییر دادم:


public Connection(string StoredPName) {
SqlConnection cn = new SqlConnection();
cn.ConnectionString = "Data Source=.;Initial Catalog=Ghazalnama;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
cmd.CommandType = CommandType.StoredProcedure;
StoredPName1 = StoredPName;
cmd.CommandText = StoredPName1;
da.Fill(ds, StoredPName1);
System.Windows.Forms.DataGridView dataGridView1 = new DataGridView();
dataGridView1.DataSource = ds;
dataGridView1.DataMember = StoredPName1;
dataGridView1.Height = 212;
dataGridView1.Width = 536;
dataGridView1.Top = 12;
dataGridView1.Left = 42;
}

mina1363
جمعه 26 مرداد 1386, 12:38 عصر
استاد من از شما واقعا ممنونم ولی الان دیگه هیچ error نداره اجرا میشه ولی در خروجی
datagrid هیچی نمایش نمیده و خالی است ببخشید
شاید بهتر باشه کل فایل رو براتون ضمیمه کنم؟

hdv212
جمعه 26 مرداد 1386, 12:46 عصر
da.Fill(ds, StoredPName1);
در این دستور، در پارامتر دوم شما باید نام جدول رو بهش بدی، مطمئنی نام جدولت StoredPName1 هست ؟

dataGridView1.DataSource = ds;
این خط رو هم باید به صورت زیر اصلاح کنی :

dataGridView1.DataSource = ds.Tables["tableName"]
موفق باشید.

mina1363
جمعه 26 مرداد 1386, 12:52 عصر
منتها چون همین الآن یه database دیگه درست کردم که بتونم براتون بفرستمش table ها خالی اند و فکر کنم اسمش هم فرق داره

PC2st
جمعه 26 مرداد 1386, 15:00 عصر
متاسفانه نتونستم به بانک اطلاعاتی دسترسی داشته باشم و برنامتون رو اجرا کنم!
چون تا حالا با بانک SQL Server کاری نداشتم، پس اون رو روی سیستمم نصب ندارم.

فقط اگر امکانش هست بهم بگید که در پروسیجر ذخیره شده به نام sp_selectGhazal1Hafez چه کدهائی است؟ از دستور SELECT در این پروسیجر استفاده کردید؟ اگر میشه کدهاش رو بگذارید.

در ضمن لازم نیست وقتی از متد Fill استفاده میکنید، کانکشن cn رو هم باز کنید.
و لازم نیست که ExecuteNonQuery رو صدا بزنید مگر اینکه در پروسیجرتون چیز بخصوصی باشه!

اون Connection String ائی که در پروژه تون ازش استفاده کردید، نمیدونم جواب میده یا خیر... بهرحال اگر دیتابیس روی همون کامپیوتر است، Connection String باید چیزی شبیه به زیر باشه (Data Source = localhost).


Data Source=localhost;Initial Catalog=Ghazalnama;Integrated Security=True


بر اساس این مبحث، مبحث دیگری در بخش VB.NET هست که با این مبحث میتونه ارتباط داشته باشه، اگر لازم دونستید، یک سری به تاپیک زیر هم بزنید:
http://barnamenevis.org/forum/showthread.php?t=53655

mina1363
جمعه 26 مرداد 1386, 15:08 عصر
بله از دستور select استفاده کردم این هم دستور select میباشد :


setANSI_NULLSON
setQUOTED_IDENTIFIERON

go



ALTERPROCEDURE [dbo].[sp_selectGhazal1Hafez]

AS
' غزل 1 حافظ'SELECT Mesrae1+' '+Mesrae2 AS

FROM Ghazal1Hafez

خیلی ممنون
این اشکال و اجرا نشدنش کسلم کرده از طرفی نمیشه رهاش کنم چون کارم لنگشه و اگه این درست نشه نمیتونم ادامش بدم:لبخند::چشمک:

mina1363
جمعه 26 مرداد 1386, 15:10 عصر
شما جواب سوالهای track bar و آژانس هواپیمایی رو نمیدونید؟

PC2st
جمعه 26 مرداد 1386, 19:25 عصر
چونکه میگید برنامه هیچ خطائی نداره ولی رکوردی هم به نمایش نمیآد، پس به احتمال زیاد اشکال از نبودن خروجی از پروسیجر ذخیره شده است...
متاسفانه نتونستم از کدها تون زیاد سر در بیارم (از اون Set های اول و اینکه ALTER PROCEDURE...) بهرحال در بخش SQL Server این پروسیجر ذخیره شده رو به بحث بگذارید که آیا خروجی داره یا خیر؟

mina1363
جمعه 26 مرداد 1386, 19:55 عصر
,وقتی من از storedProceduram زمانی که از این کلاس استفاده نمیکنم جواب میده ولی با کلاس نه
به هر حال مرسی و یک دنیا تشکر
َAlter.... هم کدی است که برای CREATE STOREDPROCEDURAm نوشتم و کپیش کردم برای شما

mina1363
شنبه 27 مرداد 1386, 08:21 صبح
دستورselect این بوده :

SELECT Mesrae1+' '+ Mesrae2 FROM Ghazal1Hafez
بقیه چیزهای اضافی بوده که خود SQL ایجاد کرده منم نمیدونم چی هستن

mina1363
شنبه 27 مرداد 1386, 13:25 عصر
چرا دیگه جوابم را نمی دهید؟:متفکر:

MH2538
شنبه 27 مرداد 1386, 13:33 عصر
سلام
شما مطئن هستید که دیتاست رو درست بایند کردید
مثلاً یک استباه رایج برای کنترل ها (غیر از دیتاگریدویو) مشخص نکردن Table در دیتاست برای کنترلی که که می خواهید به اون بایند کنید است.
مثلاً‌ باید به شکل زیر بنوسید:


myControl.DataSource=DS.Tables[0];
یا
TextBox1.DataBindings.Add(new Binding("Text",DS.Tables[0],"Your Desired Field"));

DS یک دیتاست فرضی است.
اما من احساس می کنم مشکل شما در دادن نام صحیح Table به دیتاست است.
بنابراین بجای


dataGridView1.DataSource = ds.Tables["tableName"];

بنویس


dataGridView1.DataSource = ds.Tables[0];

ضمناً‌ از طریق همین کد می تونی اسم Table رو هم بدست بیاری.


DS.Tables[0].TableName

mina1363
شنبه 27 مرداد 1386, 13:39 عصر
فکر میکنم درسته

MH2538
شنبه 27 مرداد 1386, 13:43 عصر
پست قبلی من ناقص ارسال شده بود.
من لاون رو مجدداً ویرایش کردم .
دوباره یک نگاهی بنداز

mina1363
شنبه 27 مرداد 1386, 14:06 عصر
آخه من اصلا از binding استفاده نکردم
کد من مال یک کلاس است که میخوام 100 تا instance ازش بسازم و اسم storedProcedurhamo بهش برگردانم تا اجراش کنه و بر اساس اون رکود را در datagrid نشان بده

خب حالا بگید برای این منظور باید چیکار کنم که هی تکرار کد نکنم و اصولی باشه کد بگید لطفا

MH2538
شنبه 27 مرداد 1386, 19:44 عصر
100 تا کلاس؟چه خبره ؟‌مطمئنی روشت درسته ؟
اگر از Binding استفاده نمی کنی پس دیتا رو چطور می خوای برگردونی؟ منظورم اینه که این کلاست چی بر می گردونه؟

mina1363
یک شنبه 28 مرداد 1386, 09:01 صبح
بله 100 تا چون ماله یه db بزرگ است و قرار محتویات table ها رو با کمک storedprocedureها نشان بده و چون این کار از طریق کد نویسی انجام شده اگه برای هر 100 تا بخوام هی کد بنویسم کار جالبی نیست و تصمیم گرفتم یک کلاسی بنویسم که 100 بار فراخوانی اش کنم و کارم را راه بیندازد ولی اجرا نمیشه error هم نمیده