PDA

View Full Version : اشکال این کد کجاست؟ در معرفی فانکشن



swallow.pa
سه شنبه 01 فروردین 1391, 10:26 صبح
سلام به همه
عیدتون مبارک باشه:تشویق:
من این فانکشن رو برای بدست آوردن سال نوشتم که کاربر بتونه سال جدید رو تعریف کنه


Function Create_Years() As Integer
Dim Cmd As New SqlClient.SqlCommand(Nothing, Cn)
Dim DtRdr As SqlClient.SqlDataReader
If Cn.State = ConnectionState.Closed Then Cn.Open()
Cmd.CommandText = "SELECT MAX(YearsId) FROM Company"
DtRdr = Cmd.ExecuteReader
With DtRdr
While .Read
If .GetValue(2) <> Nothing Then Create_Years = .GetValue(2) + 1
End While
Cn.Close()
.Close()
End With

End Function

اما خود vs این هشدار رو می زنه
Warning 1 Function 'Create_Years' doesn't return a value on all code paths. Are you missing a 'Return' statement?

چطوری درستش کنم
ممنون

Beginner2013
سه شنبه 01 فروردین 1391, 12:32 عصر
مقدار بازگشتی رو Integer تعریف کردی اما چیزی برنگردوندی.

swallow.pa
سه شنبه 01 فروردین 1391, 13:14 عصر
مقدار بازگشتی رو Integer تعریف کردی اما چیزی برنگردوندی.
خب چطوری - من بلد نیستم توضیح بدید لطفا

فرید نجفلو
سه شنبه 01 فروردین 1391, 13:26 عصر
خب چطوری - من بلد نیستم توضیح بدید لطفا
شما از روش VB6 استفاده کردید!

