PDA

View Full Version : سوال: ارور تایم اوت در برنامه ؟



kiani2012
چهارشنبه 25 تیر 1393, 18:48 عصر
سلام
من میخوام حدود 1400 رکورد که داخل گرید ویو هست رو داخل یه جدول ذخیره کنم ولی مثلا حدود 200 رکورد ذخیره میشه و این ارور رو میده

Timeout expired.
The timeout period elapsed prior to obtaining a connection from the pool.
This may have occurred because all pooled connections
were in use and max pool size was reached.

اینم کدم هست

for (int i = 0; i < dataGridViewX1.Rows.Count; i++) {
for (int j = 0; j < (dataGridViewX1.Columns.Count) - 1; j++)
{
SqlCommand cm = new SqlCommand("insert into virtualtable (nk) values (@N)", cnd.getcn());
cm.Parameters.Add("@N", SqlDbType.Int).Value = int.Parse(dataGridViewX1.Rows[i].Cells[j].Value.ToString());

cm.Connection.Open();
cm.ExecuteNonQuery();
}

gi = i;
}


کسی میدونه مشکل کجاست؟

abbas.oveissi
چهارشنبه 25 تیر 1393, 19:08 عصر
احتمالا connection رو close نکردی،بعد هر ExecuteNonQuery ارتباط رو Close کن.شاید درست بشه

omid nasri
چهارشنبه 25 تیر 1393, 20:08 عصر
دوست عزیز برای کارهای که از حلفه استفاده می شود، اگر تعداد حلفه بیشتر از حد مورد نظر باشد شما باید از System.Threading.Tasks;
namespace استفاده کنید، کلاس در دات نت 4 اضافه شد که میزان سرعت حلقه شما بیشتر از حلقه های عادی می شود ، دلیل این کار هم اینه که این کلاس باعث میشه که موازی اتفاق افتد؛ برای اطلاعات بیشتر می تونی به msdn مراجعه کنید ، دوم ایم اتفاق که افتاده برای این هستش در نظر بنده که شما ازado command استفاده کردین، بهتر است که از entity استفاده کنید. خواستی بهتر کمک کنم کد رو برام پخ کن.

mz6488
چهارشنبه 25 تیر 1393, 21:27 عصر
حتی اگه ارورش برطرف بشه باز بهینه نیست.باید کوئری رو داخل یک استرینگ ذخیره کنید و استرینگ رو بفرستید به sql تا کل کوئری یه جا اجرا بشه

kiani2012
پنج شنبه 26 تیر 1393, 03:48 صبح
احتمالا connection رو close نکردی،بعد هر ExecuteNonQuery ارتباط رو Close کن.شاید درست بشه

سلام
چرا close هم کردم
ولی ج نمیده

abbas.oveissi
پنج شنبه 26 تیر 1393, 04:28 صبح
سلام
چرا close هم کردم
ولی ج نمیده
راه اصولیش استفاده از کلاس SqlBulkCopy هست.شبیه نمونه کد زیر میتونید ازش استفاده کنید :
DataTable prodSalesData = new DataTable("ProductSalesData");

// Create Column 1: SaleDate
DataColumn dateColumn = new DataColumn();
dateColumn.DataType = Type.GetType("System.DateTime");
dateColumn.ColumnName = "SaleDate";


// Create Column 2: ProductName
DataColumn productNameColumn = new DataColumn();
productNameColumn.ColumnName = "ProductName";


// Create Column 3: TotalSales
DataColumn totalSalesColumn = new DataColumn();
totalSalesColumn.DataType = Type.GetType("System.Int32");
totalSalesColumn.ColumnName = "TotalSales";


// Add the columns to the ProductSalesData DataTable
prodSalesData.Columns.Add(dateColumn);
prodSalesData.Columns.Add(productNameColumn);
prodSalesData.Columns.Add(totalSalesColumn);


// Let's populate the datatable with our stats.
// You can add as many rows as you want here!


// Create a new row
DataRow dailyProductSalesRow = prodSalesData.NewRow();
dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
dailyProductSalesRow["ProductName"] = "Nike";
dailyProductSalesRow["TotalSales"] = 10;


