PDA

View Full Version : سوال: ورود همزمان 300000 داده به بانک اطلاعاتی sql با فایل اکسل



reza4359
یک شنبه 02 آبان 1395, 08:51 صبح
با سلام دوستان من با استفاده از فایل اکسل تونستم 15000 داده رو وارد sql server کنم ولی وقتی حجم داده بالا میره مثلا 250000 یا 300000 دیگه وارد نمیکنه و از برنامه خارج میشه
به نظر شما مشکل از کجاست؟
ممنون

juza66
یک شنبه 02 آبان 1395, 10:32 صبح
سلام

با کد داری انجام میدی یا از طریق اس کیوال داری ایمپورت میکنی؟

reza4359
یک شنبه 02 آبان 1395, 10:41 صبح
سلام

با کد داری انجام میدی یا از طریق اس کیوال داری ایمپورت میکنی؟

سلام
با کد داخل #c

abdullah20
یک شنبه 02 آبان 1395, 10:45 صبح
کدتون را اینجا قرار بدید

reza4359
یک شنبه 02 آبان 1395, 11:09 صبح
اینم کدی که استفاده کردم
try
{

OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "انتخاب فایل اکسل حاوی اطلاعات مشترکین";
ofd.Filter = "فایل اکسل 2003 (*.xls)|*.xls|فایل اکسل 2007 به بعد(*.xlsx)|*.xlsx";
if (ofd.ShowDialog() == DialogResult.OK)
{
string excelConnectionString = "";
string SourceFilePath = ofd.FileName;

if (System.IO.Path.GetExtension(ofd.FileName) == ".xlsx")

excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + SourceFilePath + ";Extended Properties=Excel 12.0";
else if (System.IO.Path.GetExtension(ofd.FileName) == ".xls")
excelConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + SourceFilePath + ";Extended Properties=Excel 8.0";
System.Data.DataTable dt = new System.Data.DataTable("tbl_master");



using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection(excelConnectionS tring))
{

connection.Open();

System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [Sheet1$]", connection);
da.Fill(dt);
connection.Close();

}

using (System.Data.OleDb.OleDbConnection connection = new System.Data.OleDb.OleDbConnection(excelConnectionS tring))
{
this.Cursor = Cursors.WaitCursor;

connection.Open();

string sqlConnectionString = "Data Source=.;Initial Catalog=phone_projectdb;Integrated Security=True";


using (System.Data.SqlClient.SqlBulkCopy bulkCopy = new System.Data.SqlClient.SqlBulkCopy(sqlConnectionStr ing, System.Data.SqlClient.SqlBulkCopyOptions.KeepIdent ity))//تعریف یک شی از کلاس SqlBulkCopy
{


bulkCopy.DestinationTableName = "tbl_master";
bulkCopy.WriteToServer(dt);

}

this.Cursor = Cursors.Arrow;

Msg.Eshow(" اطلاعات با موفقیت در بانک اطلاعاتی ذخیره شد " + "", "پیغام سیستم", MsgIcon.Save, MsgButton.Ok, MsgDefualtButton.Button1, true, true, 30, Color.AliceBlue, Color.Green, .90, MsgBoarderStayle.ToolWindow);

}
}

}
catch (Exception ex)
{
this.Cursor = Cursors.Arrow;

MessageBox.Show(ex.Message, "error");
}

juza66
یک شنبه 02 آبان 1395, 12:04 عصر
یکبار دیتاتیبل رو تویی دیتاگریدت لود کن، واس خطایابی همه رو یکجا تویی tray نیار، جدا کن هر قسمت رو.. منم الان کدت رو تست میکنم

safa.net
شنبه 22 آبان 1395, 13:03 عصر
یکبار دیتاتیبل رو تویی دیتاگریدت لود کن، واس خطایابی همه رو یکجا تویی tray نیار، جدا کن هر قسمت رو.. منم الان کدت رو تست میکنم
سلام
علت رو فهمدید؟

golbafan
شنبه 22 آبان 1395, 13:12 عصر
مشکل میتونه از حافظه باشه
باید مدیریتش کنید

روش:


public int Fill(
int startRecord,
int maxRecords,
params DataTable[] dataTables
)


const string fileName = "myData.xlsx";
const string excelConnString = "provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + fileName + "';Extended Properties=Excel 12.0;";

using (var cnn = new OleDbConnection(excelConnString))
{
cnn.Open();

const string countQuery = "SELECT COUNT(*) FROM [Detail$]";
using (var cmd = new OleDbCommand(countQuery, cnn))
{
using (var reader = cmd.ExecuteReader())
{
if (reader == null) return;

reader.Read();
var rowsCount = ((int)reader[0]);

const string query = "SELECT * FROM [Detail$]";
using (var odp = new OleDbDataAdapter(query, cnn))
{
var detailTable = new DataTable();
var recordToStartFetchFrom = 0; //zero-based record number to start with.
const int chunkSize = 100;
while (recordToStartFetchFrom <= rowsCount)
{
var diff = rowsCount - recordToStartFetchFrom;
int internalChunkSize = diff < 100 ? diff : chunkSize;
odp.Fill(recordToStartFetchFrom, internalChunkSize, detailTable);

foreach (DataRow row in detailTable.Rows)
{
Console.WriteLine("{1} {0}", row.ItemArray[0], row.ItemArray[1]);
}

Console.WriteLine("--------- {0}-{1} Rows Processed ---------", recordToStartFetchFrom, recordToStartFetchFrom + internalChunkSize);

recordToStartFetchFrom += chunkSize;

detailTable.Dispose();
detailTable = null;
detailTable = new DataTable();
}
}
Console.ReadLine();
}
}
}

h.gheidrlou
چهارشنبه 26 آبان 1395, 18:00 عصر
ایا مقدوره همین کد را به روش linqاز فایل اکسل به جداول SQLدراین جا قراربدید؟؟