Create_Years = .GetValue(2) + 1
و درستش اینه:
[VBReturn .GetValue(2) + 1[/VB]

واینکه اگه تو حلقه مقداری برگشت نداید (هیچ شرط درستی و جود نداشت) باید بعد از End With یه مقدار Integer برگردونید مثلا 1

در مورد درست کارکردن کل کدتون من شک دارم(فقط شک:چشمک:)!

swallow.pa
سه شنبه 01 فروردین 1391, 14:50 عصر
شما از روش VB6 استفاده کردید!

Create_Years = .GetValue(2) + 1
و درستش اینه:
[VBReturn .GetValue(2) + 1[/VB]

واینکه اگه تو حلقه مقداری برگشت نداید (هیچ شرط درستی و جود نداشت) باید بعد از End With یه مقدار Integer برگردونید مثلا 1

در مورد درست کارکردن کل کدتون من شک دارم(فقط شک:چشمک:)!
خب دوست من
من چطور می تونم این
SELECT MAX(YearsId) FROM Company
رو از دیتابیس بخونم و و بعلاوه یک کنم
نظر شما چیه
ممنون

Hybrid
سه شنبه 01 فروردین 1391, 15:05 عصر
سلام ، مثل قطعه کد زیر :


Function GetLastRecordNumber() As Integer
Dim oledbcommand1 As New OleDbCommand
oledbcommand1.Connection = oledbConnection1
oledbcommand1.CommandType = CommandType.Text
oledbcommand1.CommandText = "Select max (person_shaks) from person"
If oledbcommand1.Connection.State <> ConnectionState.Open Then
oledbcommand1.Connection.Open()
End If
Dim i As Integer = oledbcommand1.ExecuteScalar()

oledbConnection1.Close()
Return (i+1)
End Function

موفق باشید./

فرید نجفلو
سه شنبه 01 فروردین 1391, 15:13 عصر
با اجازه جناب vbBoss
دستور یکم اصلاح می خواد تا وقتی هیچ رکوردی وجود نداشت با خطا مواجه نشید!

oledbcommand1.CommandText = "Select ISNULL(max (person_shaks),0) from person"

swallow.pa
سه شنبه 01 فروردین 1391, 15:34 عصر
با تشکر از شما دوستان گرامی کدها رو بدین صورت اصلاح کردم که طبق برنامه خودم پیش برم
باز هم از شما ممنون


Function GetLastYears() As Integer
Dim intYears As Integer
If Cn.State = ConnectionState.Closed Then Cn.Open()

Using Cmd As New SqlClient.SqlCommand(Nothing, Cn) With {.CommandType = CommandType.Text, .CommandText = "SELECT ISNULL(MAX(YearsId),0) FROM Company"}
intYears = Cmd.ExecuteScalar
Cn.Close()
Return (intYears + 1)
End Using

End Function

hakim22
پنج شنبه 03 فروردین 1391, 12:50 عصر
از همون روش VB6 میشه برای معرفی خروجی در VB.net استفاده کرده

این یک هشداره و معنیش اینکه همیشه تابع مقدار خاصی بر نمی گردنونه ، چون اون قسمت از کد که مقدار رو بر می گردونه ، Create_Year داخل یک if قرار داره و چون ممکنه شرط if همیشه برقرار نباشه پس ممکنه جواب تابع در بعضی موراد null بشه ، اگر یک مقدار اولیه برای اون قبل از if معرفی کنی ایم هشدار میره ، یا باید شرطت برای حالت else هم یک مقداری رو روی Create_year سوار کنه ، همین مشکل وقتی که از try یا Catch استفاده می کنی هم پیش میاد ، شما باید همیشه همه ی حالت های ممکن رو در نظر بگیرید و تا جایی که میشه برای داده های پیش بینی نشده هم آمادگی داشته باشی ، چون خیلی از کاربرهای برنامه مثل شما فکر نمی کنند و ممکنه اصلا اطلاعات رو به همون روشی که باید وارد نکنند.
برنامه ی خوبه که کاربر رو به اندازه نیاز محدود کنه و همچنین روشن و واضح بهش بفهمونه چی باید وارد بشه و بعد برای همه ی مقادیری که طرف اطلاعات وارد کرده هم یک نتیجه ای ( مثلا خطا) اعلام کنه

فرید نجفلو
پنج شنبه 03 فروردین 1391, 13:11 عصر
از همون روش VB6 میشه برای معرفی خروجی در VB.net استفاده کرده

این یک هشداره و معنیش اینکه همیشه تابع مقدار خاصی بر نمی گردنونه ، چون اون قسمت از کد که مقدار رو بر می گردونه ، Create_Year داخل یک if قرار داره و چون ممکنه شرط if همیشه برقرار نباشه پس ممکنه جواب تابع در بعضی موراد null بشه ، اگر یک مقدار اولیه برای اون قبل از if معرفی کنی ایم هشدار میره ، یا باید شرطت برای حالت else هم یک مقداری رو روی Create_year سوار کنه ، همین مشکل وقتی که از try یا Catch استفاده می کنی هم پیش میاد ، شما باید همیشه همه ی حالت های ممکن رو در نظر بگیرید و تا جایی که میشه برای داده های پیش بینی نشده هم آمادگی داشته باشی ، چون خیلی از کاربرهای برنامه مثل شما فکر نمی کنند و ممکنه اصلا اطلاعات رو به همون روشی که باید وارد نکنند.
برنامه ی خوبه که کاربر رو به اندازه نیاز محدود کنه و همچنین روشن و واضح بهش بفهمونه چی باید وارد بشه و بعد برای همه ی مقادیری که طرف اطلاعات وارد کرده هم یک نتیجه ای ( مثلا خطا) اعلام کنه

میشه بگید اون شرطی که میگید کجای کد قرار داره
تو اون کدی که من می بینم intYears داخل یک Using قرار داره که کاملا هم درسته!
به روش VB6 هم برنمی گرده چون نوشتن Return intYears نه GetLastYears=intYears !
اگر هم مشکل رو در نبود Try..Catch می بیند باید بگم قرار نیست هر تابع خودش Exception ها رو گیر بندازه (که تو توابع خود دات نت هم همینطوره) ایشون این کار رو محول به فراخون تابع کردن!
این تابه ممکنه Exception راه بندازه ولی هیچ وقت Nothing یا به قول شما Null نمیده

البته یه اتمال دیگه هم هست که شما به پست شماره 1 (http://barnamenevis.org/showthread.php?333173-اشکال-این-کد-کجاست؟-در-معرفی-فانکشن&p=1468016&viewfull=1#post1468016) که فکر کنم هم دیر شده و هم جوبش داده شده!

hakim22
جمعه 04 فروردین 1391, 11:07 صبح
دوست عزیز من روی کد سوال اول پاسخ دادم ، در ضمن مهم اینکه به جواب درست برسیم و نه اینکه مشکل رو به صورت موقت حل کنیم.
سوال این بود که چرا این هشدار مشاهده میشه ، جوابش هم همون توضیحاتی بود که ارائه کردم. و بسته به شرایط هر تابع ممکنه دلیل این هشدار فرق کنه ولی همیشه منظورش اینه که مسیری که الگوریتم برنامه طی می کنه ممکن همیشه به جواب ختم نشه و در بعضی حالت ها خطا بده که مترجم یا اصلاحگر ویژوال استودیو اینو تشخیص میده و به صورت Warning به برنامه نویس اطلاع میده .
متشکرم

While .Read
If .GetValue(2) <> Nothing Then Create_Years = .GetValue(2) + 1
End While

فرید نجفلو
جمعه 04 فروردین 1391, 13:32 عصر
در ضمن مهم اینکه به جواب درست برسیم و نه اینکه مشکل رو به صورت موقت حل کنیم.

ما کی جواب موقت دادهیم؟!
به نظر شما اینا جواب مقت بودن؟:

مقدار بازگشتی رو Integer تعریف کردی اما چیزی برنگردوندی.


شما از روش VB6 استفاده کردید!


1
Create_Years = .GetValue(2) + 1




و درستش اینه:
[VBReturn .GetValue(2) + 1[/VB]

واینکه اگه تو حلقه مقداری برگشت نداید (هیچ شرط درستی و جود نداشت) باید بعد از End With یه مقدار Integer برگردونید مثلا 1

در مورد درست کارکردن کل کدتون من شک دارم(فقط شک:چشمک:)!