PDA

View Full Version : ریختن یکجای یک دیتاگریدویو در دیتابیس(sql و access)



modern_amin
شنبه 03 تیر 1391, 10:48 صبح
ریختن یکجای یک دیتاگریدویو در دیتابیس(sql):

با سلام
دوستان من میخوام همونطور که ما اطلاعات مثلا بیست هزار سطر دیتابیس رو در یک ثانیه تو دیتاگریدویو نمایش میدیم ، بتونیم مثلا یک دیتاگریدویو بیست هزار سطری رو بصورت یکجا تو sql و بعضا در access اینسرت کنم..

چیکار باید کرد؟ لطفا راهنمایی کنید بنده رو (فوریییه)

Y_Safaiee
شنبه 03 تیر 1391, 11:23 صبح
با سلام خدمت شما دوست گرامی

میتونین با استفاده از ترد (Thread)اینکارو به راحتی انجام بدین,کنار همه ی خوبی هایی که ترد داره یکیش اینه که فرم شما هنگ نمیکنه و در پس زمینه فرمتون انجام میشه,معمولا برای انجام کارهای سنگین از ترد استفاده میکنن.

موفق باشی
بایت بایت

modern_amin
شنبه 03 تیر 1391, 13:16 عصر
دوست عزیز ممنون از جوابتون ..
ترد مگه هنگام کوئری فرستادن تو اس کیو ال جواب میده؟
اگه منظورتون طول کشیدن هنگام اینسرت تکی و سطر به سطر باشه که مشکل من اون نیست
من میخاااام یهو بیست هزار سطر دیتاگرید ویو رو بریزم تو sql و بعضا access ، که اگر درست اینکارو انجام بدم شاید تو چند ثانیه انجام شه و حافظه رو به اونصورت درگیر نکنه
فقط نمیدونم با چه دستور و query اینکارو انجام بدم.........
لطفا راهنمایی بفرمائید ؟
جستجو کردم ولی به نتیجه نرسیدم

uniqueboy_ara
شنبه 03 تیر 1391, 14:08 عصر
شما یه تابع برای insert کرذن داده ها بنویس که ورودیش، مقدار فیل هایی باشه که قراره تو هر بار اجرای تابع وارد جدولت بشه، یه چیزی مثل این ( الکی یه تابع نوشتم که منظورمو متوجه بشیا :) ):
private void Insert(string Feild1,string Feild2,string Feild3)
{
----
------
-
-----
string insert="insert into tbl_x (name,family,phon) values (Feild1,Feild2,Feild3)";
}



بعدش یه حلقه foreach بنویس و به تعداد سطر های GridView این تابع رو با مقادیر هر سطر اجرا کن

ایراد اساسی: این روش در صورتی که Transactional بودن فرآیند براتون مهم باشه، کارایی نداره! ولی اگر مهم نباشه، به خوبی کار می کنه

veniz2008
شنبه 03 تیر 1391, 14:24 عصر
سلام،شما یه ستون از نوع checkbox به گرید خودتون اضافه کنید(این کار بخاطر اینه که ممکنه از 20000 رکورد گرید مثلا دوست داشته باشید 18000 رکورد رو ذخیره کنید،اگرم دوست نداشتید میتونید چک باکس نذارید). بعد از انتخاب رکوردها از درون گریدویو کافیست که رکوردهایی را که تیک خورده اند داخل یک حلقه در یک متغیر رشته ای ذخیره کنیم و در بیرون از حلقه با یک بار وصل شدن به دیتابیس آن رشته را درون دیتابیس درج کنیم،کدش این میشه(خودم تست کردم،هیچ ایرادی نداره):

for (int i = 0; i <= t - 1; i++)
{
if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[4].Value) == true)
{

s = s + "insert into student2 values(" + dataGridView1.Rows[i].Cells[0].Value + ",'" + dataGridView1.Rows[i].Cells[1].Value + "',N'" + dataGridView1.Rows[i].Cells[2].Value + "',N'" + dataGridView1.Rows[i].Cells[3].Value + "')" + ";";
}
}

