PDA

View Full Version : سوال: دریافت مقدار ID اتوماتیک بعد از Insert



aliblue
پنج شنبه 13 مهر 1391, 11:59 صبح
سلام.من توی کد برنامه ام از طریق یک StoredProcedure پارامترهایی رو اضافه میکنم و StoredProcedure عمل Insert رو انجام میده که کلید اصلی آن به طور اتوماتیک توسط sqlserver ایجاد میشه.
cmd.ExecuteNonQuery();
حالا من میخوام به مقدار کلید اصلی دسترسی داشته باشم تا بتونم بر اساس اون،اطلاعاتی رو به جدول های دیگه ام اضافه کنم.چه تغییراتی باید توی StoredProcedure و چه تغییری توی کد برنامه باید بدم؟

amirzandi
پنج شنبه 13 مهر 1391, 12:11 عصر
فرمان Insert را با پارامتر Scope_Identity() انجام دهید... اگر سرچ کنید مثال روی این پارامتر زیاد هست

aliblue
پنج شنبه 13 مهر 1391, 12:56 عصر
با تشکر.ولی اینترنت من هنوز با گوگل مشکل داره.میشه بیشتر توضیح بدین؟

amirzandi
پنج شنبه 13 مهر 1391, 13:04 عصر
INSERT INTO Billing_Fish (price, shomare, date, type, tID) VALUES (@price, @shom, @date, @type, @tid); SELECT CAST (scope_identity() AS INT);

id = cmd.ExecuteScalar()

fakhravari
پنج شنبه 13 مهر 1391, 15:37 عصر
از SP
CREATE PROCEDURE [dbo].[Management_UserRoles_Insert]
(
@ID bigint OUTPUT,
@UserName nvarchar (30),
@RoleID int
)
AS
INSERT INTO Management_UserRoles
([UserName], [RoleID])
VALUES
(@UserName, @RoleID)
SET @ID= @@IDENTITY
------------------------------------------------------------------------
command.Parameters.Add("@ID", SqlDbType.BigInt).Direction = ParameterDirection.Output;
command.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = UserName;
command.Parameters.Add("@RoleID", SqlDbType.Int).Value = RoleID;
command.ExecuteNonQuery();
RecordAffected = (Int64)command.Parameters["@ID"].Value;

aliblue
جمعه 14 مهر 1391, 08:55 صبح
ممنون از پاسختون.من از روش:

INSERT INTO Billing_Fish (price, shomare, date, type, tID) VALUES (@price, @shom, @date, @type, @tid); SELECT CAST (scope_identity() AS INT);

id = cmd.ExecuteScalar()
استفاده کردم و جواب هم داد.میشه تفاوتشو بگین در چیه؟

amirzandi
جمعه 14 مهر 1391, 09:05 صبح
تفاوتش با چی؟

aliblue
جمعه 14 مهر 1391, 09:12 صبح
تفاوت همون روشی که شما گفتی،یعنی scope_identity() و cmd.ExecuteScalar با روشی که جناب فخراوری فرمودن یعنی @@IDENTITY و command.ExecuteNonQuery();

hobab-theme
جمعه 14 مهر 1391, 11:51 صبح
تفاوت خاصی ندارن. یکی هستن فقط همون طور که میبینید روش آقای فخراوری یکم کدنویسی بیشتری نیاز داره.

aliblue
سه شنبه 18 مهر 1391, 10:58 صبح
من به این صورت storedprocedure رو ساختم:
CREATE procedure procname(@user nvarchar(20))
as
begin
insert into jadval(username) values(@user);

SELECT CAST (scope_identity() AS INT);


end
GO

و روی sqlserver کامپیوتر خودم جواب داد.ولی وقتی روی هاستم میخوام این StoredProcedure رو بسازم،خطای زیر رو میده:
Msg 1046, Level 15, State 1, Procedure procname, Line 5
Subqueries are not allowed in this context. Only scalar expressions are allowed.
از روش SET @ID= @@IDENTITY هم استفاده کردم همین خطا رو داد.
چیکار کنم؟برای اولین بار عجله دارم.

amirzandi
سه شنبه 18 مهر 1391, 11:15 صبح
cmd.execureScalar() می زنین؟

hypersys
سه شنبه 18 مهر 1391, 11:18 صبح
سلام.من توی کد برنامه ام از طریق یک StoredProcedure پارامترهایی رو اضافه میکنم و StoredProcedure عمل Insert رو انجام میده که کلید اصلی آن به طور اتوماتیک توسط sqlserver ایجاد میشه.
cmd.ExecuteNonQuery();
حالا من میخوام به مقدار کلید اصلی دسترسی داشته باشم تا بتونم بر اساس اون،اطلاعاتی رو به جدول های دیگه ام اضافه کنم.چه تغییراتی باید توی StoredProcedure و چه تغییری توی کد برنامه باید بدم؟


جای نقطه ها دستور Insert را قرار بده

string ID=(cmd.ExecuteScalar("insert ... ; Select @@Identity;")).ToString();

aliblue
سه شنبه 18 مهر 1391, 11:20 صبح
دوست عزیز من میگم وقتی روی سرور میخوام تازه StoredProcedure رو بسازم،SqlServer این خطا رو میده.
بله قبلا روی کامپیوتر خودم ساختم و cmd.execureScalar() هم زدم و کار هم کرد و مشکلی نداشت.
الان روی سرور موقع ساخت StoredProcedure ایراد میگیره.