PDA

View Full Version : سوال: رفع اشکالات پروژه من



nefrat
جمعه 08 اردیبهشت 1391, 16:46 عصر
سلام
میشه در رفع اشکالات برنامه ام من رو کمک کنید؟

یه برنامه دارم میخوام اطلاعات دانشجو ها رو ثبت کنم :

این کد رو داخل دکمه ثبت گذاشتم :



private void button1_Click(object sender, EventArgs e)
{
SqlDataAdapter sda = new SqlDataAdapter();
sda.InsertCommand = new SqlCommand();
SqlConnection sc = new SqlConnection(@"Data Source=NEGAR-PC;;Initial Catalog=Uni;Integrated Security=True");
if (sc.State != ConnectionState.Closed) { sc.Close(); }
sc.Open();
sda.InsertCommand.Connection = sc;
sda.InsertCommand.CommandType = CommandType.StoredProcedure;
sda.InsertCommand.CommandText = "SP_INSERT";
sda.InsertCommand.Parameters.AddWithValue("@NAME", txtname.Text);
sda.InsertCommand.Parameters.AddWithValue("@FAMILY", txtfamily.Text);
sda.InsertCommand.Parameters.AddWithValue("@SHSH", txtshsh.Text);
sda.InsertCommand.Parameters.AddWithValue("@SODUR", txtsodur.Text );
sda.InsertCommand.Parameters.AddWithValue("@MCODE", txtmcode.Text);
sda.InsertCommand.Parameters.AddWithValue("@BDAY", txtbday.Text);
sda.InsertCommand.Parameters.AddWithValue("@BMOUNTH", txtbmounth.Text);
sda.InsertCommand.Parameters.AddWithValue("@BYEAR", txtyear.Text );
sda.InsertCommand.Parameters.AddWithValue("@BCITY", txtbcity.Text );
sda.InsertCommand.Parameters.AddWithValue("@FANAME", txtfaname.Text);
sda.InsertCommand.Parameters.AddWithValue("@PHONE", txtphone.Text);
sda.InsertCommand.Parameters.AddWithValue("@MOBILE", txtmobile.Text);
sda.InsertCommand.Parameters.AddWithValue("@RESHTE", txtreshteh.Text);
sda.InsertCommand.Parameters.AddWithValue("@MAGHTA", txtmaghta.Text);

sda.InsertCommand.ExecuteNonQuery();

sda.SelectCommand = new SqlCommand();
sda.SelectCommand.CommandType = CommandType.Text;
sda.SelectCommand.CommandText = "SELECT * FROM [STUDENT]";
sda.SelectCommand.Connection = sc;
DataSet DS = new DataSet();
sda.Fill(DS);
GRID.DataSource = DS.Tables[0];
DataTableReader DR = new DataTableReader(DS.Tables[0]);
while (DR.Read())
{
//treeView1.Nodes.Add(DR["NAME"].ToString());
//comboBox1.Items.Add(DR["ID"].ToString());
}
sc.Close();
}



و داخل sql این کد رو گذاشتم »




USE [Uni]
GO
CREATE PROCEDURE SP_INSERT
@NAME AS NVARCHAR(50)
,@FAMILY AS NVARCHAR(80)
,@SHSH AS INT
,@SODUR AS NVARCHAR(50)
,@MCODE AS INT
,@BDAY AS NVARCHAR(2)
,@BMOUNTH AS NVARCHAR(2)
,@BYEAR AS NVARCHAR (4)
,@BCITY AS NVARCHAR (50)
,@FANAME AS NVARCHAR (50)
,@PHONE AS NVARCHAR(11)
,@MOBILE AS NVARCHAR (11)
,@RESHTE AS NVARCHAR (50)
,@MAGHTA AS NVARCHAR (50)
AS
BEGIN
INSERT INTO [STUDENT]
([NAME],[FAMILY],[SHSH],[SODUR],[MCODE],[BDAY] ,[BYEAR] ,[BCITY] ,[FANAME] ,[PHONE] ,[MOBILE] ,[RESHTE] ,[MAGHTA],[BMOUNTH] )
VALUES
(@NAME,@FAMILY,@SHSH,@SODUR,@MCODE,@BDAY,@BMOUNTH, @BYEAR,@BCITY,@FANAME,@PHONE,@MOBILE,@RESHTE,@MAGH TA)

END
GO





اما موقعی که اطلاعات رو میریزم و ثبت و میزنم ... خطا میده

http://img4up.com/up2/10881821281730226660.jpg

Mahmoud.Afrad
جمعه 08 اردیبهشت 1391, 17:45 عصر
در استورپروسیجر ترتیب پارامترها درست نیست. @BMOUNTH آخرین پارامتر باید باشه.

omid_csh
جمعه 08 اردیبهشت 1391, 17:45 عصر
سلام
پارامترهای رشته ای رو که مقدار دادید بیش از اندازه ای هست که توی دیتابیس تعریف کردید
یه راه حل افزایش طول فیلد مورد نظر در دیتابیس است.
یه راه دیگه حذف قسمت آخر رشته هستش:
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 30).Value = "name";
اندازه ای که اینجا دادم (30) باعث میشه فقط به اندازه 30 کاراکتر به دیتابیس ارسال شود.
موفق باشی.

