PDA

View Full Version : حرفه ای: مشکل در برگرداندن نوع UniqueIdentifier



h.alizadeh
چهارشنبه 25 شهریور 1388, 18:24 عصر
سلام،
من در بانکم فیلدی دارم از نوع UniqueIdentifier.
حالا من میخوام در برنامه م مقدار این فیلد رو برگردونم و نمایش بدم.

من یک spنوشتم که درست کار می کنه(فکر کنم.) و یک تابع در کلاس نوشتم اینطوری:


Public Function getReceipt(ByVal shopId As Int64) As Guid


Dim Cmd As New SqlCommand("getReceipt", Cnn)
Cmd.CommandType = CommandType.StoredProcedure

Dim paramretrun As SqlParameter

Cmd.Parameters.Add("shopId", SqlDbType.BigInt)
Cmd.Parameters("shopId").Value = shopId

paramretrun = Cmd.Parameters.Add("@receipt", SqlDbType.UniqueIdentifier)
paramretrun.Direction = ParameterDirection.Output

Try
Cnn.Open()
Cmd.ExecuteNonQuery()

'If Not IsDBNull(Cmd.Parameters("@receipt").Value) Then
Dim r As New Guid(Cmd.Parameters("@receipt").Value.ToString)
'End If

Return r
Catch ex As SqlException
Throw ex
Catch ex As Exception
Throw ex
Finally
If (Cnn.State <> ConnectionState.Closed) Then Cnn.Close()
End Try
End Function


و در فایلaspx.vbاینطوری فراخوانی کردم:


Dim s As Guid = shop.getReceipt(r)
CType(Wizard1.FindControl("lblreceipt"), Label).Text += "<br/>رسید شما: " + s.ToString


ولی خطا میده
Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).


یا اگه در کلاس اون قسمت رو اینطوری کنم


If Not IsDBNull(Cmd.Parameters("@receipt").Value) Then
r = Cmd.Parameters("@receipt").Value.ToString

End If
یعنی اینکه اگه مقدار برگشتی نال نبود .
خروجی این میشه:
رسید شما: 00000000-0000-0000-0000-000000000000

که درست نیست.

لطفاً راهنمایی م کنید .
ممنون.

h.alizadeh
چهارشنبه 25 شهریور 1388, 20:04 عصر
در ضمن کاربرد این در اینه که من یه فروشگاه درست دارم می کنم که وقتی خرید تکمیل میشه و در بانک می ریزه .فیلدی بعنوان رسیدخرید از نوع UniqueIdentifier تعیین کردم و مقدار اولیه newid() رو در بانک بهش دادم که خودش یک کدرهگیری به اصطلاح درست کنه.
حال اینو میخوام بعنوان کدرهگیری بدمش به کاربر ولی مشکل بالا رو پیدا کردم.:(
اینم از کدsp:


ALTER PROCEDURE dbo.getReceipt
@shopId bigint,
@receipt uniqueidentifier OUTPUT

AS
select @receipt=receipt from Shopping where shopId=@shopId


RETURN

hdv212
پنج شنبه 26 شهریور 1388, 02:10 صبح
اول از همه مطمئن بشید که این پارامتر مقداری رو بر میگردونه. برای اینکار یک BreakPoint در خط مقدار دهی به متغیر r قرار بدید تا در اون زمان برنامه متوقف بشه و شما بتونید مقدار اون پارامتر رو بررسی کنید.

Behrouz_Rad
پنج شنبه 26 شهریور 1388, 10:19 صبح
پارامتر(های) سازنده ی GUID، یک عبارت GUID رو می گیر(ه/ن). اما تو قصد داری یک عدد صحیح رو بهش پاس بدی. به همین دلیل خطای صحیح نبودن فرمت ورودی رو دریافت می کنی. خود عبارت GUID رو به عنوان کد رهگیری به کاربر پاس بده.

موفق باشید.

h.alizadeh
جمعه 27 شهریور 1388, 00:19 صبح
ممنونم ازتون.

break pointگذاشتم.
مقدار (system.dbnull)nullرو در متغیرrقرار میده .

spرو تغییر دادم و با مقدارreturn خروجی رو برگردونم و نوع خروجی رو varcharگذاشتم. این دفعه breakpoint کردم مقدارr از نوع integerبود و با مقدار 0....


خود عبارت GUID رو به عنوان کد رهگیری به کاربر پاس بده.

چطوری خود عبارت GUIDرو بدست بیارم.

من مقدار خروجی رو درsp، همین @receipt uniqueidentifier OUTPUT تعیین کردم!
ولی ...
وقتی هم با returnمییام در spخروجی بدم خروجی رو از نوعvarcharمیدم ولی موقع برگشت به integerو مقدار 0 تبدیل می کنه!!!!!

من مقدارکدرهگیر م که guid هست توی بانکمه و میخوام این مقدار رو از جدولم بخونم....
آیا راهی است که مقدار uniqueidentifier رو از جدول برگردونم ؟؟؟

اگه راهی نیست پس باید guidرو از طریق کد برنامه م تولید کنم و به کاربر نشون بدم.
چون الان که اینطوره که در بانک sql2005موقع ثبت رکورد خودش مقدار newid()میکنه.(پیش فرض توی بانک گفتم که بکنه.)

hdv212
جمعه 27 شهریور 1388, 00:36 صبح
1. من به این قسمت کد شما مشکوک هستم :

paramretrun = Cmd.Parameters.Add("@receipt", SqlDbType.UniqueIdentifier)
paramretrun.Direction = ParameterDirection.Output

سعی کنید مانند shopId مقدار دهی کنید.

2. بعدش هم مطمئن بشید که Procedure شما اون مقدار مورد نظر رو بر میگردونه، این کد رو در Management Studio اجرا کنید و ببینید آیا درست کار میکنه یا نه (مقداری که انتظارش رو دارید بر میگردونه یا نه)


declare @x uniqueidentifier
exec dbo.getReceipt 1,@x output
select @x

h.alizadeh
جمعه 27 شهریور 1388, 03:10 صبح
سعی کنید مانند shopId مقدار دهی کنید.


متوجه منظورتون نشدم خوب!
متغیرreceiptیک متغیر خروجی هست ولیshpoIdورودی.
برای برگردندان مقداراز spدوراهه:outputوreturn

من از هر دو راه رفتم.
البته با return چون توی spاجازه ی اینکه مقدار UniqueIdentifier رو برگردونیم نمیده من نوع خروجیش رو varchar(50)گذاشتم.
اینم از سورس spبا return:


ALTER PROCEDURE dbo.getReceipt2
@shopId bigint
AS
declare @receipt varchar(50)

select @receipt=receipt from Shopping where shopId=@shopId
RETURN @receipt


در برنامه:


Public Function getReceipt2(ByVal shopId As Int64) As String

Dim Cmd As New SqlCommand("getReceipt2", Cnn)
Cmd.CommandType = CommandType.StoredProcedure
Dim paramretrun As SqlParameter
Cmd.Parameters.Add("shopId", SqlDbType.BigInt)
Cmd.Parameters("shopId").Value = shopId
paramretrun = Cmd.Parameters.Add("@receipt", SqlDbType.VarChar, 50)
paramretrun.Direction = ParameterDirection.ReturnValue
'Specified cast is not valid.
Try
Cnn.Open()
Cmd.ExecuteNonQuery()

Dim r As String
' Output Parameter
If Not IsDBNull(Cmd.Parameters("@receipt").Value) Then
r = Cmd.Parameters("@receipt").Value.ToString
' Else
End If
Return r
Catch ex As SqlException
Throw ex
Catch ex As Exception
Throw ex
Finally
If (Cnn.State <> ConnectionState.Closed) Then Cnn.Close()
End Try
End Function


ولی بازم نمیشه.

. بعدش هم مطمئن بشید که Procedure شما اون مقدار مورد نظر رو بر میگردونه، این کد رو در Management Studio اجرا کنید و ببینید آیا درست کار میکنه یا نه (مقداری که انتظارش رو دارید بر میگردونه یا نه)

ممنونم ازتون spاولی مقدار موردنظر را بر می گردونه. :)
spدومی که با returnنوشتم نه خطا میده:

Conversion failed when converting the varchar value '565EE2C3-A635-4D9D-985E-D280D4A681C5' to data type int.


ببینید من فکر می کنم مشکل اینجاست که یک چیزی این وسط خروجی رو به int می خواد تبدیل کنه حالا این چیه نمی دونم ...!

اگه از spهست پس چرا اونی که با outputنوشتم درسته توی خروجیش در sql
اگه از برنامه م هست پس چرا دومی در sqlخطا میده و تلاش داره به int تبدیل کنه...!

Behrouz_Rad
جمعه 27 شهریور 1388, 10:00 صبح
خیلی قضیه رو پیچیده کردی. یک فیلد NVARCHAR به جدولت اضافه کن و همون لحظه که قصد داری داده رو به جدول اضافه کنی، یک عبارت GUID تولید و همراه با مشخصات خرید در فیلد مربوطه ذخیره کن:


string guid = Guid.NewGuid().ToString();

SP ای که برای Insert استفاده می کنی، در صورت موفقیت در ثبت کالا، عبارت GUID ای رو که به عنوان ورودی پذیرفته، به عنوان خروجی برگشت میده.

مشکل شما، در نحوه ی نادرست استفاده از کلاس GUID هست.

موفق باشید.

h.alizadeh
جمعه 27 شهریور 1388, 16:23 عصر
ممنونم کاری که گفتید رو کردم فقط:

SP ای که برای Insert استفاده می کنی، در صورت موفقیت در ثبت کالا، عبارت GUID ای رو که به عنوان ورودی پذیرفته، به عنوان خروجی برگشت میده.

چطوری این مقدار رو بدست بیارم؟
اینجوری کردم:
ss = cmd.ExecuteScalar()
مقدار nothingبرگردوند.

با تابع مثل تابع getReceiptو تغییر نوع به varcharهم نتونستم مقدار کدرهگیری رو از جدول بدست بیارم...
مگه قبل همون کدرهگیری رو که توی برنامه درست کردم رو نمایش بدم!

یعنی این
string guid = Guid.NewGuid().ToString();
guidرو به کاربر نشون بدم.

Behrouz_Rad
جمعه 27 شهریور 1388, 23:25 عصر
در SP ی Insert، یک پارامتر از نوع OUTPUT تعریف کن. مقدارش همون مقداری هست که به عنوان ورودی، عبارت GUID رو به SP پاس میدی.
مثلاً اگر یک پارامتر به نام guidInput داری، یک پارامتر هم به عنوان guidOutput داری که از نوع OUTPUT هست و مقدارش همون مقدار guidInput خواهد بود.

موفق باشید.

h.alizadeh
شنبه 28 شهریور 1388, 17:50 عصر
ممنونم به روش پست 10 کردم؛جواب داد..

(ولی جالب بود اینکه چرا getReceiptبا اینکه در sqlدرست کار میکنه اما در ASP.NETبهم nothingبده!
البته چراشو نگرفتم!)