PDA

View Full Version : سوال: انتقال رکوردها به یک تیبل دیگر با تعیین شرط



neda_dela
دوشنبه 31 خرداد 1389, 14:23 عصر
سلام دوستان
چطوری میشه بعضی از رکوردهای یه تیبل رو به یه تیبل دیگه منتقل کرد؟

NIK
دوشنبه 31 خرداد 1389, 14:27 عصر
سلام دوستان
چطوری میشه بعضی از رکوردهای یه تیبل رو به یه تیبل دیگه منتقل کرد؟

ابتدا باید یه تیبل بسازی. بعد یه DataRow از روی تیبلت بسازی. هر رکوردی که خواستی توش Add کنی ابتدا فیلد به فیلد تو DataRow میریزی و DataRow رو تو تیبل دومت Add میکنی.

neda_dela
دوشنبه 31 خرداد 1389, 14:37 عصر
ابتدا باید یه تیبل بسازی. بعد یه DataRow از روی تیبلت بسازی. هر رکوردی که خواستی توش Add کنی ابتدا فیلد به فیلد تو DataRow میریزی و DataRow رو تو تیبل دومت Add میکنی.
متشکرم
ممکنه با کد برام توضیح بدید؟

NIK
دوشنبه 31 خرداد 1389, 14:55 عصر
متشکرم
ممکنه با کد برام توضیح بدید؟


51560

موفق باشید

s.khoshfekran
دوشنبه 31 خرداد 1389, 15:22 عصر
DataRow[] dr = dt.Select("EmployeeID>5");
dt2.Rows.Add(dr);

neda_dela
چهارشنبه 02 تیر 1389, 15:34 عصر
51560

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


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication7
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dt1.Columns.Add(new DataColumn("Columns1", typeof(System.String)));
dt1.Columns.Add(new DataColumn("Columns2", typeof(System.String)));
dt1.Columns.Add(new DataColumn("Columns3", typeof(System.String)));
dt1.Columns.Add(new DataColumn("Columns4", typeof(System.String)));
dt2.Columns.Add(new DataColumn("Columns1", typeof(System.String)));
dt2.Columns.Add(new DataColumn("Columns2", typeof(System.String)));
dt2.Columns.Add(new DataColumn("Columns3", typeof(System.String)));
dt2.Columns.Add(new DataColumn("Columns4", typeof(System.String)));

}
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
private DataRow dr(string Columns1, string Columns2, string Columns3, string Columns4)
{
DataRow dr = dt2.NewRow();
dr["Columns1"] = Columns1;
dr["Columns2"] = Columns2;
dr["Columns3"] = Columns3;
dr["Columns4"] = Columns4;
return dr;
}

private void button1_Click(object sender, EventArgs e)
{
string co1,co2,co3,co4;
for (int i = 0; i < dt1.Rows.Count; i++)
{

//§© ­ي©¢ ©ç©ں© ي§ë ¬©ل «ل© êي©§ ëâ© §© ¤§يé §يê £ ¢ êی¬ي§)
if (dt1.Rows[i]["Columns1"].ToString() == "******")
{
co1 = dt1.Rows[i]["Columns1"].ToString();
co2 = dt1.Rows[i]["Columns2"].ToString();
co3 = dt1.Rows[i]["Columns3"].ToString();
co4 = dt1.Rows[i]["Columns4"].ToString();

dt2.Rows.Add(dr(co1,co2,co3,co4));
}
}
}
}
}

behnam25214
چهارشنبه 02 تیر 1389, 16:33 عصر
به نظرم رکوردهایی رو که میخوایی رو بریز به بک دیتاگرید ویو و بعدش اونا رو Add کن به تیبل دومت.

میلاد قاضی پور
چهارشنبه 02 تیر 1389, 16:55 عصر
توی تاپیک قبلی ای که در زمینه انتقال به آرشیو ایجاد کرده بودید توضیحاتم فکر کنم کامل بودن .
http://barnamenevis.org/forum/showthread.php?t=228462

s.khoshfekran
چهارشنبه 02 تیر 1389, 17:32 عصر
از متد ImportRow کلاس DataTable میتونی استفاده کنی!

