PDA

View Full Version : سوال: ارسال دیتاتیبل به پروسیجر



mahdidabaghi
یک شنبه 19 خرداد 1392, 01:11 صبح
سلام
ایا میشه پارامتر ورودی واسه پروسیجر از نوع دیتاتیبل داشت؟
ممنون میشم راهنمایی بفرمایید

mahdidabaghi
یک شنبه 19 خرداد 1392, 10:26 صبح
تا جایی که میدونم نه.
تو کجا میخواهین استفاده کنینش!:لبخندساده:
من یه گرید دارم که با توجه به کارهایی که کاربر انجام میده تعداد رکوردهای اون متغیره و در یه ستون از این گرید هم تکست باکسی قرار دادم برای ورود قیمت.
حالا من قصد دارم بجای این که یکی یکی رکوردهای این گرید رو به پروسیجر بدم (با استفاده از حلقه ها)و یه جورایی پروسیجر N بار Excute بشه بیام و این رکوردها رو در یه دیتاتیبل بریزم و و دیتاتیبل رو به پروسیجر پاس بدم
نمیدونم این کار شدنیه یا نه؟؟؟؟؟؟؟؟؟:افسرده:

baroon2
یک شنبه 19 خرداد 1392, 10:43 صبح
سلام
اگه sql ورژن 2008 هست می شه .

DBName-Programmability-Types-UserDefined Table Types یه Type درست کنید
مثه :


CREATE TYPE [dbo].[WeekList] AS TABLE(
[WeekID] [int] NULL
)




بعد توی پروسیجرتون ورودی رو اینجوری تعریف کنید :


@WeekList AS dbo.WeekList READONLY

mahdidabaghi
یک شنبه 19 خرداد 1392, 10:49 صبح
سلام
اگه sql ورژن 2008 هست می شه .

DBName-Programmability-Types-UserDefined Table Types یه Type درست کنید
مثه :


CREATE TYPE [dbo].[WeekList] AS TABLE(
[WeekID] [int] NULL
)




بعد توی پروسیجرتون ورودی رو اینجوری تعریف کنید :


@WeekList AS dbo.WeekList READONLY

مهندس این تایپ رو کجا باید درست کنم؟
میشه لطفی کنید و سمپلی برای این موضوع قرار بدین؟

baroon2
یک شنبه 19 خرداد 1392, 10:54 صبح
مهندس آدرس که دادم خدمتتون :)

در sql ؛ روی نام دیتابیس تون ؛ در قسمت Progrmmability ؛ و سپس در فولدر Types ؛ روی UserDefined Table Types کلیک راست کنید و New بزنید. و کد اول رو کپی کنید. (با توجه به تغییرات مورد نیازتون).

mahdidabaghi
یک شنبه 19 خرداد 1392, 11:30 صبح
مهندس آدرس که دادم خدمتتون :)

در sql ؛ روی نام دیتابیس تون ؛ در قسمت Progrmmability ؛ و سپس در فولدر Types ؛ روی UserDefined Table Types کلیک راست کنید و New بزنید. و کد اول رو کپی کنید. (با توجه به تغییرات مورد نیازتون).
سپاس فراوان مهندس
میشه بفرمایید من چطوری میتونم به فیلدهایی که توی این تایپ جدیدی که درست کردم دسترسی داشته باشم؟

baroon2
یک شنبه 19 خرداد 1392, 11:34 صبح
توی برنامه تون که یه تیبل می سازید با همین ساختار و پرش می کنید.
بعد توی sp که می نویسید مثه table باهاش برخورد میکنید. کافیه select کنید اطلاعاتی رو می خوایین.

mahdidabaghi
یک شنبه 19 خرداد 1392, 20:12 عصر
توی برنامه تون که یه تیبل می سازید با همین ساختار و پرش می کنید.
بعد توی sp که می نویسید مثه table باهاش برخورد میکنید. کافیه select کنید اطلاعاتی رو می خوایین.
سلام مجدد
من یه فرم app درست کردم و در قسمت Public اون به این صورت کار کردم:


DataTable d1 = new DataTable();

رویداد load form :


private void Form1_Load(object sender, EventArgs e)
{
d1.Columns.Add("name");
d1.Columns.Add("id");
d1.Columns.Add("address");
dt.Columns.Add("name");
dt.Columns.Add("id");
dt.Columns.Add("address");
}

و باتنی برای پر کردن دیتاتیبل به این صورت گذاشتم:


d1.Rows.Add("abed", "33", "teh");
d1.Rows.Add("amir", "55", "esf");

و ذر نهایت باتنی برای ارسال به دیتابیس و اجرا کردن پروسیجر :


private void button3_Click(object sender, EventArgs e)
{
cmd.Parameters.AddWithValue("@WeekList", d1);
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "h_insert";
cn.Open();
cmd.ExecuteReader();
cn.Close();
MessageBox.Show("ok");
}

واین هم پروسیجر :


ALTER proc [dbo].[h_insert]
@WeekList AS dbo.customer ReadOnly
as
select * from Table_1

روش هم به این صورته که ابتدا با کلیک روی باتن اول دیتاتیبل رو پر میکنبم و با کلیک بر باتن دوم این دیتاتیبل رو به پروسیجر پاس میدم.
مشکل اینه که وقتی برای بار دوم روی باتن دوم کلیک میکنم ارور میده.
ممنون میشم از اساتید بنده رو راهنمایی کنن مشکل از جیه؟

mahdidabaghi
یک شنبه 19 خرداد 1392, 20:49 عصر
سلام مجدد
من یه فرم app درست کردم و در قسمت Public اون به این صورت کار کردم:


DataTable d1 = new DataTable();

رویداد load form :


private void Form1_Load(object sender, EventArgs e)
{
d1.Columns.Add("name");
d1.Columns.Add("id");
d1.Columns.Add("address");
dt.Columns.Add("name");
dt.Columns.Add("id");
dt.Columns.Add("address");
}

و باتنی برای پر کردن دیتاتیبل به این صورت گذاشتم:


d1.Rows.Add("abed", "33", "teh");
d1.Rows.Add("amir", "55", "esf");

و ذر نهایت باتنی برای ارسال به دیتابیس و اجرا کردن پروسیجر :


private void button3_Click(object sender, EventArgs e)
{
cmd.Parameters.AddWithValue("@WeekList", d1);
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "h_insert";
cn.Open();
cmd.ExecuteReader();
cn.Close();
MessageBox.Show("ok");
}

واین هم پروسیجر :


ALTER proc [dbo].[h_insert]
@WeekList AS dbo.customer ReadOnly
as
select * from Table_1

روش هم به این صورته که ابتدا با کلیک روی باتن اول دیتاتیبل رو پر میکنبم و با کلیک بر باتن دوم این دیتاتیبل رو به پروسیجر پاس میدم.
مشکل اینه که وقتی برای بار دوم روی باتن دوم کلیک میکنم ارور میده.
ممنون میشم از اساتید بنده رو راهنمایی کنن مشکل از جیه؟
کشفیدم:


d1.paramters.clear()

mahdidabaghi
پنج شنبه 24 مرداد 1392, 15:52 عصر
با سلام خدمت دوستان و اساتید
بنده یه تایپ جدید به این صورت تعریف کردم:


CREATE TYPE [dbo].[WeekList] AS TABLE(
[name] [string] NULL
[age] [int] NULL
)

و در پروسیجر هم یه این صورت به این تایپ دسترسی دارم :


@WeekList AS dbo.WeekList READONLY

سوالم اینه چطور میتونم در پروسیجر به هر کدوم از فیلدهای این تایپ (مثلا age) دسترسی داشته باشم
ممنون میشم راهنمایی بفرمایید