// Add the row to the ProductSalesData DataTable
prodSalesData.Rows.Add(dailyProductSalesRow);


// Copy the DataTable to SQL Server using SqlBulkCopy
using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
{
dbConnection.Open();
using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
{
s.DestinationTableName = prodSalesData.TableName;


foreach (var column in prodSalesData.Columns)
s.ColumnMappings.Add(column.ToString(), column.ToString());


s.WriteToServer(prodSalesData);
}
}

kiani2012
پنج شنبه 26 تیر 1393, 16:31 عصر
سلام
من این کد رو تغییر دادم ولی بازم ج نداد


DataTable prodSalesData = new DataTable("ProductSalesData");

// Create Column 1: SaleDate
DataColumn dateColumn = new DataColumn();
dateColumn.DataType = Type.GetType("System.INT");
dateColumn.ColumnName = "nk";






// Add the columns to the ProductSalesData DataTable
prodSalesData.Columns.Add(dateColumn);



// Let's populate the datatable with our stats.
// You can add as many rows as you want here!


for (int i = 0; i < dataGridViewX1.Rows.Count; i++)
{
for (int j = 0; j < (dataGridViewX1.Columns.Count) - 1; j++)
{


DataRow dailyProductSalesRow = prodSalesData.NewRow();
dailyProductSalesRow["nk"] = int.Parse(dataGridViewX1.Rows[i].Cells[j].Value.ToString());
prodSalesData.Rows.Add(dailyProductSalesRow);
}
}
//@"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\GDatabase.mdf;Integrated Security=True;Connect Timeout=60;User Instance=True;Min Pool Size=2;Max Pool Size=20;"
// Copy the DataTable to SQL Server using SqlBulkCopy
using (SqlConnection dbConnection = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=" + Application.StartupPath + @"\GDatabase.mdf;Integrated Security=True;Connect Timeout=60;User Instance=True;Min Pool Size=2;Max Pool Size=20;"))
{
dbConnection.Open();
using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
{
s.DestinationTableName = prodSalesData.TableName;




foreach (var column in prodSalesData.Columns)
s.ColumnMappings.Add(column.ToString(), column.ToString());




s.WriteToServer(prodSalesData);
}
}
}

omid nasri
پنج شنبه 26 تیر 1393, 18:39 عصر
دوست عزیز گفتم که شما نباید از for استفاده کنید باید از کلاس که در دات نت 4 امده استفاده کنی ....خواستی کمک کنم برنامه رو برام پخ کن برات درست کنم.

kiani2012
پنج شنبه 26 تیر 1393, 22:45 عصر
دوست عزیز گفتم که شما نباید از for استفاده کنید باید از کلاس که در دات نت 4 امده استفاده کنی ....خواستی کمک کنم برنامه رو برام پخ کن برات درست کنم.

سلام
کد رو براتون ارسال کردم داخل مسنجر

aminaltavista
شنبه 04 مرداد 1393, 13:02 عصر
http://stackoverflow.com/a/24850670
اﻳﻦ ﻟﻴﻨﻚ ﺭﻭﻧﮕﺎﻩ ﻛﻦ. ﻛﺎﺭﺕ ﻧﺸﺪ ﭘﺴﺖ ﻫﺎﻱ ﺩﻳﮕﻪ ﺭﻭ ﻫﻢ ﭼﻚ ﻛﻦ( ﺑﺎﻻﻳﻲ ﻫﺎﺵ) .

kiani2012
یک شنبه 05 مرداد 1393, 01:35 صبح
سلام با این کد حل شد

// assures the connection is closed and released to the connection pool this.Cursor = Cursors.WaitCursor;
using (var connection = cnd.getcn())
{
connection.Open();


// resuse the command...
using (var insertCommand = new SqlCommand("insert into virtualtable (nk) values (@N)", connection))
{
// create the parameter once
var parameterN = insertCommand.Parameters.Add("@N", SqlDbType.Int);
int i;
for ( i = 0; i < dataGridViewX1.Rows.Count-1; i++)
{

// assign a new value
parameterN.Value = int.Parse(dataGridViewX1.Rows[i].Cells[0].Value.ToString());
insertCommand.ExecuteNonQuery();

}
gi = i;
}