s = s.Remove(s.Length - 1, 1);
con = new SqlConnection("Data source =(local);initial catalog = testgrid;integrated security = true");
con.Open();
SqlCommand cmd = new SqlCommand(s, con);
cmd.ExecuteNonQuery();
con.Close();
اگر چک باکس نذاشتید if رو پاک کنید.
موفق باشی دوست من.

modern_amin
شنبه 03 تیر 1391, 16:52 عصر
دوستان واقعا دستتون درد نکنه از کمکتون ، منو شرمنده کردین.....

ولی من نمیخوام هر سطر رو جدا جدا اینسرت کنم که اینطوری میشه 20000 تا اینسرت ، من میخوام تقریبا مثل دستور زیر تو اس کیو ال که درواقع ترکیب یک سلکت و اینسرت هست
INSERT INTO TABLE1 SELECT COL1, COL2 FROM TABLE1 کار رو انجام بدم
من این چیزی که تو ذهنمه اینه که دیتاسورس دیتاگرید که مجموعه ای از سطر و ستونهاست و یا دیتاست و دیتاتیبلی اون رو یطوری ربط بدم به یک دستور اینسرت بعد خودش همرو در یک لحظه بریزه تو دیتابیس
به بیان ساده تر بگم ، میخام سطر اول دیتاگرید و سطر دوم اون بره تو سطر اول و دوم دیتابیس اینسرت یشه

veniz2008
شنبه 03 تیر 1391, 19:21 عصر
خواهش میکنم،یاد گرفتن به تنهایی لذت نداره هروقت کسی اونو در اختیار دیگران بذاره ارزش داره،اما در مورد جمله بالاتون،به نظرم شما یه اشتباه رو مرتکب شدید!،ببینید اون insert هیچ عملی رو بر روی بانک انجام نمیده(یعنی شما به بانک وصل نمیشی،فقط داخل یه رشته ذخیره میکنی)،تو کد بالا شما فقط یه بار به دیتابیس وصل میشید نه 20000 بار،به هر صورت شما وقتی 20 هزار رکورد داری باید 20 هزار ثبت هم داشته باشی(حالا یا از روشی که در بالا گفته شد یا از thread یا ...)،مهم اینه که از چه تکنیکی برای ثبت این تعداد رکورد استفاده بشه تا سرعت پایین نیاد،شما استاد مایی ولی در نگاه اول نباید گول اون دستور insert رو خورد!،مهم اینه که برای 20 هزار رکورد فقط یه بار به دیتابیس وصل میشید،البته احتمالش زیاده که روش های دیگه ای هم وجود داشته باشه.

modern_amin
یک شنبه 04 تیر 1391, 15:14 عصر
دوستان واقعا ممنون از پاسخهاتوون ، این چیزی که من دنبالشم شک نکنید برا همه ما مفید و بدرد بخووووره (البته تو برنامه نویسی )
بله حق با شماست ، من اگر بیام دیتابیس رو باز کنم و بعدش یک حلقه for بزارم از اولین اندیس تا آخرین اندیس دیتاگریدویو
و بعد داخل حلقه for بیام هر بار فقط commandtext رو عوض کنم و بعد اجراء کنم عملیات اینسرت 20000 خطم یکی یکی انجام میشه ولی 20000بار باید commandtext تغییر کنه و بعد اجرا بشه
آخرشم دیتابیس رو میبندم ، پس بنابراین دیتابیس یکبار باز شده و بعد بسته شده و commandtext هم 20000بار اجرا شده.....
.
این روش خوب و معموله ولی من چیزه دیگه ای میخاااام ، من دقیقا میخام کدم با یکبار اجرا شدن بتونه این 20000سطر رو بریزه تو دیتابیس ، حالا با هر ابزار و برنامه ای شد که شد
تو sql2008 تیییی که من دیدم حتما فکر کنم بشه یک کارایی کرد چون خیلی خیلی قدرتمند شده و ابزار های مختلف آنالیز ، گزارش گیری و در کل مدیریتی زیادی داره البته زیاد خوش دست نیست
حالا من نمیدونم چطوری ؟ شاید با استفاده از linq بشه همچین کاری رو انجام داد ، شایدم البته نشه
.
دوستان نظر شما چیه؟؟

