PDA

View Full Version : نمایش اطلاعات در datagrid



niloofar norouzi
شنبه 06 مهر 1387, 20:00 عصر
سلام
من می خوام اطلاعات یک proc را درdatagrid نمایش بدم
اما خطی که خط کشیده شده مشکل داره
می شه لطف کنید و بگید چی کار باید کنم؟


Vpost vpost=newVpost();
SqlConnection objConnection = newSqlConnection("server=niloofar\\i2;Initial Catalog=vezaratekar;Integrated Security=True");
objConnection.Open();
SqlCommand objCommand = newSqlCommand();
SqlDataAdapter objDataAdapter = newSqlDataAdapter();
objCommand.Connection = objConnection;
objCommand.CommandText = "Cpost";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int);
objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text);
DataSet objDataSet = newDataSet();
objDataAdapter.Fill(objDataSet, "personal");
objConnection.Close();
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objDataSet;
dataGridView1.DataMember = "personal";

// Clean up
objDataAdapter = null;
objConnection = null;

xxxxxxxxxx
شنبه 06 مهر 1387, 21:56 عصر
بهتر نيست خطا ايكه ميگيره رو هم بنويسي!؟

kh1387
یک شنبه 07 مهر 1387, 00:55 صبح
سلام
من می خوام اطلاعات یک proc را درdatagrid نمایش بدم
اما خطی که خط کشیده شده مشکل داره
می شه لطف کنید و بگید چی کار باید کنم؟


Vpost vpost=newVpost();
SqlConnection objConnection = newSqlConnection("server=niloofar\\i2;Initial Catalog=vezaratekar;Integrated Security=True");
objConnection.Open();
SqlCommand objCommand = newSqlCommand();
SqlDataAdapter objDataAdapter = newSqlDataAdapter();
objCommand.Connection = objConnection;
objCommand.CommandText = "Cpost";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int);
objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text);
DataSet objDataSet = newDataSet();
objDataAdapter.Fill(objDataSet, "personal");
objConnection.Close();
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objDataSet;
dataGridView1.DataMember = "personal";

// Clean up
objDataAdapter = null;
objConnection = null;

چه پیام خطایی می ده؟

majid325
یک شنبه 07 مهر 1387, 02:53 صبح
اولا نيازي به open و close كردن cnn نيست، چون متد fill خودش اين كار رو ميكنه.
دوما كانكشن استيرينگت صحيح نيست ، يعني فقط روي pc خودت جواب ميد زمان توضيع مشكل دار ميشي
بعدش هم فكر ميكنم sp رو بايد بزاري اينجا ، 99% مشكل همونه يا پارامتر هاش.
دوستان هم راست ميگن متن erorr هم بزار اينجا.

mehrnoosh_al62
یک شنبه 07 مهر 1387, 08:47 صبح
اون Personal که تو خط مورد نظرگذاشتی چیه؟
مگه قرار نیست اطلاعات sp رودرون دیتاست قرار بدی؟ به جای sp , personal رو قرار بده

niloofar norouzi
یک شنبه 07 مهر 1387, 11:13 صبح
من کد را بشکل زیر تغییر دادم


Vpost vpost=new Vpost();
SqlConnection objConnection = new SqlConnection("server=niloofar\\i2;Initial Catalog=vezaratekar;Integrated Security=True");

SqlCommand objCommand = new SqlCommand();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objCommand.Connection = objConnection;
objCommand.CommandText = "Cpost";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int);
objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text);
DataSet objDataSet = new DataSet();
objDataAdapter.Fill(objDataSet, "Cpost");
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objDataSet;
dataGridView1.DataMember = "Cpost";
// Clean up
objDataAdapter = null;
objConnection = null;

اما هنوز در خط مورد نظر error می ده

:error
The SelectCommand property has not been initialized before calling 'Fill'.

niloofar norouzi
یک شنبه 07 مهر 1387, 11:20 صبح
دوما كانكشن استيرينگت صحيح نيست ، يعني فقط روي pc خودت جواب ميد زمان توضيع مشكل دار ميشي
.
باید چه تغییری بدم؟
چون مشکل بزرگی برام شده
با تشکر

kh1387
یک شنبه 07 مهر 1387, 11:29 صبح
من کد را بشکل زیر تغییر دادم


