PDA

View Full Version : دستور insert در دو جدول



angel farahani
سه شنبه 22 بهمن 1392, 18:47 عصر
با سلام

من میخوام با store Procedure عمل Insert رو روی دو جدولم انجام بدم . و میخوام این فیلدهایی که مشخص کردم ، مقدار یکسان در هر دو جدول ذخیره کند .
و ما بقی فیلدهای جدول مقدارهای مربوط به خودشان را می گیرد . لطفا راهنماییم کنید که چطور با store procedure میتونم بنویسم ؟


http://barnamenevis.org/asset.php?fid=110053&uid=319742&d=1392133588

http://barnamenevis.org/asset.php?fid=110052&uid=319742&d=1392133586


ممنونم

espootin
سه شنبه 22 بهمن 1392, 22:03 عصر
با سلام.

برای هر ستون یک پارامتر مشخص کنید بجز ستون هایی که مشابه هستند و مقدار یکسانی می گیرند.
سپس دو عمل insert در Stored Procedure قرار دهید.

یک مثال:


create procedure procName
@param1 int,
@param2 nvarchar(50),
@param3 int
as

INSERT INTO [TableName1]
([col1]
,[col2])
VALUES
(@param1
,@param2);

INSERT INTO [TableName2]
([col1]
,[col2])
VALUES
(@param1
,@param3);

angel farahani
سه شنبه 22 بهمن 1392, 22:15 عصر
واقعا ممنونم از اینکه جوابم رو دادین ، حتما کد را میزنم و نتیجه رو اعلام میکنم . سپاس

angel farahani
سه شنبه 22 بهمن 1392, 22:23 عصر
راستی من عمل درج رو میخوام با فرم detail view انجام بدم ، این امکانش هست دیگه ؟؟؟
مطابق با فیلدهای جدول من ، من اینطوری نوشتم ولی در دو دستور insert نمی دونم چه فیلدهایی رو بنویسم ؟ فیلدهای مشابه یا متفاوت ؟؟


create procedure shop
@shopname int,
@shoptypeid tinyint,
@description varchar(50),
@wifi bit,
@freeship bit,
@workhours varchar(30),
@stars tinyint,
@website varchar(30),
@parkingplace tinyint,
@economylevel tinyint,
@location geography,
@userfname varchar(30),
@userlname varchar(50),
@email varchar(50),
@cellphone varchar(15),
@username varchar(25),
@password varchar(15),
@usertypeid tinyint,

as

INSERT INTO [shop]
([col1]
,[col2])
VALUES
(@param1
,@param2);

INSERT INTO [users]
([col1]
,[col2])
VALUES
(@param1
,@param3);

espootin
چهارشنبه 23 بهمن 1392, 20:58 عصر
خیلی ساده، برای هر ستون جدول ، پارامترش رو بهش پاس بده. برای مثال اگر جدولت ۱۰ تا ستون داره، ۱۰ تا پارامتر بهش پاس بده و برای ستونی به نام Address ، بعنوان مثال پارامتر Address رو پاس بده.
دستور Insert نکته خاص و پیچیده ای ندارد.

اگه خطایی داشتین ، خطا را بگذارید تا بررسی کنیم.

angel farahani
جمعه 08 فروردین 1393, 23:12 عصر
با سلام ، دوستان من procedure درج در دو جدول را نوشتم ، ولی خطا داره ، میخوام در دو جدول فیلدهای خاص خودش درج بشه و هم یک فیلد shopid که در هر دو جدول درج بشه .

ممنون میشم راهنماییم کنید

117397

espootin
جمعه 08 فروردین 1393, 23:31 عصر
با سلام.

یک , که قبل از as گذاشتین، باعث بروز خطا میشه!

در کل syntax تون هم غلطه ، چرا که پارامترهایی توی درج استفاده کردین که بعنوان ورودی تعریف نشده!

مقادیری که می خواهید توی درج استفاده کنید بعنوان پارامتر ورودی تعریف کنید، درست خواهد شد.

angel farahani
جمعه 08 فروردین 1393, 23:40 عصر
پارامتر ورودی یعنی در کنار shopid ؟؟ ببخشید جای as کجاست ؟ قبل از Insert نیست ؟؟ من میخوام shopid به طور همزمان در هر دو جدول shop و users درج بشه

espootin
شنبه 09 فروردین 1393, 00:03 صبح
قبل از دستورات درج و کلمه کلید as پارامتر های ورودی قرار می گیرند که با کاراکتر , پارامتر ها از هم جدا می شوند.
این کار شدنی هست ولی باید دستور درجتون را اصلاح کنید، با توجه به مثال زیر اصلاح را انجام دهید:


Insert into shop (YourColumnName) values (@shopid);

angel farahani
شنبه 09 فروردین 1393, 00:43 صبح
سپاس از شما ، من کامل نوشتم ، ولی هر بار اجراش میکنم این خطا رو میده

: Msg 2714, Level 16, State 3, Procedure InsertUserandShop, Line 31There is already an object named 'InsertUserandShop' in the database.

دلیلش اینه که چندین بار اجرا کردم ؟

espootin
شنبه 09 فروردین 1393, 10:22 صبح
این خطا برای اینه که شما یک پروسیجر با این نام دارید، پس نمی توانید یک نمونه جدید با این نام بسازید. برای این خطا باید بجای کلمه کلیدی Create از Alter استفاده کنید. در صورتی که از Alter استفاده کنید، پروسیجر ویرایش خواهد شد.

angel farahani
شنبه 09 فروردین 1393, 10:41 صبح
پیام Command(s) completed successfully. را داد یعنی اگر بخواهم این پروسیجر را در asp.net استفاده کنم کلمه alter داشته باشه یا نه create باشه ؟ . من تا حالا procedure ننوشته بودم ممنونم که کمک کردید .

espootin
شنبه 09 فروردین 1393, 12:31 عصر
کلمات کلیدی Create و Alter برای ساخت و ویرایش پروسیجر بکار می رود. ولی برای فراخوانی پروسیجر باید به صورت زیر عمل کنید.

exec YourProcedureName param1,param2,...

angel farahani
پنج شنبه 14 فروردین 1393, 00:03 صبح
با سلام و سپاس از شما ، من میخوام فیلد shopid که اتونامبر هست ابتدا در جدول shop ثبت بشه و بعد همون مقدار در جدول users اضافه شه ، باید چطوری بنویسم ؟؟ دوستان منو راهنمایی کردن گفتن کدش اینطوریه ، اما برام

خطا می گیره ، یعنی فقط فیلد shopid باید جز پارامتر بعد insert نوشته بشه ؟ سپاس

DECLARE @ShopID int
INSERT INTO [users]
([userfname]
,[userlname],[email],[phone],[cellphone],[registerdate],[username],[password],[usertypeid],[shopid])
VALUES
(@userfname,@userlname,@email,@phone,@cellphone,GE TDATE(),@username,@password,2,@shopid);

SET @ShopID = SCOPE_IDENTITY()

INSERT INTO [shop]
([shopid],[shopname],[phone]
,[address],[shoptypeid],[registerdate],[description],[wifi],[freeship],[workhours],[stars],[website]
,[parkingplace],[economylevel])
VALUES
(@ShopID,@shopname,@phone,@address,@shoptypeid,GET DATE(),@description,@wifi,@freeship,@workhours,@st ars,@website,@parkingplace,@economylevel);


موقع اجرا در sql این خطا رو میگیره




Msg 137, Level 15, State 2, Line 7


Must declare the scalar variable "@userfname".


Msg 137, Level 15, State 2, Line 16


Must declare the scalar variable "@shopname

sohil_ww
پنج شنبه 14 فروردین 1393, 00:11 صبح
این متغیر ها رو تعریف کن
@userfname و @shopname
به این صورت
Declare @paramname type

espootin
پنج شنبه 14 فروردین 1393, 13:44 عصر
با سلام.
اینطور که من متوجه شدم، شما یه تعداد پارامتر را می خواهید از ورودی پروسیجر دریافت کنید و در جداول ذخیره کنید. اما متاسفانه این کار را انجام نداده اید، بنابراین بهتون خطا میده.
بجز ShopID ، بقیه موارد را به مانند زیر تعریف کنید تا خطاتون برطرف بشه.



create procedure procName
@param1 int,
@param2 nvarchar(50),
@param3 int,
.
.
.
as
[کد هاتون]





موفق باشید./

sohrabi.1384
جمعه 14 آذر 1393, 20:22 عصر
با سلام.
اینطور که من متوجه شدم، شما یه تعداد پارامتر را می خواهید از ورودی پروسیجر دریافت کنید و در جداول ذخیره کنید. اما متاسفانه این کار را انجام نداده اید، بنابراین بهتون خطا میده.
بجز ShopID ، بقیه موارد را به مانند زیر تعریف کنید تا خطاتون برطرف بشه.



