PDA

View Full Version : سوال: تشخیص تکراری بودن یک ردیف در بانک



bahar2008
سه شنبه 04 تیر 1387, 21:08 عصر
سلام دوستان خوبم
من کد زیر رو در برنامم قرار دادم برای اینکه تشخیص بده که اگر ردیفی از دیتا گریدم تکراری بود جایگزین همون ردیف قبلی در بانک بشه ولی پیغام خطایی داد که نمی دونم از چی هست :ناراحت: :ناراحت:



a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
Else : a = 0
End If
cmd.CommandText = " select * from shakhes where sal81=@a"
Dim dr = cmd.ExecuteReader()
If dr.hasrows = True Then
cmd.CommandText = "UPDATE shakhes SET sal81 =" & a & " WHERE idsetande = " & DataGridView2.Rows(j).Cells(4).Value
End If
If DataGridView2.Rows(j).Cells(5).Value <> 0 Then
b = DataGridView1.CurrentRow.Cells(5).Value / DataGridView2.Rows(j).Cells(5).Value
Else : b = 0
End If
cmd.CommandText = " select * from shakhes where sal82=@b"
Dim dr = cmd.ExecuteReader()
If dr.hasrows = True Then
cmd.CommandText = "UPDATE shakhes SET sal82 =" & a & " WHERE idsetande = " & DataGridView2.Rows(j).Cells(5).Value
End If

پیغام خطا به صورت زیر هست :ناراحت:
http://img.majidonline.com/pic/160544/khata.JPG

سوال دیگه ام این هست که اصلا این کدی که نوشتم آیا برای تشخیص یک ردیف در بانکم درست هست و اگر نیست به چه صورتی باید کد رو تغییر بدم؟؟؟

saman_itc
چهارشنبه 05 تیر 1387, 00:58 صبح
شما میخوای اگه ردیف یکی بود مقادیر با مقادیر بانک جمع شه؟بیشتر توضیح بده

mehrnoosh_al62
چهارشنبه 05 تیر 1387, 10:00 صبح
دوست خوبم شما قبلا هم مشکلی شبیه به این داشتید مشکل شما اینه که قبل از اینکه پارامترهاتون رو تعریف کنید و بهشون مقدار بدید اون هارو insert میکنید کدتون رو به این شکل تغییر بدید :


a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
sqlcomm.Parameters.Add("@sal81", SqlDbType.Int)
sqlcomm.Parameters("@sal81").Value = a
Else : a = 0
End If
cmd.CommandText = " select * from shakhes where sal81=@sal81"
Dim dr = cmd.ExecuteReader()
If dr.hasrows = True Then
cmd.CommandText = "UPDATE shakhes SET sal81 =@sal81 WHERE idsetande = " & DataGridView2.Rows(j).Cells(4).Value
End If
If DataGridView2.Rows(j).Cells(5).Value <> 0 Then
b = DataGridView1.CurrentRow.Cells(5).Value / DataGridView2.Rows(j).Cells(5).Value
sqlcomm.Parameters.Add("@sal82", SqlDbType.Int)
sqlcomm.Parameters("@sal81").Value = b
Else : b = 0
End If
cmd.CommandText = " select * from shakhes where sal82=@sal82"
Dim dr = cmd.ExecuteReader()
If dr.hasrows = True Then
cmd.CommandText = "UPDATE shakhes SET sal82 =@sal82 WHERE idsetande = " & DataGridView2.Rows(j).Cells(5).Value
End If

البته من متوجه نشدم شما چرا از دستور Update استفاده کردید اگه میخواید سطر قبلی که تکراریه پاک شه و سطر جدید جایگزینش شه اول delete و بعد insert کنید

bahar2008
چهارشنبه 05 تیر 1387, 10:11 صبح
شما میخوای اگه ردیف یکی بود مقادیر با مقادیر بانک جمع شه؟بیشتر توضیح بده


نه دوست عزيز
من مي خوام اگر اطلاعات رديف يكي بود جايگزين همون رديفي بشه كه اطلاعاتش با اطلاعات وارد شده جديد بشه.
يعني اگر يك رديف در ديتا گريد از اعداد 2 و 5 و 8 دارم و وارد بانك مي كنم و در بانك هم رديفي مانند 2 و 5 و 7 دارم جايگزين اون رديف اول بشه و اطلاعات رو update كنه ولي به اين صورتيكه من نوشتم فيلد به فيلد اين كار رو انجام مي ده :ناراحت:

bahar2008
چهارشنبه 05 تیر 1387, 10:44 صبح
دوست عزيز sqlcommand اصلا پارامتري به نام Parameters نداره

mehrnoosh_al62
چهارشنبه 05 تیر 1387, 11:16 صبح
ببخشید به جای sqlcomm بگذارید cmd

bahar2008
چهارشنبه 05 تیر 1387, 17:49 عصر
آیا این طرز نوشتن در برنامه درست هست دوستان؟