Vpost vpost=new Vpost();
SqlConnection objConnection = new SqlConnection("server=niloofar\\i2;Initial Catalog=vezaratekar;Integrated Security=True");

SqlCommand objCommand = new SqlCommand();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objCommand.Connection = objConnection;
objCommand.CommandText = "Cpost";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int);
objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text);
DataSet objDataSet = new DataSet();
objDataAdapter.Fill(objDataSet, "Cpost");
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objDataSet;
dataGridView1.DataMember = "Cpost";
// Clean up
objDataAdapter = null;
objConnection = null;

اما هنوز در خط مورد نظر error می ده

:error
The SelectCommand property has not been initialized before calling 'Fill'.

من نمی دونم کد شما چکار می کنه فقط می دونم این پیغام مربوط به اینه که در جایی که بانکتون رو صدا زدید ، قبل از صدا زدن اونرو اتصال ندادید.موفق باشد

mehrnoosh_al62
یک شنبه 07 مهر 1387, 11:35 صبح
اینو فراموش کردی :


objConnection.Connection.Open()

mehrnoosh_al62
یک شنبه 07 مهر 1387, 11:38 صبح
باید چه تغییری بدم؟
چون مشکل بزرگی برام شده
با تشکر

ConnectionString رو برای اینکه فقط مختص کامپیوتر خودت نباشه به صورت زیر تغییر بده:



"server=(local);Initial Catalog=vezaratekar;Integrated Security=True"

kh1387
یک شنبه 07 مهر 1387, 11:43 صبح
شما باید احتمالا دیتا آدابپر خود را اینگونه تعریف کنی: objDataAdapter.SelectCommand = new SqlCommand("Select * From student",objConnection);

kh1387
یک شنبه 07 مهر 1387, 11:45 صبح
اینو فراموش کردی :


objConnection.Connection.Open()

دوست نازنین نیازی به باز و بستن اتصال نیست.

majid325
یک شنبه 07 مهر 1387, 11:47 صبح
ببخشيد با اين كه چند با كد رو خوندم ولي متوجه نشدم كه objCommand ساختيد رو به آبجكت Command ديتا آداپتورتون نصبت نداديد، خوب حالا اين كار رو بكنيد

objDataAdapter.SelectCommand=objCommand
ولي ميتونيد باز به جاي set كردن objCommand همون SelectCommand رو تنظيم كنيد.
اگه مشكلتون برطرف نشد دو بار متن erorr رو بزاريد.
در رابطه با connectionstrings هم ميتونيد لينك زير رو نگاه كنيد:
http://www.connectionstrings.com

niloofar norouzi
یک شنبه 07 مهر 1387, 11:51 صبح
ConnectionString رو برای اینکه فقط مختص کامپیوتر خودت نباشه به صورت زیر تغییر بده:



"server=(local);Initial Catalog=vezaratekar;Integrated Security=True"
اخه اگه local بزارم تو سیستم خودم کار نمی کنه

mehrnoosh_al62
یک شنبه 07 مهر 1387, 12:00 عصر
اخه اگه local بزارم تو سیستم خودم کار نمی کنه

ببخشید... باید به جای Server از Data Source استفاده کنی



Data Source=(local);Initial Catalog=vezaratekar;Integrated Security=True

kh1387
یک شنبه 07 مهر 1387, 12:04 عصر
من این کد رو اجرا کردم درست شد منتها اون قسمتهایی رو که comment کردم نمی دونم واسه چیه اگه ممکنه به ما هم بگید تا ما هم یاد بگیریم.مرسی
SqlConnection objConnection = new SqlConnection(@"server=(local)\SQLEXPRESS;"+ "Integrated Security=SSPI; DataBase = university"); SqlCommand objCommand = new SqlCommand(); SqlDataAdapter objDataAdapter = new SqlDataAdapter(); objCommand.Connection = objConnection; objCommand.CommandText = "Select * From student"; //objCommand.CommandType = CommandType.StoredProcedure; //objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int); //objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text); DataSet objDataSet = new DataSet(); objDataAdapter.SelectCommand = objCommand; objDataAdapter.Fill(objDataSet, "student"); dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = objDataSet; dataGridView1.DataMember = "student"; // Clean up objDataAdapter = null; objConnection = null;

