PDA

View Full Version : اشکال این کد چیه؟



farhadyoosefi
یک شنبه 06 اسفند 1385, 20:35 عصر
سلام.همگی خسته نباشید, لطفا به من بگید اشکال این کد چیه؟
من یه table به نام person دارم که صفت id , primary key این table هست و identity اون yes شده یعنی کلید اصلیش بدون دخالت کاربر از عدد 9 یکی یکی زیاد میشه(seed از 9 تعریف شده)
حالا من می خوام تو این table , search کنم.برای این کارم , باید id رو پیدا کنم.
برای این کار من یه procedureبه نام sreachpersonid نوشتم که کدش به این صورته:


CREATE procedure sreachpersonid
@type int,@name nvarchar(30) , @identitycode float , @nationalcode float , @mobilephon bigint , @officephon bigint , @officeaddress nvarchar(200) , @description nvarchar(200),@id int output
as
select id from person
where
type=@type or name=@name or identitycode=@identitycode or nationalcode=@nationalcode or mobilephon=@mobilephon or officephon=@officephon or officeaddress like '%@officeaddress%' or description like '%@description%'

select @id=@@Identity
GO

و در پروژهی windows applicatin این کدرو زدم:


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dbcommand As New SqlCommand
Dim sqlConnectionString As String
Dim Cn As SqlConnection
sqlConnectionString = "Database=lands;Data Source=(Local);Integrated Security=SSPI"
Dim drdUser As SqlDataReader
Dim prm As SqlParameter
Try
Cn.Open()
dbcommand.Connection = Cn
dbcommand.CommandText = "sreachpersonid"
dbcommand.CommandType = CommandType.StoredProcedure
(( dbcommand.Parameters.Add(New SqlParameter("@type", 0
(( dbcommand.Parameters.Add(New SqlParameter("@name", txtname.Text
((dbcommand.Parameters.Add(New SqlParameter("@identitycode", txtidentitycode.Text
(( dbcommand.Parameters.Add(New SqlParameter("@nationalcode", txtnationalcode.Text
(( dbcommand.Parameters.Add(New SqlParameter("@mobilephon ", txtmobilephon.Text
(( dbcommand.Parameters.Add(New SqlParameter("@officephon ", txtofficephon.Text
(( dbcommand.Parameters.Add(New SqlParameter("@officeaddress ", txtofficeaddress.Text
(( dbcommand.Parameters.Add(New SqlParameter("@description ", txtdescription.Text
(( prm = dbcommand.Parameters.Add(New SqlParameter("@id", SqlDbType.Int
prm.Direction = ParameterDirection.Output
drdUser = dbcommand.ExecuteReader
If drdUser.Read() Then
TextBox1.Text = drdUser("id").ToString
End If
() drdUser.Close
() dbcommand.Cancel
() Cn.Close
Catch sqlException As System.Data.SqlClient.SqlException
(() MsgBox(sqlException.ToString
Catch exception As System.Exception
(() MsgBox(exception.ToString
End Try
End Sub




حالا وقتی که پروژه رو run می کنم در هر حالتی id فیلد اول یعنی 9 رو میده .خواهشن کمکم کنید تا اشکال کارم رو بفهمم
ممنون.

Alireza_Salehi
یک شنبه 06 اسفند 1385, 20:54 عصر
خوب وقتی دو تا دستور SELECT تو یک Procedure بنویسی فقط نتیجه آخری رو برمیگردونه!

farhadyoosefi
یک شنبه 06 اسفند 1385, 22:13 عصر
SELECT دوم به خاطر مقدار برگشتی ازPROCEDURE .شما راه دیگه ای پسشنهاد می کنید؟

hamed_bostan
دوشنبه 07 اسفند 1385, 00:11 صبح
میشه به من بگین این خط کد یعنی چی؟




prm.Direction = ParameterDirection.Output

farhadyoosefi
دوشنبه 07 اسفند 1385, 00:39 صبح
داره می گه که اون پارامتر (خط بالایی-یعنی id@), مقدار برگشتی از procedure رو داره

bidad
دوشنبه 07 اسفند 1385, 01:03 صبح
ببین اول این قسمت رو از SP حذف کن

select @id=@@Identity

بعد اینکه این query که تو نوشتی خب احتمالا همه سطر های برنامت رو بر میگردونه آخه تو همش از OR استفاده کردی!! البته خب من نیمدونم می خوای چیکار کنی حتما درسته دیگه

ضمناتو اصلا کجا connection رو تعریف میکنی؟؟
من نمیبینم جایی string connection رو به connection نسبت داده باشی!!
زدی :


Dim sqlConnectionString As String
Dim Cn As SqlConnection
sqlConnectionString = "Database=lands;Data Source=(Local);Integrated Security=SSPI"
Dim drdUser As SqlDataReader
Dim prm As SqlParameter
Try
Cn.Open()

یعنی sqlConnectionString بلا استفاده مونده!
راستی ممکنه چند تا row بر گردونه یه فکری هم به حال اون بکن

farhadyoosefi
دوشنبه 07 اسفند 1385, 09:54 صبح
Identity @@ یه تابع سیستمی خود sql که مقدار پارامتر خروجی رو داخل id @ قرار میده.در مورد connection هم اون تو form_load اجرا می شه , اصلا من مشکلی با برقراری ارتباط ندارم.identity@@ اگه حذف کنم که دیگه چیزی procedure به عنوان خروجی چیزی بر نمی گردونه.
بابا اینجا با پارامترهای خروجی هیچ کسی کار نکرده؟؟؟؟
پس شما مقدار برگشتی از procedure رو چطوری میگیرین؟

linux
دوشنبه 07 اسفند 1385, 10:22 صبح
Identity @@ یه تابع سیستمی خود sql که مقدار پارامتر خروجی رو داخل id @ قرار میده.در مورد connection هم اون تو form_load اجرا می شه , اصلا من مشکلی با برقراری ارتباط ندارم.identity@@ اگه حذف کنم که دیگه چیزی procedure به عنوان خروجی چیزی بر نمی گردونه.
بابا اینجا با پارامترهای خروجی هیچ کسی کار نکرده؟؟؟؟
پس شما مقدار برگشتی از procedure رو چطوری میگیرین؟
ببین شما می خواهی بر یک اساسی در جدول جستجو کنی خوب! ممکن خروجی شما 1 تا n تا رکورد باشه خوب من نمی فهمم اینجا @@identity را برای چی می خواهی؟!این مقدار تا وقتی که در جدول چیزی اضافه نکنی برابر آخرین مقدار هست که به ID نسبت داده شده!
با این OR هایی هم که شما گذاشتید احتمالا همیشه بیشتر از 1 رکورد برگشت داشته باشید.
ولی با کدی که نوشتید TextBox1.Text = drdUser("id").ToString فکر کنم انتظار دارید که فقط یک رکورد به عنوان جواب بگیرید
بجای اینکه توی تکست باکس بریزی بهتر هست که توی یک لیست باکس بریزی تا ببینی چندتا برگشت داری و آیدنتیتی را هم حذف کن این دستور وقتی به کار می آید که در یک جدولی اینزرت می کنی و می آخی شما رکوردی که بوجود آمده را ببینی

farhadyoosefi
دوشنبه 07 اسفند 1385, 12:55 عصر
سلام
مشکل من حل شد
با استفاده ازexec به جای select دوم
از دوستانی که به خاطر من وقت گذاشتن خیلی خیلی ممنونم