PDA

View Full Version : Data Binding



maedeh-t
یک شنبه 29 شهریور 1388, 11:41 صبح
سلام.
من چند تا سؤال فوری دارم.


توی یک فرم می خوام از داخل ComboBox وقتی کد مربوط به یک فیلد جدول دیتا بیس (Classes) انتخاب می شه بقیه فیلدها داخل TextBox های روی فرم bind بشه و فیلد تصویر هم داخل متغیر map قرار بگیره.
با داده های String مشکلی ندارم اما با بقیه داده ها یعنی int و dateTime و byte[] مشکل دارم. چون نمی تونه تایپ object رو مستقیماً به این تایپ ها تبدیل کنه. باید چی کار کنم؟


از طرفی من یک فیلد TeacherID توی این جدول دارم اما روی این فرم نام و نام خانوادگی مربی نمایش داده می شه که باید با توجه به کد مربی از جدول مربی (Teachers) استخراج بشه. این فیلد رو چه طور باید bind کنم؟


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


Name : نام مربی
TFamily : نام خانوادگی مربی
Start و End : از نوع dateTime
Cost و Salary : از نوع int



private void bindFields(int position)
{
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = new SqlCommand();
adp.SelectCommand.CommandText = "select Name,TeacherID,StartDate,EndDate,Place,StudentCost ,TeacherSalary,Picture from Classes";
adp.SelectCommand.Connection = MyConnection;

DataSet dts = new DataSet();
adp.Fill(dts, "Classes");

txtName.Text = (String)dts.Tables["Classes"].Rows[position]["Name"];
//txtTName.Text = (String)dts.Tables["Classes"].Rows[position]["?"];
//txtTFamily.Text = (String)dts.Tables["Classes"].Rows[position]["?"];
//txtStart.Text = (String)dts.Tables["parto"].Rows[position]["StartDate"];
//txtEnd.Text = (String)dts.Tables["parto"].Rows[position]["EndDate"];
txtPlace.Text = (String)dts.Tables["Classes"].Rows[position]["Place"];
//txtCost.Text = (String)dts.Tables["Classes"].Rows[position]["StudentCost"];
//txtSalary.Text = (String)dts.Tables["Classes"].Rows[position]["TeacherSalary"];
//map = Convert.ToByte(dts.Tables["Teachers"].Rows[position]["Picture"])[];

}

Vahid_moghaddam
یک شنبه 29 شهریور 1388, 12:29 عصر
داده هایی رو که لازم دارید با join کردن جدول ها بکشید بیرون. برای تایپ های غیر string از Convert استفاده کنید مثلا


Convert.ToInt32(your object)

maedeh-t
دوشنبه 30 شهریور 1388, 09:58 صبح
بله درسته من اصلاً حواسم به join نبود.
ولی الآن که کدشو نوشتم روی دستور SqlDataReader drN = cmdN.ExecuteReader();
exeption می ده می گه: Incorrect syntax near ','.


در صورتی که select مربوطه اش اصلاً ‘,’ نداره! اگه ممکنه کد منو نگاه کنید بببینید اشکالش کجاست.
ممنون


private void bindFields(int position)
{
MyConnection.Open();

SqlCommand cmdN = new SqlCommand();
cmdN.Connection = MyConnection;
cmdN.CommandType = CommandType.Text;
cmdN.CommandText = "select Teachers.Name from Teachers join Classes on Classes.TeacherID=Teachers.ID where Classes.ID=" + cmbCode;
SqlDataReader drN = cmdN.ExecuteReader();

txtTName.Text = Convert.ToString(drN);
drN.Close();

SqlCommand cmdF = new SqlCommand();
cmdF.Connection = MyConnection;
cmdF.CommandType = CommandType.Text;
cmdF.CommandText = "select Teachers.Family from Teachers join Classes on Classes.TeacherID=Teachers.ID where Classes.ID=" + cmbCode;
SqlDataReader drF = cmdF.ExecuteReader();

txtTFamily.Text = Convert.ToString(drF);
drF.Close();

SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = new SqlCommand();
adp.SelectCommand.CommandText = "select Name,StartDate,EndDate,Place,StudentCost,TeacherSa lary from Classes";
adp.SelectCommand.Connection = MyConnection;

DataSet dts = new DataSet();
adp.Fill(dts, "Classes");

txtName.Text = (String)dts.Tables["Classes"].Rows[position]["Name"];

DateTime ds = Convert.ToDateTime(dts.Tables["Classes"].Rows[position]["StartDate"]);
txtStart.Text = Convert.ToString(ds);

DateTime de = Convert.ToDateTime(dts.Tables["Classes"].Rows[position]["EndDate"]);
txtEnd.Text = Convert.ToString(de);

txtPlace.Text = (String)dts.Tables["Classes"].Rows[position]["Place"];

int c = Convert.ToInt32(dts.Tables["Classes"].Rows[position]["StudentCost"]);
txtCost.Text = Convert.ToString(c);

int s = Convert.ToInt32(dts.Tables["Classes"].Rows[position]["TeacherSalary"]);
txtSalary.Text = Convert.ToString(s);

MyConnection.Close();
}