nefrat
جمعه 08 اردیبهشت 1391, 18:35 عصر
سلام
پارامترهای رشته ای رو که مقدار دادید بیش از اندازه ای هست که توی دیتابیس تعریف کردید
یه راه حل افزایش طول فیلد مورد نظر در دیتابیس است.
یه راه دیگه حذف قسمت آخر رشته هستش:
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 30).Value = "name";
اندازه ای که اینجا دادم (30) باعث میشه فقط به اندازه 30 کاراکتر به دیتابیس ارسال شود.
موفق باشی.

نفهمیدم..من دقیقا همونی رو دادم که توی دیتا بیس دادم !!! هر کدوم 50 بود 50 هرکدوم هرچندتا بود منم همونو دادم!!!
یعنی توی اجرا وقتی نام رو دادم و توی دیتا بیس 50 طولش رو تعریف کردم 51 کاراکتر وارد شده که این خطا رو داده؟

omid_csh
جمعه 08 اردیبهشت 1391, 18:41 عصر
نفهمیدم..من دقیقا همونی رو دادم که توی دیتا بیس دادم !!! هر کدوم 50 بود 50 هرکدوم هرچندتا بود منم همونو دادم!!!
یعنی توی اجرا وقتی نام رو دادم و توی دیتا بیس 50 طولش رو تعریف کردم 51 کاراکتر وارد شده که این خطا رو داده؟
سلام
آره، در زمان اجرا تعداد کاراکتر وارد شده بیشتر از تعداد کاراکتر تعریف شده در دیتابیس هستش!

nefrat
جمعه 08 اردیبهشت 1391, 18:49 عصر
خب من اومدم چی کار کردم یه سری فیلد رو کپی کردم که احتمال میدادم خطا اونجا باشه مثل کد ملی و شماره تلفن ها !!!
اما باز!!! توی اجرا همین خطا رو میده و من به این ترتیب توی SQL تصحیح کردم!!!



USE [Uni]
GO
CREATE PROCEDURE SP_INSERT
@NAME AS NVARCHAR(50)
,@FAMILY AS NVARCHAR(80)
,@SHSH AS INT
,@SODUR AS NVARCHAR(50)
,@MCODE AS INT
,@BDAY AS NVARCHAR(2)
,@BMOUNTH AS NVARCHAR(2)
,@BYEAR AS NVARCHAR (4)
,@BCITY AS NVARCHAR (50)
,@FANAME AS NVARCHAR (50)
,@PHONE AS NVARCHAR(11)
,@MOBILE AS NVARCHAR (11)
,@RESHTE AS NVARCHAR (50)
,@MAGHTA AS NVARCHAR (50)
AS
BEGIN
INSERT INTO [STUDENT]
([NAME],[FAMILY],[SHSH],[SODUR],[MCODE],[BDAY],[BYEAR] ,[BCITY] ,[FANAME] ,[PHONE] ,[MOBILE] ,[RESHTE] ,[MAGHTA],[BMOUNTH] )
VALUES
(@NAME,@FAMILY,@SHSH,@SODUR,@MCODE,@BDAY,@BYEAR,@B CITY,@FANAME,@PHONE,@MOBILE,@RESHTE,@MAGHTA,@BMOUN TH)

END
GO

nefrat
جمعه 08 اردیبهشت 1391, 18:54 عصر
البته نمیدونم چر اینجا داره فاصله میندازه ...!!!
و یکی اینکه چرا name رو توی خط 4 پر رنگ شده ولی بقیه نه !
و اینکه BMOUNTH از خط 10 بیاد خط 17؟

Mahmoud Zaad
جمعه 08 اردیبهشت 1391, 19:06 عصر
سلام
نوع کد ملی رو هم Nvarchar با طول 10 تعریف کنید.

Mahmoud.Afrad
جمعه 08 اردیبهشت 1391, 19:14 عصر
در قسمت تعریف پارامترها یعنی


@NAME AS NVARCHAR(50)
,@FAMILY AS NVARCHAR(80)
,@SHSH AS INT
......

ترتیب مهم نیست. (البته در C# باید به همین ترتیب پروسیجر رو اجرا کنید)



([NAME],[FAMILY],[SHSH],[SODUR],[MCODE],[BDAY] ,[BYEAR] ,[BCITY] ,[FANAME] ,[PHONE] ,[MOBILE] ,[RESHTE] ,[MAGHTA],[BMOUNTH] )

البته اینجا ترتیب میتونه مهم باشه چون بعدا در گرید به همین ترتیب نشون داده میشه


منظور من اینجاست


VALUES
(@NAME,@FAMILY,@SHSH,@SODUR,@MCODE,@BDAY,@BMOUNTH, @BYEAR,@BCITY,@FANAME,@PHONE,@MOBILE,@RESHTE,@MAGH TA)


که باید پارامترها به ترتیبی باشه که قبل از values اومده . در پست اول ترتیب قبل و بعد از values مثل هم نیست.

اشکال هم همون طور که گفته شده احتمالا به خاطر اینه که ورودی شما در زمان اجرا از تعداد طولی که براش در جدول یا در پروسیجر درنظر گرفتید بیشتره.


یک توصیه اینکه فیلدهای رشته ای که صرفا عدد هستند(غیرفارسی) مثل تلفن و ... رو از نوع vchar در جداول و پروسیجرها تعریف کنید. نوع nvarchar دو برابر vchar فضا اشغال میکند.

nefrat
جمعه 08 اردیبهشت 1391, 19:35 عصر
مرسی ممنونم الان دوباره تست میکنم !