drstrike
دوشنبه 05 تیر 1391, 16:51 عصر
این روش خوب و معموله ولی من چیزه دیگه ای میخاااام ، من دقیقا میخام کدم با یکبار اجرا شدن بتونه این 20000سطر رو بریزه تو دیتابیس ، حالا با هر ابزار و برنامه ای شد که شد
فک کنم منظورتون این Query باشه:

SELECT *
INTO new_table_name [IN externaldatabase]
FROM old_tablename
عبارت داخل براکت اختیاریه؛ یعنی اگه قراره توی یه جدول از یک بانک اطلاعاتی دیگه (خارجی) درج کنید، باید از عبارت داخل براکت استفاده کنید.
موفق باشید

modern_amin
دوشنبه 05 تیر 1391, 18:56 عصر
ممنون ، چطور میشه از دیتاگریدویو به sql ریخت......

modern_amin
دوشنبه 05 تیر 1391, 19:01 عصر
دوستان این کد زیر چیکار میکنه بنظرتون

BULK INSERT Northwind.dbo.[Order Details]FROM 'f:\orders\lineitem.tbl'WITH (FIELDTERMINATOR = '|',ROWTERMINATOR = '|\n')

drstrike
سه شنبه 06 تیر 1391, 14:45 عصر
ممنون ، چطور میشه از دیتاگریدویو به sql ریخت......
اگه DataGridView به یک دیتاسورس وصل هست به این صورت بنویسید:

SqlConnection con = new SqlConnection(@"YourConnectionString");
DataTable dtDestination = new DataTable("desTable");
string query = "Select * from srcTable";
SqlDataAdapter da = new SqlDataAdapter(query, con);
da.Fill(dtDestination);
کد رو تست نکردم اما گمان نکنم اشتباه باشه
موفق باشید

modern_amin
پنج شنبه 08 تیر 1391, 11:03 صبح
با تشکر
دقیقا برعکس اینکارو میخوام ، یعنی
بجای SELECT میخام کل دیتاگریدویو رو یهو تو دیتابیس اینسرت کنم...
اونطوری چیکار باید کرد؟

drstrike
جمعه 09 تیر 1391, 12:10 عصر
دوست عزیز؛
خب اینم کل DataGridView رو یهو داخل دیتابیس درج می کنه دیگه :لبخندساده:

یه برنامه نمونه ضمیمه کنید تا بهتر متوجه صورت مسئله بشیم

modern_amin
شنبه 10 تیر 1391, 09:29 صبح
کد بالا یهو میخونه (select) و میریزه تو دیتاگرید

من میخام کل دیتاگریدرو یهو بریزم تو database ، نمیخام خط به خط انکارو کنم
نمونه ندارم

modern_amin
شنبه 10 تیر 1391, 14:58 عصر
لطفا راهنمایی کنید

Pis7Aller
شنبه 31 فروردین 1392, 18:47 عصر
دوستان این کد زیر چیکار میکنه بنظرتون

BULK INSERT Northwind.dbo.[Order Details]FROM 'f:\orders\lineitem.tbl'WITH (FIELDTERMINATOR = '|',ROWTERMINATOR = '|\n')

دستور bulk insert برای مواقعی استفاده میشه که می خوایم مقدار بسیار زیادی از ردیف ها رو داخل جدولمون با سرعت فوق العاده زیاد بریزیم ........ تعدادی در حدود 2-3 میلیون .

aslan
شنبه 31 فروردین 1392, 21:21 عصر
سلام
میتونین با استفاده از حلقه و خواندن سطرهای گرید از ساختار زیر برای اینزرت یکجا استفاده کنین ( برای sql 2000 )


INSERT INTO ttest
SELECT 'aa', 'aa', 1, 2, '11111'
UNION
SELECT 'bb', 'bb', 3, 4, '2222'
UNION
SELECT 'cc ', ' cc ', 5, 6, ' 3333 '


برای سایر ورژنهای sql ( جدیدتر ) فکر کنم امکانات بیشتری در این ارتباط فراهم شده است ..............