niloofar norouzi
یک شنبه 07 مهر 1387, 12:18 عصر
کد به این صورت تغییر کرد


Vpost vpost=new Vpost();
SqlConnection objConnection = new SqlConnection("server=niloofar\\i2;Initial Catalog=vezaratekar;Integrated Security=True");

SqlCommand objCommand = new SqlCommand();
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objCommand.Connection = objConnection;
objCommand.CommandText = "Cpost";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int);
objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text);
objDataAdapter.SelectCommand = objCommand;
DataSet objDataSet = new DataSet();
objDataAdapter.Fill(objDataSet, "Cpost");
dataGridView1.AutoGenerateColumns = true;
dataGridView1.DataSource = objDataSet;
dataGridView1.DataMember = "Cpost";
// Clean up
objDataAdapter = null;
objConnection = null;


error:
Failed to convert parameter value from a String to a Int32.

proc استفاده شده:

create proc Cpost
@nopersoneli int
as
select p.Fname as [نام],p.lname as [نام خانوادگی],p.NoPersoneli as [شماره پرسنلی],po.[name] as [پست]from personal p
join postPersonal pp
on p.NoPersoneli=pp.CPersonal
join post po
on po.code=pp.CPost
where p.NoPersoneli=@nopersoneli

niloofar norouzi
یک شنبه 07 مهر 1387, 12:19 عصر
من این کد رو اجرا کردم درست شد منتها اون قسمتهایی رو که comment کردم نمی دونم واسه چیه اگه ممکنه به ما هم بگید تا ما هم یاد بگیریم.مرسی
SqlConnection objConnection = new SqlConnection(@"server=(local)\SQLEXPRESS;"+ "Integrated Security=SSPI; DataBase = university"); SqlCommand objCommand = new SqlCommand(); SqlDataAdapter objDataAdapter = new SqlDataAdapter(); objCommand.Connection = objConnection; objCommand.CommandText = "Select * From student"; //objCommand.CommandType = CommandType.StoredProcedure; //objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int); //objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text); DataSet objDataSet = new DataSet(); objDataAdapter.SelectCommand = objCommand; objDataAdapter.Fill(objDataSet, "student"); dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = objDataSet; dataGridView1.DataMember = "student"; // Clean up objDataAdapter = null; objConnection = null;

من می خوام اطلاعات یک proc را در دیتا گرید نما یش بدم
با این کاری که شما کردی فقط اطلاعات یک جدول دیده می شه

niloofar norouzi
یک شنبه 07 مهر 1387, 12:23 عصر
ببخشید... باید به جای Server از Data Source استفاده کنی



Data Source=(local);Initial Catalog=vezaratekar;Integrated Security=True

فرقی نداره datasource یا server
چون من 2 تا instance دارم باید از این connection string استفاده کنم

mehrnoosh_al62
یک شنبه 07 مهر 1387, 12:25 عصر
خط فوق رو به صورت زیر تغییر بده ...

objCommand.Parameters["@nopersoneli"].Value = Convert.ToInt32((vpost.txtNoPersoneli.Text));

niloofar norouzi
یک شنبه 07 مهر 1387, 12:32 عصر
خط فوق رو به صورت زیر تغییر بده ...

objCommand.Parameters["@nopersoneli"].Value = Convert.ToInt32((vpost.txtNoPersoneli.Text));

این کار لازم نیست

mehrnoosh_al62
یک شنبه 07 مهر 1387, 12:34 عصر
فرقی نداره datasource یا server
چون من 2 تا instance دارم باید از این connection string استفاده کنم

خوب برای این حالت شما میتونی تو برنامت یه ComboBox قرار بدی که نام کلیه Serverهای یه سیتم توش لیست شه و خود کاربر Server مورد نظرشو انتخاب کنه و با توجه به اون Server کانکشن رو برقرار کنید تا برای سیستم هایی که بیش از یک Instance دارند مشکلی پیش نیاد...

کد زیر نام کلیه سرور ها رو ComboBox لیست میکنه :

DataTable list1 = System.Data.Sql.SqlDataSourceEnumerator.Instance.G etDataSources();
foreach (DataRow row in list1.Rows)
{
foreach (DataColumn column in list1.Columns)
{
cboServer.Items.Add(row[column].ToString());
}
}

