PDA

View Full Version : استفاده درست از دستو try



pedram_ns
یک شنبه 10 اردیبهشت 1391, 09:02 صبح
با سلام
من قبلا هم این سئوال رو داشتم ولی جواب درستی نگرفتم

من کد زیر رو دارم:


Try

Dim con As New OleDbConnection(WebConfigurationManager.Connection Strings("connection").ConnectionString)

con.Open()

con.Close()

Catch ex As Exception

End Try

1.در این کد اگر بعد از دستور باز شدن ارتباط با دیتابیس اروری بگیرم دستور close بسته نمیشه و باز میمونه.
2.اگر از دستور finally استفاده کنم و دستور close رو توی اون بذارم جواب نمیده(ارور میده)
3.اگر دستور ارتباط با دیتابیس رو خارج از try بذارم در صورت ارور دادن خود ارتباط این ارور کنترل نمیشه.

لطفا بگید باید چطور نوشت که در هر صورت هم همه ارور ها کنترل بشه و هم ارتباط حتما بسته بشه.

ممنون

ahmad156
یک شنبه 10 اردیبهشت 1391, 09:24 صبح
ب
2.اگر از دستور finally استفاده کنم و دستور close رو توی اون بذارم جواب نمیده(ارور میده)

چه error ای میده؟؟

d_derakhshani
یک شنبه 10 اردیبهشت 1391, 09:31 صبح
اول واسه connection از Try استفاده نکن و از using استفاده کن:

Using con As New SqlConnection("connection string")

End Using


using(var con=new SqlConnection("connection string"){

}

در این صورت خودکار کانکشن بسته میشه حتی اگه خطایی رخ بده

اما اگه می خوای از روش نچندان درست try استفاده کنی:

Dim con As New OleDbConnection(WebConfigurationManager.Connection Strings("connection").ConnectionString)
Try
con.Open()

Catch ex As Exception

Finally
If con.State=System.Data.ConnectionState.Open Then
con.Close()
End If
End Try

pedram_ns
یک شنبه 10 اردیبهشت 1391, 10:38 صبح
با تشکر

خوب نمیشه هر دو رو ترکیب کنم؟ یعنی از using استفاده کنم و از try هم برای چک کردن خطاهای پیش امده ی بعد از ایجاد ارتباط استفاده کنم؟ چون try رو در اصل برای کنترل این خطا ها میخوام.(در این صورت نحوه نوشتنش چطور میشه. دستور open و close رو چطور باید نوشت. یه نمونه کد کوچیک میدید؟)

2. در هر دو روش که شما توضیح دادید اگر خود کانکشن ارور برگردونه این ارور کنترل نخواهد شد(چون خارج از try نوشته شده). در این صورت چی؟

d_derakhshani
یک شنبه 10 اردیبهشت 1391, 10:47 صبح
جواب سوال 2: خود کانکشن خطا بر نمی گردونه چون تو خط تعریف خطایی رخ نمیده(و گرنه شما وقتی می نوسید Dim a as new Class1 هم باید try/catch میزاشتید دیگه. که اینطور نیست.)
خطا زمانی رخ میده که کانکشن بخواد باز بشه.
1. در مورد سوال اول بله میشه برای سایر خطاها برای روش using از try/catch استفاده کرد. اما بهتره کلا تو برنامه های وب از try/catch برای خطاهای مدیریت نشده استفاده نکنید.
این تاپیک هم جدیدا در همین ارتباط بوده(البته تو سایت باید زیاد باشه)
http://barnamenevis.org/showthread.php?338735-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-Error-Log

pedram_ns
یک شنبه 10 اردیبهشت 1391, 11:00 صبح
1. یعنی شما میگید کد کانکشن هیچ وقت خطا نمیده؟ مثلا از سمت سرور؟ (خوب اگه نمیده که هیچ)
2. میشه بگید دقیقا در بحث ارتباط با دیتابیس کجا نیاز به کنترل خطا داره و کجا نداره؟

مثلا این کد رو ببینید: من از using استفاده کردم و بعد از اون از try ولی باز هم وقتی اروری بوسیله try تشخیص داده بشه ارتباط دیتابیس باز میمونه. در حالی که شما گفتید اگه خطا بده باز هم میبنده.


Public Sub securityimages()


Using con As New OleDbConnection(WebConfigurationManager.Connection Strings("ConnectionString").ConnectionString)

Try

Dim number As Integer = Createnumber()
Dim selectsql As String = "SELECT * FROM [securityimages] WHERE image_number=@number"
Dim cmd As New OleDbCommand(selectsql, con)
cmd.Parameters.AddWithValue("@number", number)
Dim reader As OleDbDataReader
con.Open()
reader = cmd.ExecuteReader()
reader.Read()

Dim image_name As String = reader("image_name").ToString()
Dim image_code As String = reader("image_code").ToString()

reader.Close()
con.Close()
securityimg.ImageUrl = "~/images/securityimages/" & image_name & ".gif"
ViewState("code") = image_code.ToLower

Catch ex As Exception
Response.Redirect("Default.aspx")
End Try

End Using
End Sub

d_derakhshani
یک شنبه 10 اردیبهشت 1391, 11:08 صبح
کدهای زیر می تونه موجب خطا بشه:
con.Open
cmd.ExecuteReader
reader.Read
اما همونطور که گفتم بهتره try/catch کلا استفاده نشه

alonemm
یک شنبه 10 اردیبهشت 1391, 13:43 عصر
1. یعنی شما میگید کد کانکشن هیچ وقت خطا نمیده؟ مثلا از سمت سرور؟ (خوب اگه نمیده که هیچ)
2. میشه بگید دقیقا در بحث ارتباط با دیتابیس کجا نیاز به کنترل خطا داره و کجا نداره؟

مثلا این کد رو ببینید: من از using استفاده کردم و بعد از اون از try ولی باز هم وقتی اروری بوسیله try تشخیص داده بشه ارتباط دیتابیس باز میمونه. در حالی که شما گفتید اگه خطا بده باز هم میبنده.


Public Sub securityimages()


Using con As New OleDbConnection(WebConfigurationManager.Connection Strings("ConnectionString").ConnectionString)

Try

Dim number As Integer = Createnumber()
Dim selectsql As String = "SELECT * FROM [securityimages] WHERE image_number=@number"
Dim cmd As New OleDbCommand(selectsql, con)
cmd.Parameters.AddWithValue("@number", number)
Dim reader As OleDbDataReader
con.Open()
reader = cmd.ExecuteReader()
reader.Read()

Dim image_name As String = reader("image_name").ToString()
Dim image_code As String = reader("image_code").ToString()

reader.Close()
con.Close()
securityimg.ImageUrl = "~/images/securityimages/" & image_name & ".gif"
ViewState("code") = image_code.ToLower

Catch ex As Exception
Response.Redirect("Default.aspx")
End Try

End Using
End Sub

باسلام:

بعضی مدیریت ها برای جلوگیری از خطاهم میتونه در کدنویسی باشه به مثال زیر دقت کنید که در صورت وجود نداشتن رکورد عملیات واکشی انجام نمیشه:


static void HasRows(SqlConnection connection)
{
using (connection)
{
SqlCommand command = new SqlCommand(
"SELECT CategoryID, CategoryName FROM Categories;",
connection);
connection.Open();

SqlDataReader reader = command.ExecuteReader();

if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
reader.GetString(1));
}
}
else
{
Console.WriteLine("No rows found.");
}
reader.Close();
}
}