a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
m = (DataGridView1.CurrentRow.Cells(1).Value * 100) + DataGridView2.Rows(j).Cells(1).Value
cmd.CommandText = " INSERT INTO shakhes2 VALUES(" & m & "," & a & ") where idshakhes<>" & m
cmd.CommandText = "UPDATE shakhes2 SET idshakhes =" & m & "WHERE idshakhes = " & m
cmd.CommandText = "UPDATE shakhes2 SET sal81 =" & a & " where idshakhes=" & m
cmd.ExecuteNonQuery()


آیا می شه چند تا command text و یک cmdexecutenonQuery داشته باشیم؟
چون من این کد رو که نوشتم هیچ پیغام خطایی نمی ده ولی در بانک هم insert نمی کنه:ناراحت:

mehrnoosh_al62
پنج شنبه 06 تیر 1387, 07:50 صبح
نه درست نیست وقتی شما کد فوق رو اجرا میکنید تنها commandtext آخری اجرا میشه همه دستورات رو تو یه commandtext بنویسید

bahar2008
پنج شنبه 06 تیر 1387, 11:26 صبح
ممنونم از لطفت دوست عزیز ولی آخه چه جوری همه رو تو یک CommandText بنویسم باید بینشون "و " بزارم یا علامت خاصی نیاز هست؟

سوال دیگه ام این هست که شرط where که در دستور زیر گذاشتم آیا درست هست به این صورت نوشتنش؟



cmd.CommandText = " INSERT INTO shakhes2 VALUES(" & m & "," & a & ") where idshakhes<>" & m

mehrnoosh_al62
پنج شنبه 06 تیر 1387, 11:43 صبح
نه به هیچ علامت خاصی نیاز نیست میتونی پشت هم همه دستور ها رو بنویسی و بینشون فقط یه space بذار البته برای شکیل تر بودن کد بهتره هر دستور رو تو یه خط بنویسی
در مورد دستورت هم شرط where درسته ولی تو دستور insert باید فیلد هایی که میخوای بهشون مقدار insert کنی مشخص باشه

insert into table1(field1,field2)values(value1,value2)]

در ضمن تعریف پارامترها یادتون نره...

bahar2008
پنج شنبه 06 تیر 1387, 14:03 عصر
ممنونم از لطفت :قلب::قلب:
من همه دستورات رو به صورت زیر کنار هم نوشتم ولی خطای end of statment expected می گیره:ناراحت:


cmd.CommandText = " INSERT INTO shakhes2 VALUES(" & m & "," & a & ")where id <>" & m & "" "UPDATE shakhes2 SET id=" & m & "WHERE id = " & m & "" "UPDATE shakhes2 SET sal81 =" & a & " where id=" & m & ""


راستی شما که گفته بودی اول سطر قبلی رو delete کنم و بعد سطر جدید رو insert کنم می شه لطفا یک مثال برام اینجا بذاری؟:قلب:

bahar2008
پنج شنبه 06 تیر 1387, 23:00 عصر
من کد برنامم رو به جای اینکه insert کنم و delete کنم به این صورت نوشتم و بهش گفتم که اگر همچین ردیفی وجود داره عمل insert رو انجام بده ولی نمی دونم چرا خطای زیر رو داد :ناراحت::ناراحت:


If DataGridView1.CurrentRow.Cells(0).Value Then
For j As Integer = 0 To DataGridView2.RowCount - 1
If DataGridView2.Rows(j).Cells(0).Value Then
If DataGridView2.Rows(j).Cells(4).Value <> 0 Then
a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
m = (DataGridView1.CurrentRow.Cells(1).Value * 100) + DataGridView2.Rows(j).Cells(1).Value
cmd.CommandText = " select * from shakhes2 where idshakhes='" & m & "' and sal81 = '" & a & "'"
dr = cmd.ExecuteReader()
If dr.hasrows = True Then
dr.read()
cmd.CommandText = " UPDATE shakhes2 SET idshakhes,sal81 =" & m & "," & a & " WHERE idshakhes = " & m
cmd.ExecuteNonQuery()
Else
cmd.CommandText = " INSERT INTO shakhes2(idshakhes,sal81) VALUES(@m,@a)"
cmd.Parameters.Add("@idshakhes", SqlDbType.Int)
cmd.Parameters.Add("@sal81", SqlDbType.Int)
cmd.Parameters("@idshakhes").Value = m
cmd.Parameters("@sal81").Value = a
cmd.ExecuteNonQuery()
End If
Else : a = 0
End If
End If
Next

پیغام خطایی که صادر می کنه :ناراحت:
http://img.majidonline.com/pic/160797/khata.JPG

bahar2008
جمعه 07 تیر 1387, 13:26 عصر
خواهشا دوستان یکی به من کمک کنه :افسرده::افسرده::افسرده::افس ده:
آخه چرا این پیغام خطا رو داده؟ :ناراحت::ناراحت::ناراحت::نار حت::ناراحت:

bahar2008
جمعه 07 تیر 1387, 21:47 عصر
یعنی هیچ کسی نمی دونه این پیغام خطا برای چی هست؟ :متفکر::متفکر:
کجای کد نویسی ام اشتباه بوده که این پیغام رو داده؟:ناراحت::ناراحت::ناراح :
خواهشا دوستان خوبم یکی جواب منو بده:گریه::گریه::گریه::گریه:

kablayi
شنبه 08 تیر 1387, 00:14 صبح
سلام ...
اگر جایی کانکشن رو open کرده باشی بایستی اونو ببندید ...
کد شما نامفهومه ... معلوم نیست قصدتون چیه ...
شما اطلاعات جدید رو کجا وارد میکنید ... یعنی کاربر او مقادیر جدید رو جایی تایپ میکنه یا خودتون توی برنامه بدست میآرید...
اگر یه کم منظم تر برنامه بنویسید مشکلی پیش نمی آد ....

kablayi
شنبه 08 تیر 1387, 00:23 صبح
من کد برنامم رو به جای اینکه insert کنم و delete کنم به این صورت نوشتم و بهش گفتم که اگر همچین ردیفی وجود داره عمل insert رو انجام بده ولی نمی دونم چرا خطای زیر رو داد :ناراحت::ناراحت:


If DataGridView1.CurrentRow.Cells(0).Value Then
For j As Integer = 0 To DataGridView2.RowCount - 1
If DataGridView2.Rows(j).Cells(0).Value Then
If DataGridView2.Rows(j).Cells(4).Value <> 0 Then
a = DataGridView1.CurrentRow.Cells(4).Value / DataGridView2.Rows(j).Cells(4).Value
m = (DataGridView1.CurrentRow.Cells(1).Value * 100) + DataGridView2.Rows(j).Cells(1).Value
cmd.CommandText = " select * from shakhes2 where idshakhes='" & m & "' and sal81 = '" & a & "'"
dr = cmd.ExecuteReader()
If dr.hasrows = True Then
dr.read()
cmd.CommandText = " UPDATE shakhes2 SET idshakhes,sal81 =" & m & "," & a & " WHERE idshakhes = " & m
cmd.ExecuteNonQuery()
Else
cmd.CommandText = " INSERT INTO shakhes2(idshakhes,sal81) VALUES(@m,@a)"
cmd.Parameters.Add("@idshakhes", SqlDbType.Int)
cmd.Parameters.Add("@sal81", SqlDbType.Int)
cmd.Parameters("@idshakhes").Value = m
cmd.Parameters("@sal81").Value = a
cmd.ExecuteNonQuery()
End If
Else : a = 0
End If
End If
Next

پیغام خطایی که صادر می کنه :ناراحت:
http://img.majidonline.com/pic/160797/khata.JPG

دوست عزیز شما تو تعریف پارامترها مشکل دارید ...

پارامترهای شما a@ و m@ ...
idshakhes وsal81 هم مقادیری که بایستی پارامترها رو با اونا مقدار دهی کنی ...



cmd.Parameters.Addwithvalue("@m",idshakhes)
cmd.Parameters.Addwithvalue("@a",sal81)

محمدامین شریفی
شنبه 08 تیر 1387, 01:24 صبح
نه دوست عزيز
من مي خوام اگر اطلاعات رديف يكي بود جايگزين همون رديفي بشه كه اطلاعاتش با اطلاعات وارد شده جديد بشه.
يعني اگر يك رديف در ديتا گريد از اعداد 2 و 5 و 8 دارم و وارد بانك مي كنم و در بانك هم رديفي مانند 2 و 5 و 7 دارم جايگزين اون رديف اول بشه و اطلاعات رو update كنه ولي به اين صورتيكه من نوشتم فيلد به فيلد اين كار رو انجام مي ده :ناراحت:

نمونه ای از حذف سطرهای اظافی:


select distinct cname,crs.c#,term
from sec,crs
where sec.c#=crs.c# and term>851

bahar2008
شنبه 08 تیر 1387, 09:22 صبح
سلام ...
اگر جایی کانکشن رو open کرده باشی بایستی اونو ببندید ...
کد شما نامفهومه ... معلوم نیست قصدتون چیه ...
شما اطلاعات جدید رو کجا وارد میکنید ... یعنی کاربر او مقادیر جدید رو جایی تایپ میکنه یا خودتون توی برنامه بدست میآرید...
اگر یه کم منظم تر برنامه بنویسید مشکلی پیش نمی آد ....

من كانكشن رو در آخر برنامم بستم دوست عزيز مشكل از excute reader هست كه مي گه بايد بسته بشه كه با اينكه اونو هم مي بندم ولي باز هم همين پيغام رو مي ده