یک سؤال دیگه هم دارم که در مورد ثبت تاریخ سیستم توی دیتا بیسه.
Insert داخل یک جدول که کلید خارجی نداره و هیچ ارتباطی با جدولهای دیگه نداره درست جواب می ده اما جدولهایی که ارتباط دارند وقتی می خوام تاریخ سیستم رو داخلشون درج کنم exception می ده :
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.

در مورد update هم همینطوره. کد درج رو می ذارم. اینم اگه می شه ببینید.



private void btnInsert_Click(object sender, EventArgs e)
{
MyConnection.Open();

SqlCommand cmdTeacher = new SqlCommand();
cmdTeacher.Connection = MyConnection;
cmdTeacher.CommandType = CommandType.Text;
cmdTeacher.CommandText = "select ID from Teachers where Name=N'" + txtTName.Text + "'and Family=N'" + txtTFamily.Text + "'";

SqlDataReader dr = cmdTeacher.ExecuteReader();

if (dr.Read())
{
dr.Close();
TeacherId = Convert.ToInt32(cmdTeacher.ExecuteScalar());

SqlCommand cmdInsert = new SqlCommand();
cmdInsert.Connection = MyConnection;
cmdInsert.CommandType = CommandType.Text;

timer.Enabled = true;

cmdInsert.CommandText = "insert into Classes(Name,TeacherID,StartDate,EndDate,StudentCo st,TeacherSalary,Place,RegisterDate) values(@name, @TeacherId, @start, @end, @cost, @salary, @place, @date)";
//cmdInsert.CommandText = "insert into Classes(Name,TeacherID,StartDate,EndDate,StudentCo st,TeacherSalary,Place) values(@name, @TeacherId, @start, @end, @cost, @salary, @place)";
cmdInsert.Parameters.AddWithValue("@name", txtName.Text);
cmdInsert.Parameters.AddWithValue("@TeacherId", TeacherId);
cmdInsert.Parameters.AddWithValue("@start", txtStart.Text);
cmdInsert.Parameters.AddWithValue("@end", txtEnd.Text);
cmdInsert.Parameters.AddWithValue("@cost", txtCost.Text);
cmdInsert.Parameters.AddWithValue("@salary", txtSalary.Text);
cmdInsert.Parameters.AddWithValue("@place", txtPlace.Text);
cmdInsert.Parameters.AddWithValue("@date", Rdate);

if (txtName.Text == "" || txtTName.Text == "" || txtTFamily.Text == "" || txtStart.Text == "" || txtEnd.Text == "" || txtCost.Text == "" || txtSalary.Text == "" || txtPlace.Text == "")
{
MessageBox.Show("لطفاً همه فیلدها را تکمیل نمائید");
MyConnection.Close();
}
else
{
cmdInsert.ExecuteNonQuery();
MyConnection.Close();

ClearFields();
MessageBox.Show("کلاس مورد نظر به لیست اضافه شد");

ClassEquipment_Load(null, null);
}
}
else
{
dr.Close();
MyConnection.Close();
MessageBox.Show("مربی با این نام پیدا نشد");
}
}



راستی در مورد بیرون کشیدن عکس از دیتا بیس Convert.ToByte که جواب نمی ده. باید چی کار کنم؟

با تشکر

Reza_Yarahmadi
دوشنبه 30 شهریور 1388, 17:10 عصر
برای مشکل اول ، شما آخر دستور Select فکر کنم فقط اسم کمبو باکس رو نوشتید و هیچ خاصیتی براش معلوم نکردید ، توی این حالت به جای اسم کمبو مقدار زیر قرار میگیره :

System.Windows.Forms.ComboBox, Items.Count: 3
همین باعث مشکل میشه!! واسه حلش هم باید معلوم کنید کدوم خاصیت مد نظرتون هست!!! (مثلا Text)

در مورد سؤال دوم هم این مشکل احتمالا به این خاطره که فیلد RegisterDate از نوع DataTime گرفتید و مقداری خلاف رنج معتبر بهش میدید. راحتترین کار اینه که نوع این فیلد رو از نوع nvarchar بگیرید و بصورت رشته ذخیره کنید.

Vahid_moghaddam
دوشنبه 30 شهریور 1388, 17:51 عصر
اگر هم قصد ندارید نوع فیلد رو از DateTime به nvarchar تغییر بدید، ابتدا مقداری رو که از TextBox می خونید تبدیل به DateTime کنید.

AliRezaPro
سه شنبه 31 شهریور 1388, 00:50 صبح
راستی در مورد بیرون کشیدن عکس از دیتا بیس Convert.ToByte که جواب نمی ده. باید چی کار کنم؟
این پروژه رو نگاه کنید