PDA

View Full Version : سوال: درج مقدار در فیلد کلید خارج به صورت همزمان



majid.mp
پنج شنبه 11 خرداد 1391, 18:13 عصر
با عرض سلام خدمت دوستان
دوستان من دوجدول دارم که در یکی از آنها موضوع پیغام و ...ا و در جدول دیگر متن پیغام را نگهداری میکنم بین این دو جدول یک ارتباط 1 به چند وجود دارد طبق تصویرزیر:
87712

حال مشکلی که هم اکنون با آن برخورد نموده ام به این شکل میباشدکه میخواهم به صورت هم زمان یک رکورد در جدول اول که موضوع پیغام در آن نگهداری میشود و یک رکورد دیگر هم به جدول دوم که متن پیغام در آن نگهداری میشود اضافه کنم به انضمام این که مقدار فیلد کلید اصلی در جدول اول در مقدار فیلد کلید خارجی در جدول دوم درج شود؟

fakhravari
پنج شنبه 11 خرداد 1391, 19:29 عصر
شما باید از برگشت ID استفاده کنید.
به این SP دقت کنید

create PROCEDURE NewCustomerInsert
(
@ID smallint OUTPUT,
@PersonID smallint,
@CustomerKindID tinyint = NULL
)
AS
INSERT INTO Customers
(PersonID, CustomerKindID)
VALUES (@PersonID,@CustomerKindID)

SET @ID = @@IDENTITY


public short EmployInsert()
{
int Affect = 0;

SqlConnection con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=test;Integrated Security=True;Pooling=False");
SqlCommand Command = new SqlCommand("NewCustomerInsert", con);
Command.CommandType = CommandType.StoredProcedure;
Command.Parameters.AddWithValue("@PersonID", SqlDbType.SmallInt).Value = 80;
Command.Parameters.AddWithValue("@CustomerKindID", SqlDbType.SmallInt).Value = 90;

Command.Parameters.AddWithValue("@ID", SqlDbType.SmallInt).Direction = ParameterDirection.Output;

con.Open();
Command.ExecuteNonQuery();
Affect = (int)Command.Parameters["@ID"].Value;
con.Close();
return Convert.ToInt16(Affect);
}
بعد از ثبت رکورد ID اون برمیگرده که میتوانید استفاده کنید

majid.mp
شنبه 13 خرداد 1391, 10:13 صبح
باسلام
ازپاسخ شماسپاسگزارم
بنده SP روبه صورت زیر نوشتم اما SP ساخته نمیشود،پیغام خطا میدهد.
ALTER PROCEDURE [dbo].[Communication_System]
(@Link_ID int OUTPUT,@LinkTitle nvarchar(50))
as
insert into tbl_Links(LinkTitle)values(@LinkTitle)
SET @Link_ID=@@IDENTITY

پیغام خطا:
Invalid object name 'dbo.Communication_System'

لطفاً راهنمایی نمایید؟
با تشکر.

Fartaj
شنبه 13 خرداد 1391, 10:50 صبح
سلام

به جای ALTER باید CREATE بزارید

majid.mp
شنبه 13 خرداد 1391, 11:00 صبح
با سلام
از پاسخ شما سپاسگزارم
SP مذکور قرار است ID رکورد درج شده را برگرداند به همین جهت با تغییر ALTER به Create خروجی نمیدهد.

Fartaj
شنبه 13 خرداد 1391, 11:11 صبح
دوست عزیز شما دیتابیس رو مشخص کردید ؟؟؟

sp استاندارد :