create procedure procName
@param1 int,
@param2 nvarchar(50),
@param3 int,
.
.
.
as
[کد هاتون]





موفق باشید./

create procedure procName
@param1 int,
@param2 nvarchar(50),
@param3 int,
.
.
.
AS
BEGIN

[کد هاتون]

END

درسته دوست عزیز بالا هم BEGIN و END نداشت

sohrabi.1384
جمعه 14 آذر 1393, 20:28 عصر
CREATE PROC SP_INS_INPUT_PRODUCTION
@InvoiceID NVARCHAR(10),
@InvoiceDate SMALLDATETIME,
@CustomerID NVARCHAR(10),
@ProductID NVARCHAR(10),
@SupplyID NVARCHAR(10),
@SupplyNumber NVARCHAR(10),
@SupplyPrice NVARCHAR(10),
@PaymentID NVARCHAR(10),
@PaymentPrice NVARCHAR(10),
@PaymentDate SMALLDATETIME,
@PaymentIntroduce NVARCHAR(50)
AS
BEGIN


SET @InvoiceDate = GETDATE()
--1----------------------------------------Factor = Invoice

INSERT FACTOR(FACTOR_ID,MOSHTARI_ID,FACTOR_TARIKH) VALUES (@InvoiceID,@CustomerID,@InvoiceDate)

--2----------------------------------------AGHLAM = Supply

INSERT AGHLAM (KALA_ID,
FACTOR_ID,
AGHLAM_TEDAD,
AGHLAM_MABLAGH)
VALUES
(@ProductID,
(SELECT TOP 1 FACTOR_ID FROM FACTOR ORDER BY FACTOR_ID DESC),
@SupplyNumber,
@SupplyPrice)

---3---------------------------Payment = Pardcakht---------------------------

INSERT PARDAKHT(
--3--1----
FACTOR_ID,
--3--2----
MOSHTARI_ID,
--3--3----
PARDAKHT_ID,
--3--4----
PARDAKHT_MABLAGH,
--3--5----
PARDAKHT_SHARH,
--3-6-----
PARDAKHT_TARIKH
)
VALUES
(
--3--1----
(SELECT TOP 1 FACTOR_ID FROM FACTOR ORDER BY FACTOR_ID DESC),
--3--2----
(SELECT MOSHTARI_ID
FROM FACTOR
WHERE FACTOR_ID IN
(SELECT TOP 1 FACTOR_ID
FROM FACTOR ORDER BY FACTOR_ID DESC)),
--3--3----
@PaymentID,
--3--4----
@PaymentPrice,
--3--5----
@PaymentIntroduce,
--3--6----
@PaymentDate
)

END





public bool InputProductMethod(int InvoiceID, int CustomerID, int ProductID, int SupplyNumber,int SupplyPrice/*, int PaymentID, int PaymentPrice, string PaymentIntroduce*/)
{
SqlConnection CN = new SqlConnection(DBWrapper.ConnectionString);
try
{
SqlCommand CMD = new SqlCommand();
//CMD.CommandText = "Insert kala(Kala_ID,Kala_Code,Kala_Name,Kala_Size,kala_ra ng)Values (@KALA_ID,@KALA_CODE,@KALA_NAME,@KALA_SIZE,@KALA_R ANG)";
//
CMD.CommandText = "input";
CMD.CommandType = CommandType.StoredProcedure;
////
CMD.Parameters.AddWithValue("@InvoiceID", InvoiceID);
CMD.Parameters.AddWithValue("@CustomerID", CustomerID);
CMD.Parameters.AddWithValue("@ProductID", ProductID);
CMD.Parameters.AddWithValue("@SupplyNumber", SupplyNumber);
CMD.Parameters.AddWithValue("@SupplyPrice", SupplyPrice);
//CMD.Parameters.AddWithValue("@PaymentPrice", PaymentPrice);
//CMD.Parameters.AddWithValue("@PaymentIntroduce", PaymentIntroduce);
//CMD.Parameters.AddWithValue("@KALA_ID", PaymentID);

//
CMD.Connection = CN;//Connetion Vasl hastim ro bayad Assing konim
CN.Open();
// CMD.ExecuteNonQuery();
SqlDataReader Dr = CMD.ExecuteReader();
DT = new DataTable();
DT.Load(Dr);
if (DT.Rows.Count != 0)
{
return true;
}
else
{
return false;
}

}
catch (Exception EX)
{
ErrorMessage = EX.Message; return false;
}
finally
{
CN.Close();
}
}







علت عدم درج در چیست؟