neda_dela
پنج شنبه 03 تیر 1389, 07:18 صبح
توی تاپیک قبلی ای که در زمینه انتقال به آرشیو ایجاد کرده بودید توضیحاتم فکر کنم کامل بودن .
http://barnamenevis.org/forum/showthread.php?t=228462
راستش من گیج شدم. فیلد تاریخ رو به کدوم جدول اضافه کنم؟ جدول آرشیو یا نه جدول قبلی؟
لطفا دقیق تر توضیح بدین راستش من کد انتقال رو میخام ممنون

میلاد قاضی پور
پنج شنبه 03 تیر 1389, 07:48 صبح
فیلد تاریخ رو به تیبل فعلی اضافه میکنید . تو بخشی هم که نوشتم "فیلدهای مربوطه تمام فیلدهای تیبل فعلی تون رو اونجا هم مینویسید تا اون تیبل هم دقیقا مثل همینیکی باشه . بعد تیبل دوم با همون دستوری که براتون نوشتم ساخته میشه . و در واقع یه کپی از تیبل فعلیتون هست که فقط اطلاعاتی توش نوشته شدن که توی شرط



"where datetimefield=@datetime"


مطابقت میکنه . یعنی شما فقط به جای @datetime سال "مورد نظرتون رو " که میخواید سایر اطلاعات ثبت شده در اون سال ، توی تیبل دوم قرار بگیرند رو وارد میکنید . حالا به جای سال میتونید تابعی بنویسید که مقداری از نوع دیت تایم برگردونه . تمام .

حالا برای اینکه تیبل فعلیتون سبک بشه با همون شرط یه دستور دیلیت برای اطلاعات مینویسید . یعنی هر سطری که در سال مربوطه نوشته شده پاک بشه چون توی تیبل دیگه اضافه شده و دیگه لازم نیستش.
کد انتقالی تا اون جایی که من میدونم وجود نداره با همین روش اطلاعات منتقل میشه .

programer1389
پنج شنبه 03 تیر 1389, 08:13 صبح
اگه فقط میخواهید اطلاعات رو insert کنید تو تیبل دوم
کدش این میشه
insert into table2 select * from table1 where id<100
یک sp بسازید و اون رو تو برنامتون فراخونی کنید

neda_dela
جمعه 04 تیر 1389, 00:48 صبح
فیلد تاریخ رو به تیبل فعلی اضافه میکنید . تو بخشی هم که نوشتم "فیلدهای مربوطه تمام فیلدهای تیبل فعلی تون رو اونجا هم مینویسید تا اون تیبل هم دقیقا مثل همینیکی باشه . بعد تیبل دوم با همون دستوری که براتون نوشتم ساخته میشه . و در واقع یه کپی از تیبل فعلیتون هست که فقط اطلاعاتی توش نوشته شدن که توی شرط



"where datetimefield=@datetime"



مطابقت میکنه . یعنی شما فقط به جای @datetime سال "مورد نظرتون رو " که میخواید سایر اطلاعات ثبت شده در اون سال ، توی تیبل دوم قرار بگیرند رو وارد میکنید . حالا به جای سال میتونید تابعی بنویسید که مقداری از نوع دیت تایم برگردونه . تمام .




حالا برای اینکه تیبل فعلیتون سبک بشه با همون شرط یه دستور دیلیت برای اطلاعات مینویسید . یعنی هر سطری که در سال مربوطه نوشته شده پاک بشه چون توی تیبل دیگه اضافه شده و دیگه لازم نیستش.


کد انتقالی تا اون جایی که من میدونم وجود نداره با همین روش اطلاعات منتقل میشه .



خب البته تاریخی که مد نظر من هست فقط ساله. یعنی توش فقط عدد 1389 یا هر عدد 4 رقمی دیگه ای که کاربر به عنوان سال وارد می کنه قرار می گیره.
بنابراین منظور شما اینه که وقتی کاربر مثلا روی دکمه انتقال به بایگانی کلیک کرد، سال مورد نظر کاربر رو ازش بپرسه و طبق اون سال حالا اون دستور ساخت تیبل و بقیه روال اجرا بشه؟
یه چیز دیگه حالا خب نمیشه تیبل رو اینطوری نسازم برم خودم تو اس کیو ال بسازمش ؟
اه ببخشید که خیلی مطلب رو طولانی می کنم. امیدوارم از کمک کردن خسته نشید:خجالت:

میلاد قاضی پور
جمعه 04 تیر 1389, 03:50 صبح
منظور من هم از دیت تایم همونجوری بود که خودتون میخواین . میتونید سال رو دربیارید با اون تابع و از کاربر هم لازم نیست سال مورد نظر رو بپرسه . سیستم خودش تاریخ داره دات نت هم متد های لازم برای برگردوندن تاریخ به صورت فقط سال رو داراست . شما فیلدی که گفتم به صورت دیت تایم در هر دو تیبل اضافه کنید رو از نوع اینتیجر بسازید . با این روش چه اتفاقی میفته ؟ هیچی شما میتونید وقتی تاریخ کنونی رو کشف کردید ((سال سیستم)) به اینتیجر تبدیل کنید . حالا مگه نمیخواید اطلاعات پارسال بره تو آرشیو ؟ خب سال فعلی منها یک میشه کی؟ پارسال دیگه ....
پس شرط اس کیو الت میشه :




//getyear esme tabei hast ke meghdari az noe sahih barmigardone ke adade emsal hast
int yr= convert.toint32(getyear());
int parsal=yr-1;

//sql command
"create table archive"+parsal.tostring()+" as select * from table1 where year="+parsal.tostring();

//name teibele archive be in soorat mishe msalan : archive2009

فکر کنم همشو نوشتم دیگه .
در مورد سوال آخر چرا میشه ولی مثل اینه که یه کمد داشته باشید و بخواید یکی دیگه همین الان بخرید که در آینده "اگر و فقط اگر" (داشتی؟ ) وسایلتون زیاد شد بریزیدش تو کمدی که میخواید بخرید . بهتره وقتی اینکارو بکنید که لازم هست . در ضمن با این روش میتونید یه کانتر هم به نام تیبلتون اضافه کنید که برای هر سال تیبل آرشیو جداگانه ای ایجاد بشه .

neda_dela
جمعه 04 تیر 1389, 15:29 عصر
بببینید من یه همچین کدی نوشتم:(البته من میخام که کاربر خودش سال مورد نظر رو وارد کنه برا همین یه تکست باکس گذاشتم تا سال رو وارد کنه)


SqlDataAdapter da = newSqlDataAdapter();
SqlConnection con = newSqlConnection();
SqlCommand com = newSqlCommand();
com.CommandText = "create table archivst(code bigint(8),id bigint(8),firstname nvarchar(50),lastname nvarchar(50),years nvarchar(50)) as select * from [st-sabt] where years='" + textBox1.Text + "'";
com.Connection = con;
com.CommandType = CommandType.Text;
con.ConnectionString = "data source=.;initial catalog=quran;integrated security=True";
da.SelectCommand = com;
con.Open();
com.ExecuteNonQuery();
com.CommandText = "delete [st-sabt] where years=" + textBox1.Text;
con.Close();

حالا خطا میده :

Incorrect syntax near the keyword 'as'.
یه سوال دیگه با این روش کاربر می تونه به بایگانی دسترسی داشته باشه؟ چطوری؟

میلاد قاضی پور
جمعه 04 تیر 1389, 20:23 عصر
خب کلمه کلیدی as روی بانک اوراکل کار میکنه و من اونجا اشتباه کردم . اما با اندکی تغییر میتونه درست شه . کد رو به این صورت در بیارید :




"create table archivst(code bigint(8),id bigint(8),firstname nvarchar(50),lastname nvarchar(50),years nvarchar(50)) insert into archivst select * from [st-sabt] where years='" + textBox1.Text + "'";


بله میشه اما اون دیگه یه تاپیک دیگه میخواد !!در محدودده ی اطلاعات من هم نیست شاید هیچ فرقی با روش معمولی نداشته باشه . یعنی به محض اجرا شدن کامند تیبل به صورت فیزیکی در بانک ایجاد بشه و مثل تیبل های معمولی بشه کارهایی رو روش انجام داد . به هر حال .
این را هم امتحان کنید موفق می شوید انشالله ... و من الله توفیق

neda_dela
شنبه 05 تیر 1389, 14:16 عصر
"create table archivst(code bigint(8),id bigint(8),firstname nvarchar(50),lastname nvarchar(50),years nvarchar(50)) insert into archivst select * from [st-sabt] where years='" + textBox1.Text + "'";





مرسی ولی بازم خطا میده



