PDA

View Full Version : راهنمایی در پیدا کردن مشکل



سفید برفی
شنبه 14 بهمن 1385, 18:36 عصر
سلام
ببخشید در کد زیر دستور cmdselect1 با وجود فیلدهایی منطبق با این شروط وجود دارد ولی dtrtodo1 مقداری ندارد و حلقه while اجرا نمی شود لطفا من را راهنمایی کنید.
متشکرم.

Private Sub submit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles submit.Click
Dim str, id, d As String

Dim cmdselect, cmdselect1, cmdselect2, cmdinsert1, cmdinsert2, cmdupdate As SqlCommand
Dim dtrmember, dtrtodo1, dtr1 As SqlDataReader
Session("user") = username.Text
conmember.Open
cmdselect = New SqlCommand("select username,user_id from member where password='" + password.Text + "' and username='" + username.Text + "'", conmember)
dtr1 = cmdselect.ExecuteReader
If dtr1.HasRows Then dtr1.Read()
Session("id") = dtr1("user_id")
dtr1.Close
contodo.Open
cmdselect1 = New SqlCommand("select * from todo1 where (sender='" + Session("user") + "' or owner_id=" & Session("id") & ") and folder<>'sucessfull' and folder<>'trash' and folder<>'trashs' and expire='0' and deadline<getdate() or folder= null", contodo)
dtrtodo1 = cmdselect1.ExecuteReader
Response.Write("okkkk1")
contodo2.Open
While dtrtodo1.Read
Response.Write("while")
cmdupdate = New SqlCommand("update todo1 set folder='unsucessfull', expire=1 where todo_id=" & dtrtodo1("todo_id") & "", contodo2)
cmdupdate.ExecuteNonQuery
Response.Write("cmup")
cmdselect2 = New SqlCommand("select user_id from member where username='" + dtrtodo1("sender") + "'", conmember)
id = cmdselect2.ExecuteScalar
d = Now.Year
If dtrtodo1("folder") <> "trashi" Then

cmdinsert1 = New SqlCommand("insert into todo1 (owner_id,sender,reciever,subject,todo_date,deadli ne,priority,type,is_new,body) values(" & dtrtodo1("owner_id") & ",'کنترل کننده سیستم'," & dtrtodo1("reciever") & ",'اخطاریه',getdate(),'" + d + "','زیاد','Message',1," & dtrtodo1("body") & ",' به پایان رسیده وشما پاسخی مبتنی بر انجام آن ارسال نکرده ایدToDoمهلت این ')", contodo2)
cmdinsert1.ExecuteNonQuery()
cmdinsert2 = New SqlCommand("insert into todo1 (owner_id,sender,reciever,subject,todo_date,deadli ne,priority,type,is_new,body) values('" + id.ToString + "','کنترل کننده سیستم'," & dtrtodo1("sender") & ",'اخطاریه',getdate(),'" + d + "','زیاد','Message',1," & dtrtodo1("body") & ",' به پایان رسیده وشما پاسخی مبتنی بر انجام آن دریافت نکرده ایدToDoمهلت این ')", contodo2)
cmdinsert2.ExecuteNonQuery
Else

cmdinsert2 = New SqlCommand("insert into todo1 (owner_id,sender,reciever,subject,todo_date,deadli ne,priority,type,is_new,body) values('" + id.ToString + "','کنترل کننده سیستم'," & dtrtodo1("sender") & ",'اخطاریه',getdate(),'" + d + "','زیاد','Message',1," & dtrtodo1("body") & ",' به پایان رسیده وشما پاسخی مبتنی بر انجام آن دریافت نکرده ایدToDoمهلت این ')", contodo2)
cmdinsert2.ExecuteNonQuery
End If

End While

dtr1.Close
dtrtodo1.Close
contodo2.Close
contodo.Close
If Page.IsValid Then dtrmember = cmdselect.ExecuteReader
If dtrmember.HasRows Then

While dtrmember.Read
If (dtrmember("username") = "addmin") Then

Response.Redirect("admin.aspx")
ElseIf (dtrmember("username") = username.Text) Then

Session("user") = " " & username.Text
Session("id") = dtrmember("user_id")
Response.Redirect("master.aspx")
End If

End While

Else : Label.Visible = True

End If

conmember.Close
End Sub

samanes
شنبه 14 بهمن 1385, 23:12 عصر
Session از جنس object مقدار بر میگردونه..
مقدارشو به string تبدیل کن.

string text = System.Convert.ToString(Session["saman"]);

samanes
شنبه 14 بهمن 1385, 23:14 عصر
و id اگه از نوع int است, session رو convert کن به integer

سفید برفی
یک شنبه 15 بهمن 1385, 07:50 صبح
سلام
ممنون از راهنماییتان .اما کد من خطای منطفی دارد از لحاظ syntax چک شده.

Alireza_Salehi
یک شنبه 15 بهمن 1385, 14:36 عصر
پیشنهاد می کنم به جای این که این طوری همه رشته پرس و جو رو بسازید مقادیر رو به صورت پارامتر تعریف کنید و بعد مقدار دهی کنید:



Dim cmd As New SqlCommand()
cmd.CommandText = "SELECT * FROM [Table1] WHERE [Field1]=@x AND [Field2]=@y"
cmd.Parameters.Add("@x", SqlDbType.Int).Value = 1
cmd.Parameters.Add("@y", SqlDbType.NVarChar).Value = "Test"
با این روش شاید چند خط کد بیشتر بنویسی ولی حداقل از صحت مقادیر و تبدیل آنها بین دات نت و SQL مطمئن میشی و ضمنا در هر مرحله خطا یابی خیلی راحت میشه وخطا های منطقی به حداقل میرسه و ظاهر کد هم ساده تر و واضح تر میشه !

در ضمن برای مشکل شما هم به نظر من تنها ایراد ممکن در رشته پرس و جو می تونه باشه که من بارها خودم به اون برخورد کردم و تقریبا در اکثر موارد علت همون بود که گفتم (یک خطای کوچیک در این رشته باعث جواب نگرفتن در این مرحله میشه)

بهترین راه تست کردن این پرس وجو در Query Analyzer و دیدن نتیجه آن است.

در ضمن اگر نام فیلد ها و جدول ها رو بین [] قرار بدی از یک سری خطا های احتمالی دیگه هم راحت میشی!

خطاهای احتمالی :
1. استفاده نکردن از N قبل از رشته های فارسی
2.استفاده نکردن از ' ' در اطراف رشته ها
3.استفاده از نوع داده ناصحیح
4.استفاده از کلمات رزرو شده SQL در زمان طراحی جدول ها و فیلدها (برای اصلاح آن از [] استفاده کن)
5.وجود فاصله (Space) در سمت چپ یا راست رشته های تولید شده توسط دات نت (از توابع Trim برای اصلاح آن استفاده کنید)
6.رعایت نکردن فاصله بین کلمات کلیدی SQL در رشته پرس وجو
7.حتی الامکان از قرار دادن مقادیر فارسی در فیلد هایی که عمل مقایسه بر روی آنها انجام می شود خودداری کنید.


امیدوارم با این توضیحات مشکل حل بشه.