plus
شنبه 31 فروردین 1392, 21:47 عصر
ببینید، در خود SQL برای درج هر رکورد یک INSERT لازم هست.این اساس کاره.مگه اینکه شما در حین اجرای یک Query باشید و table رو در حافظه داشته باشید و از INSERT INTO استفاده کنید (که در مورد شما اینطور نیست) و یا اینکه از روشهایی مثل دستور BULK INSERT که گفتن استفاده کنید، که البته این روش هم برای مورد شما دردسر سازه، ابتدا باید اطلاعات رو از DataGridView توی فایل بریزید ... که ممکنه خودش زمان رو بیشتر کنه.
مشکل رو اینطوری میشه بررسی کرد که نیاز به نمایش یکجای 20000 یا رکورد یا درج یکجای 20000 تا رکورد میتونی ناشی از یک طراحی غلط باشه.اگه دلیلی که نیاز به این مورد پیدا کردین رو بگین شاید نیازتون رو بشه جور دیگه ای برطرف کرد.

modern_amin
چهارشنبه 04 اردیبهشت 1392, 12:13 عصر
با تشکر از همه
ببینید تحلیلش خیلی سخته فقط بگم درسته ، من شاید 2-3 طول کشید تا نیاز مشتری رو به اینکارا خوب درک کردم
اساس طراحی بر نمایش 20000 رکود هست
کاربر یک تغییر که در اطلاعات یک فیلد انجام میده با توجه به اطلاعات 20000 سطر هرکدوم باید اطلاعات خودشو بگیره و بعد هرکدام خودشو update کنه
.
.
جوابش و فهمیدم ، اگه هر سلول مستقیم به دیتابیس وصل بشه بعد تغییر دیتاگرید ویو اطلاعات دیتابیسمم تغییر میکنه
کلا کمتر از 30 ثانیه زمان میگیره
در کا بنظرم همون حلقه for بهتره

mriman
چهارشنبه 04 اردیبهشت 1392, 12:25 عصر
سلام بر دوستان عزیز
جناب آقای modern_amin
فکر کنم در صورت مشاهده لینک زیر کارتون راه بیافته
البته امیدوارم که منظورتون رو فهمیده باشم:
http://barnamenevis.org/showthread.php?394135-%DA%86%DA%AF%D9%88%D9%86%DA%AF%D9%8A-%D8%B0%D8%AE%D9%8A%D8%B1%D9%87-%D8%AA%D8%BA%D9%8A%D9%8A%D8%B1%D8%A7%D8%AA-Datagridview-%D8%AF%D8%B1-%D8%AF%D9%8A%D8%AA%D8%A7%D8%A8%D9%8A%D8%B3%D8%9F/page2

mriman
چهارشنبه 04 اردیبهشت 1392, 12:27 عصر
در صورتی که روشی که لینکش رو گذاشتم اجرا کنی، به راحتی و پس از نمایش داده های مورد نظر(چه همه داده هات باشه و یا بخشی از آن)، می توانی ویرایش ، حذف یا اضافه کردن رو انجام بدی
موفق باشی

monilin
چهارشنبه 11 اردیبهشت 1392, 18:00 عصر
"اگه هر سلول مستقیم به دیتابیس وصل بشه بعد تغییر دیتاگرید ویو اطلاعات دیتابیسمم تغییر میکنه
کلا کمتر از 30 ثانیه زمان میگیره"
این روش جواب میده ولی به نظرم اتصال تک تک فیلدها به بانک چندان درست نیست، مشکلاتی خواهد داشت از قبیل همون موردی که مشکلتون بود (سرعت) و امن هم نیست
من این کارو میکنم

class KharidDSql : DataLayerBase
{
public string Barcode { get; set; }
public int FactorId { get; set; }
.
.
.
.


public int InsertList(List<KharidDSql> Object_t,int j)
{
int b=1;
for (int i = 1; i < j && b == 1; i++)
{
b = ExecuteNoneQuery(CommandType.StoredProcedure, "KharidD_Insert", new SqlParameter[] {
new SqlParameter("@Barcode", Object_t[i].Barcode),
new SqlParameter("@FactorId", Object_t[i].FactorId),
.
.
.
. }

return b;
}

اینجوری کل dataGrid رو یه جا به این تابع میدی که با یه بار باز کردن دیتابیس درج و آپدیت و .. انجام میده! و احتمال اینکه در حین درج تعداد زیادی از رکوردها، بعضا برخی درج و بقیه ... پیش نمیاد