Insert Error: Column name or number of supplied values does not match table definition.


من خیلی دقت کردم که هم نام فیلدهام و هم نوع اونها شبیه به جدول اصلی باشه حتی اونایی که Not null هستن رو هم توی کدم نوشتم

این طوری


com.CommandText = "create table archivst(code bigint NOT NULL,id bigint NOT NULL,firstname nvarchar(50) NOT NULL,lastname nvarchar(50) NOT NULL,years nvarchar(50) NOT NULL) insert into archivst select * from [st-sabt] where years='" + textBox1.Text + "'";

میلاد قاضی پور
شنبه 05 تیر 1389, 15:34 عصر
خصایص رو هم دقیقا مثه تیبل اول ست کنید . الان من اینجا پرایمری کی نمیبینم .
آیا تیبل فعلیتون با تیبل دیگه ای ریلیشن داره ؟ اگر آره باید اونو هم برای فیلد معادل در تیبل جدید قید کنید .
به ترتیب هم توجه داشته باشید . ترتیب فیلدهایی که در تیبل دو ساخته میشن باید به ترتیب فیلدهای اولی باشه .
identity spec رو هم روی پرایمری کی اگر اونجوری هست ست کنید .

Identity Specification=YES
Identity Increment = 1

neda_dela
شنبه 05 تیر 1389, 23:29 عصر
خصایص رو هم دقیقا مثه تیبل اول ست کنید . الان من اینجا پرایمری کی نمیبینم .
آیا تیبل فعلیتون با تیبل دیگه ای ریلیشن داره ؟ اگر آره باید اونو هم برای فیلد معادل در تیبل جدید قید کنید .
به ترتیب هم توجه داشته باشید . ترتیب فیلدهایی که در تیبل دو ساخته میشن باید به ترتیب فیلدهای اولی باشه .
identity spec رو هم روی پرایمری کی اگر اونجوری هست ست کنید .

Identity Specification=YES
Identity Increment = 1

ترتیب فیلدهام که درسته . حالا فیلد code پرایمری کی هست چطوری توی کد بنویسمش؟ اینطوری؟

code bigint(8) primarykey Identity Specification=YES Identity Increment = 1

میلاد قاضی پور
یک شنبه 06 تیر 1389, 05:54 صبح
ترتیب فیلدهام که درسته . حالا فیلد code پرایمری کی هست چطوری توی کد بنویسمش؟ اینطوری؟

code bigint(8) primarykey Identity Specification=YES Identity Increment = 1


بله . البته دقیقا نمیدونم نوشتن identity کافی هست یا باید برابر یس قرار داده بشه . پرایمری کی چسبان نباشه .

neda_dela
یک شنبه 06 تیر 1389, 15:41 عصر
بله . البته دقیقا نمیدونم نوشتن identity کافی هست یا باید برابر یس قرار داده بشه . پرایمری کی چسبان نباشه .
مرسی ولی انگار این دستور نمیخاد با من راه بیاد این طوری نوشتمش:


com.CommandText = "create table archivst(code bigint NOT NULL primary key Identity,id bigint NOT NULL,firstname nvarchar(50) NOT NULL,lastname nvarchar(50) NOT NULL,years nvarchar(50) NOT NULL) insert into archivst select * from [st-sabt] where years='" + textBox1.Text + "'";

چون که از = و کلمات specification و Increment و اینا خطا می گیره همون خطای

syntax near واین حرفا
بازم خطا داد:

An explicit value for the identity column in table 'archivst' can only be specified when a column list is used and IDENTITY_INSERT is ON.

میلاد قاضی پور
یک شنبه 06 تیر 1389, 15:59 عصر
SET IDENTITY_INSERT table_name ON
And then turn it off again when done
SET IDENTITY_INSERT table_name OFF

با یک قاشق مربا خوری سرپر گوگل هم میتونید به راحتی این قبیل ارور ها رو برطرف کنید .
http://www.execsql.com/post/An-explicit-value-for-the-identity-column.aspx
اگه دوستای دیگه هم کمک کنن خوب میشه چون من دیگه اینجاهاشو از حفظ بلد نیستم همی .
بعدا یه فیلمنامه مینویسم در مورد این مسأله ...

