PDA

View Full Version : انتقال برخی رکورد های یک جدول به جدول دیگر در پروسیجر



Ishtar_4552
شنبه 09 مهر 1390, 09:05 صبح
با سلام
Table-valuedمن در برنامه ام با استفاده از
چند رکورد را همزمان به دیتابیسم ارسال کردم،و در همان لحظه هم نیاز دارم که این رکورد های ثبت شده در جدول اولم را در یک جدول دوم هم ثبت کنم و لازمه آیدی هایی که به طور اتوماتیک در جدول اول مقداردهی شده اند در جدول دوم هم به همراه سایر اطلاعاتشون ثبت بشن..
برای مثال من جدول اولم شامل فیلدهای زیر هست که همه این رکوردها همزمان به دیتابیس ارسال شده و در جدول ثبت شدن:


Table1
-------------------------------------
Id shift date
1 2 09/30/2011
2 1 10/01/2011
3 3 10/02/2011
4 1 10/03/2011و به محض اینکه در این جدول اطلاعات ثبت شد بعضی از این اطلاعات در جدول دیگری هم ثبت بشه..
یعنی جدول دوم من به این صورت باید باشه:


Table2
--------------------------------------
Id Table1_id date message
1 1 09/30/2011 message1
2 2 10/01/2011 message2
3 3 10/02/2011 message3
4 4 10/03/2011 message4
لازمه که حتمآ تاریخ و آیدی جدول اول در جدول دوم هم وجود داشته باشه ، آیا میشه با استفاده از یک حلقه که رکوردهای
جدول اول رو یک به یک پیمایش کنه و در جدول دوم ثبت بشه
اگه میشه چطور باید این کار را در اسکیوال انجام داد؟ اصلآ استفاده از یک حلقه درست هست یا خیر؟
پیشاپیش ممنونم از راهنماییتون

یوسف زالی
شنبه 09 مهر 1390, 11:27 صبح
سلام.
اگر درست متوجه شده باشم دارید یک جدول مستر دیتیل رو انتقال می دید.
اما راه ساده اش اینه که یک فیلد موقتی به مستر مقصد اضافه کنید و سریال اصلی اون رو در اون فیلد ذخیره کنید.
در دیتیل هم در هنگام ذخیره باید به جای فیلد پدر مقدار اون فیلد رو بگذارید:
insert into Master select F1,F2,F3,MySerial from TBL1
insert into Detail select (select MasterSerial from Master where AddedField = FatherSN),F1,F2,..., from TBL2

امیدوارم خوب توضیح داده باشم.

sajjadrazmi
شنبه 09 مهر 1390, 12:36 عصر
سلام

می تونید از تریگر برای انجام این کار استفاده کنید. ولی اگه تعداد رکوردهای جدولتون بره بالا، ممکنه سرعت اجرا کند بشه.

یوسف زالی
شنبه 09 مهر 1390, 12:55 عصر
با روشی که ذکر شد فقط دو بار insert انجام میشه.
حلقه نداره . کرسر هم نداره.
فکر می کنم راحت ترین راه باشه.

Esmail Solhkhah
شنبه 09 مهر 1390, 20:43 عصر
با سلام
Table-valuedمن در برنامه ام با استفاده از
چند رکورد را همزمان به دیتابیسم ارسال کردم،و در همان لحظه هم نیاز دارم که این رکورد های ثبت شده در جدول اولم را در یک جدول دوم هم ثبت کنم و لازمه آیدی هایی که به طور اتوماتیک در جدول اول مقداردهی شده اند در جدول دوم هم به همراه سایر اطلاعاتشون ثبت بشن..سلام دوست عزیز

چون جزئیات رو نذاشتید بنده فرضهای زیر رو گرفتم

جدول اول شما :

CREATE TABLE [dbo].[Table1](
[Id] [int] NOT NULL,
[Shift] [int] NOT NULL,
[Date] [varchar](10) NOT NULL,
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

جدول دوم شما

CREATE TABLE [dbo].[Table2](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Table1Id] [int] NOT NULL,
[Date] [varchar](10) NOT NULL,
[Message] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

تایپ Table Valued شما

CREATE TYPE [dbo].[MyType] AS TABLE(
[Id] [int] NOT NULL,
[Shift] [int] NOT NULL,
[Date] [varchar](10) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

استورد پروسیجر شما

ALTER PROCEDURE [dbo].[uspInsertTable2]
(
@MyTable MyType READONLY
)
AS
INSERT INTO Table2(Table1Id, Date,Message)
SELECT Id as Table1Id ,Date, 'Message' as Message FROM @MyTable

و اما کد #C لازمه

private DataTable MyData()
{

DataTable tb = new DataTable();

DataColumn col = new DataColumn("Id", typeof(int));

tb.Columns.Add(col);

col = new DataColumn("Shift", typeof(int));

tb.Columns.Add(col);

col = new DataColumn("Date", typeof(string));

tb.Columns.Add(col);



for (int i = 0; i < 20; i++)
{

DataRow row = tb.NewRow();

row["Id"] = i;

row["Shift"] = i;

row["Date"] = "1390/07/08";

tb.Rows.Add(row);

}

return tb;

}


private void btnInsert_Click(object sender, EventArgs e)
{
string ConnectionString = @"Data Source = .\sqlexpress;Initial CAtalog = Ishtar;Integrated Security = True";

using (SqlConnection con = new SqlConnection(ConnectionString))
{

try
{
SqlCommand cmd = new SqlCommand("uspInsertTable2", con);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.AddWithValue("@MyTable", MyData());

con.Open();

cmd.ExecuteNonQuery();

MessageBox.Show("Insert Completed.");

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if (con.State == ConnectionState.Open)
con.Close();
}

}
}

موفق باشید.