USE [mydb]
GO
/****** Object: StoredProcedure [dbo].[Communication_System] Script Date: 06/02/2012 11:15:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[Communication_System]
(@Link_ID int OUTPUT,@LinkTitle nvarchar(50))
as
insert into tbl_Links(LinkTitle)values(@LinkTitle)
SET @Link_ID=@@IDENTITY

majid.mp
شنبه 13 خرداد 1391, 11:21 صبح
از پاسخ دوباره شما سپاسگزارم
SP به این صورته :
USE [Communication_System]
GO
/****** Object: StoredProcedure [dbo].[Communication_System] Script Date: 06/02/2012 11:22:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Communication_System]
(@Link_ID int OUTPUT,@LinkTitle varchar(50))
AS
insert into tbl_Links(LinkTitle)values(@LinkTitle)
SET @Link_ID=@@IDENTITY

aftabgarmabakhsh
شنبه 13 خرداد 1391, 12:21 عصر
البته دوست عزيز داخل پروسيجرتان حتما از transaction استفاده كنيد تا موضوع و متن پيغام با هم درج شوند و اگر وسط كار ، مشكلي پيش آمد، اينطوري نباشد كه موضوع پيغام ذخيره شه ولي متنش نه

majid.mp
شنبه 13 خرداد 1391, 14:05 عصر
البته دوست عزيز داخل پروسيجرتان حتما از transaction استفاده كنيد تا موضوع و متن پيغام با هم درج شوند و اگر وسط كار ، مشكلي پيش آمد، اينطوري نباشد كه
موضوع پيغام ذخيره شه ولي متنش نه
با سلام
از پاسخ شما سپاسگزارم
هنوز مشکل این SP حل نشده است!؟

fakhravari
شنبه 13 خرداد 1391, 15:13 عصر
شما مثل کد من اجرا کردید؟

majid.mp
شنبه 13 خرداد 1391, 15:37 عصر
شما مثل کد من اجرا کردید؟
با سلام
از پاسخ شما ممنونم
بله کدهای SP را دقیقاً مانند کدهای شما نوشتم ولی SP ساخته نمیشود و پیغام خطا میدهد
کدهای نوشته شده به صورت زیر میباشد:
ALTER PROCEDURE [dbo].[Communication_System]
(@Link_ID int OUTPUT,@LinkTitle nvarchar(50))
as
insert into tbl_Links(LinkTitle)values(@LinkTitle)
SET @Link_ID=@@IDENTITY

متن پیغام خطا:
Invalid object name 'dbo.Communication_System'
لطفاً راهنمایی بفرمایید که مشکل از کجاست ؟کلید واژه ALTER در ابتدای Procedure چه عملکردی دارد؟
با تشکر.

fakhravari
شنبه 13 خرداد 1391, 19:37 عصر
شما باید از Create استفاده کنید
ALTER برای زمان ویرایش SP
لیست SP هم ببینید
پست 2 اصلاح شد.

majid.mp
شنبه 20 خرداد 1391, 13:42 عصر
با سلام
دوستان مشکل را به صورت زیر رفع نمودم
1- ابتدا یک SP به صورت زیر تعریف نمایید:
Create procedure [dbo].[AddMsg](@Page_ID int output,@PageName varchar(20))
as
begin
insert into tbl_PageModules(PageName)values(@PageName)
set @Page_ID=SCOPE_IDENTITY()
end

بعد تابع را به صورت زیر تعریف میکنیم :
public void addmsg()
{
using (SqlConnection ConStr = new SqlConnection(ConfigurationManager.ConnectionStrin gs["ConString"].ConnectionString))
{

int intid;
using (SqlCommand cmdInsert = new SqlCommand("AddMsg", ConStr))
{
cmdInsert.CommandType = CommandType.StoredProcedure;
cmdInsert.Parameters.AddWithValue("@PageName", "تست ارسال پیغام");
cmdInsert.Parameters.Add("@Page_ID", SqlDbType.Int, 0, "Page_ID");
cmdInsert.Parameters["@Page_ID"].Direction = ParameterDirection.Output;
ConStr.Open();
cmdInsert.ExecuteNonQuery();
intid = (int)cmdInsert.Parameters["@Page_ID"].Value;
ConStr.Close();
lbl_SendStatus.Text = intid.ToString();
}
}
}
کار تمام است ، حال بعد از درج رکورد مقدار ID برگشت داده میشود.
در آخر از تمامی دوستانی که به هر نحوی بندرو راهنمایی نمودند سپاسگزارم.

fakhravari
چهارشنبه 24 خرداد 1391, 14:50 عصر
پست 2 ویرایش شد . با جواب تکمیلی

حامد مصافی
یک شنبه 08 مرداد 1391, 21:40 عصر
@@identity آخرین identity دیتابیس را بر می‌گرداند. ممکن است این مقدار اشتباهاً با identity یک کانکشن دیگر جایگزین شود (بسیار بعید) اما بهتر است از تابع scope_identity() که آخرین identity کانکشن شما را بر می‌گرداند استفاده کنید.