neda_dela
یک شنبه 06 تیر 1389, 16:06 عصر
اوووووووووه درست شد درست شد
اشکالش این بود که چون من توی قسمت آخر دستور سلکت می زدم و می خاستم همه فیلدهای اون تیبل اصلی رو به آرشیو ببرم توی اونها فیلد code هم بوده دیگه حالا یا باید در ابتدای دستور Increment رو بذارم و در قسمت سلکت فیلد code رو نیارم یا باید increment رو از اول دستور بردارم و فیلد code رو در سلکت بدارم باشه
چون خب وقتی که یه فیلد رو براش خاصیت اینکریمنت تعیین می کنیم نمی تونیم خودمون بهش مقدار بدیم دیگه
حالا درست شد ولی فقط یه اشکال دیگه داره که هر بار که دکمه ارسال به بایگانی رو بزنم دوباره میاد که تیبل رو بسازه و بعدش خطا میده که تیبلی با این نام توی دیتا بیس هست باید جای این دستور رو عوض کنم
مرسی از اینکه حوصله به خرج دادید خیلی متشکرم:خجالت::لبخندساده::تش یق::لبخند:

neda_dela
چهارشنبه 31 شهریور 1389, 19:23 عصر
خب دوستان دوباره سلام من دوباره به مشکل برخوردم گفتم از ادامه همین تاپیک بپرسم
کد من به این شکل تغییر پیدا کرده

SqlDataAdapter da = new SqlDataAdapter();
SqlConnection con = new SqlConnection();
SqlCommand com = new SqlCommand();
BindingSource bs = new BindingSource();
private void button1_Click(object sender, EventArgs e)
{
com.CommandText = "create table archivst(code bigint NOT NULL primary key,id bigint NOT NULL,firstname nvarchar(50) NOT NULL,lastname nvarchar(50) NOT NULL) insert into archivst select * from [st-sabt] where id='" + textBox1.Text + "'";
com.Connection = con;
com.CommandType = CommandType.Text;
con.ConnectionString = "data source=.;initial catalog=quran;integrated security=True";
da.SelectCommand = com;
con.Open();
com.ExecuteNonQuery();
com.CommandText = "delete [st-sabt] where years=" + textBox1.Text;
con.Close();
MessageBox.Show("ÚãáíÇÊ ÈÇ ãæÝÞíÊ ÇäÌÇã ÔÏ");
}
////////////////////////////////////////////////////////////
private void year_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
da.Fill(dt);
string tablename = "archivst";
string comm = "select * from " + tablename;
com.CommandText = comm;
dataGridView1.AutoGenerateColumns = true;
bs.DataSource = dt;
dataGridView1.DataSource = bs;
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
com.ExecuteNonQuery();
con.Close();
}
button1 که دکمه ای هست که با کلیک کردن اون اطلاعاتی که با شرط خاص ما منطبق هست به تیبل آرشیو میره
و من توی لود فرم کدهایی رو که اوج بند عزیز راهنمایی فرمودند رو گذاشتم تا اینکه با ورود به اون فرم دیتا گرید موجود به تیبل آرشیو متصل بشه و اطلاعات رو نشون بده منتها از خط

da.Fill(dt);
حالا یه سوال دیگه اینکه چون این تیبل archivst یه بار ساخته شده برای دفعه دوم دیگه خطا میده که این تیبل ساخته شده و نمی تونی دوباره این دستور رو استفاده کنی کسی از دوستان می تونه من رو در این زمینه کمک کنه؟

میلاد قاضی پور
چهارشنبه 31 شهریور 1389, 19:30 عصر
تلاش و پیگیری مثال زدنی شما ستودنیست .
مدتی پیش دیدم که توی تالار اس کیو ال سرور سوألی پرسیده بودید که موجودیت یک تیبل رو چطور میشه بررسی کرد . قرار شد یک پراسیجر بنویسید که در صورت موجود بودن مثلا عدد یک رو برگردونه . این پراسیجر رو شما باید توی تابعی در سیشارپ اجرا کنید که اگر نتیجه پراسیجر یک بود ترو و در غیر اینصورت فالس رو برگردونه . حالا شما در ادامه همین کدتون شرطی مینویسید که در صورت ترو بودن تابع دستورات مربوط به حالتی که تیبل از قبل موجود هست رو انجام بده در غیر اینصورت دستورات درج تیبل جدید.