و بعد ConnectionString رو به صورت زیر مقدار بده...

"Data Source=" + cboServer.SelectedItem.ToString() + ";Initial Catalog=vezaratekar;Integrated Security=True"

mehrnoosh_al62
یک شنبه 07 مهر 1387, 12:40 عصر
error:
Failed to convert parameter value from a String to a Int32


این کار لازم نیست

عزیزم شما دارید یک DataType از نوع Int رو با یک مقدار String مقدار دهی میکنید...

niloofar norouzi
یک شنبه 07 مهر 1387, 15:46 عصر
کسی کمکم نمی کنه
خواهش می کنم
باید زود تحویل بدم

sarkhosh
یک شنبه 07 مهر 1387, 23:34 عصر
چرا از dataset استفاده کردی ؟چرا از sqldatareader استفاده نمی کنی؟

majid325
یک شنبه 07 مهر 1387, 23:50 عصر
ببينيد objCommand تون رو حذف كنيد و از command خود da استفاده كنيد:

SqlDataAdapter objDataAdapter = new SqlDataAdapter("Cpost", cnn);
objDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
int nopersoneli;
int.TryParse(vpost.txtNoPersoneli.Text.Tostring(), out nopersoneli);
objDataAdapter.SelectCommand.Parameters.AddWithVal ue("@nopersoneli", nopersoneli);
البته مشكل شما(اون error كه ميداد) با خط 3 و 4 حل ميشه.

niloofar norouzi
دوشنبه 08 مهر 1387, 12:38 عصر
ممنون از کمکتون
همه ی error ها رفع شد
اما datagride خالیه
در حالی که این proc در sql جواب داد

jaza_sa
سه شنبه 09 مهر 1387, 00:42 صبح
سلام
بهتره یکم تمیزتر کد بنویسیم
اول از همه ، یک کلاس تعریف میکنم و توابعی مثل Select ، SelectById ، Insert ، ... رو داخل اون تعریف میکنم
و در سطح Interfase فقط اون متد ها رو صدا میزنم ، مثل :

dgv.DataSource = db.SelectById(id);که db یک نمونه از کلاس مورد نظره و SelectById یک متد از اون کلاس
و اما خود متد :

public DataTable SelectById(int id)
{
using (SqlConnection con = new SqlConnection(this.CS))
{
SqlCommand cmd = new SqlCommand("sp_T1_SelectRow", con);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@Id", SqlDbType.Int).Value = id;

SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
}فایل برنامه رو ضمیمه میکنم
اگر بدردتون خورد و سوالی داشتید مطرح کنید تا دوستان کمکتون کنند.

majid325
سه شنبه 09 مهر 1387, 07:24 صبح
من این کد رو اجرا کردم درست شد منتها اون قسمتهایی رو که comment کردم نمی دونم واسه چیه اگه ممکنه به ما هم بگید تا ما هم یاد بگیریم.مرسی
SqlConnection objConnection = new SqlConnection(@"server=(local)\SQLEXPRESS;"+ "Integrated Security=SSPI; DataBase = university"); SqlCommand objCommand = new SqlCommand(); SqlDataAdapter objDataAdapter = new SqlDataAdapter(); objCommand.Connection = objConnection; objCommand.CommandText = "Select * From student"; //objCommand.CommandType = CommandType.StoredProcedure; //objCommand.Parameters.Add("@nopersoneli", SqlDbType.Int); //objCommand.Parameters["@nopersoneli"].Value = (vpost.txtNoPersoneli.Text); DataSet objDataSet = new DataSet(); objDataAdapter.SelectCommand = objCommand; objDataAdapter.Fill(objDataSet, "student"); dataGridView1.AutoGenerateColumns = true; dataGridView1.DataSource = objDataSet; dataGridView1.DataMember = "student"; // Clean up objDataAdapter = null; objConnection = null;

StoredProcedure ها در واقع دستورات sql ي هستند كه در داخل بانك ذخيره شده اند و راجع به اين موضوع ميتوني در قسمت sql جستجو كني.

Parametr هم كه parametr هايي است كه در StoredProcedure تعريف كردي