D-Kishore Ответов: 5

Заполнение больших данных в таблицу данных c#


уважаемый друг,

в моем проекте приложения c# windows,

нам нужно извлечь данные из sqlquery, а затем заполнить их в C# datatable.
Здесь мы должны заполнить datatable более 50 Лакхов строк и 12 столбцов.

если данные были <10 лакхов, то приложение занимает 3 минуты времени.
если это >10 лакхов системы вешают.

Это код, который я использую.

public DataTable GetTheData()
        {
            DataTable dtDataTablesList = new DataTable();
            string NewconnectionString ="Mycooectionstring";
            SqlConnection spContentConn = new SqlConnection(NewconnectionString);
            string sqlselectQuery = "select * from table";
            try
            {
                spContentConn.Open();
                SqlCommand sqlCmd = new SqlCommand(sqlselectQuery, spContentConn);
                sqlCmd.CommandTimeout = 0;
                sqlCmd.CommandType = CommandType.Text;
                sqlCmd.ExecuteNonQuery();
                SqlDataAdapter adptr = new SqlDataAdapter(sqlCmd);
                adptr.Fill(dtDataTablesList);
                spContentConn.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (spContentConn != null)
                    spContentConn.Dispose();
            }
            return dtDataTablesList;
        }


не могли бы вы сказать мне, какой способ лучше всего сделать?

Karthik Harve

Что вы собираетесь делать с этими данными ? вы привязываете эти данные к gidview ?

D-Kishore

мы должны экспортировать эти данные в объект DataTable .CSV-файл

5 Ответов

Рейтинг:
40

Mehdi Gholam

Во-первых, вам, вероятно, не нужно так много строк в вашем клиенте, так как ваш пользователь будет перегружен и явно задушит вашу сеть.

Попробуйте передать свои данные клиенту в виде блоков, скажем, по 1000 строк.

Если вам нужно обработать много строк (например, аналитические), попробуйте обратиться к аналитическому программному обеспечению на стороне сервера и обработке запросов.


_Amy

Абсолютно правильный. 5 ЕД! :)

Mehdi Gholam

Ваше здоровье!

Рейтинг:
28

D-Kishore

Привет друзья,

Это мое окончательное решение для этого.

с помощью этого кода мы можем экспортировать 50 лакхов записей в csv-файл менее чем за 2 минуты.
вместо datatable здесь я использовал datareader.

private void button1_Click(object sender, EventArgs e)
        {

            Stopwatch swra = new Stopwatch();
            swra.Start();
            string NewconnectionString = "myCoonectionString";
            StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
            string sqlselectQuery = "select * from Mytable";
            SqlCommand sqlcmd = new SqlCommand();

            SqlConnection spContentConn = new SqlConnection(NewconnectionString);
            sqlcmd.Connection = spContentConn;
            sqlcmd.CommandTimeout = 0;
            sqlcmd.CommandType = CommandType.Text;
            sqlcmd.CommandText = sqlselectQuery;
            spContentConn.Open();
            using (spContentConn)
            {
                using (SqlDataReader sdr = sqlcmd.ExecuteReader())
                using (CsvfileWriter)
                {
                    //For getting the Table Headers
                    DataTable Tablecolumns = new DataTable();

                    for (int i = 0; i < sdr.FieldCount; i++)
                    {
                        Tablecolumns.Columns.Add(sdr.GetName(i));
                    }
                    CsvfileWriter.WriteLine(string.Join(",", Tablecolumns.Columns.Cast<datacolumn>().Select(csvfile => csvfile.ColumnName)));
                    //For table headers

                    while (sdr.Read())
                    //based on your columns
                        YourWriter.WriteLine(sdr[0].ToString() + "," + sdr[1].ToString() + "," + sdr[2].ToString() + "," + sdr[3].ToString() + "," + sdr[4].ToString() + "," + sdr[5].ToString() + "," + sdr[6].ToString() + "," + sdr[7].ToString() + "," + sdr[8].ToString() + "," + sdr[9].ToString() + "," + sdr[10].ToString() + "," + sdr[11].ToString() + ",");
                       
                }
            }
           swra.Stop();
Console.WriteLine(swra.ElapsedMilliseconds);
}</datacolumn>


Спасибо за все.


Telstra

Эй Кишор,
Я использую ваш код в своем проекте. Но он показывает ошибку на вашем Writer.WriteLine и
линия. Не могли бы вы мне помочь?

Рейтинг:
1

_Amy

Почему вы извлекаете все данные из таблицы за один раз. Хотя у вас есть все данные в sql server, тогда почему вы делаете свою форму излишне медленной? Возьмите только эти записи. В противном случае одна из альтернатив "возьмите топ-1000 записей, манипулируйте ими и обновите их в базе данных". Снова проделайте ту же операцию.

Нет необходимости иметь так много записей в datatable. Если вы выполняете какую-либо операцию поиска, то вы можете перейти в базу данных и искать записи там сами. Это будет быстрее, чем то, что вы имеете в настоящее время.

Это было мое предложение. Есть и некоторые другие способы обработки больших данных в datatable. Для этого обратитесь к приведенным ниже ссылкам:
Советы по использованию таблиц данных с очень большими наборами данных[^]
лучший способ использовать .net Datatable с огромными данными[^]
Хранение больших объемов данных в DataTable[^]


Всего наилучшего.
--Амит


Mehdi Gholam

5 ЕД

_Amy

Спасибо, Мехди. :)

Рейтинг:
1

Karthik Harve

Привет Кишор,

Думаю, этот вопрос уже решен.

проверять этот[^].


D-Kishore

Нам нужно приобрести этот компонент, поэтому я стараюсь по-другому,
Вот почему я опубликовал этот вопрос.

У вас есть какое-нибудь другое решение?

Рейтинг:
1

ros47

Подумайте и об этом тоже....
Экспортируйте все данные в xml из БД и просматривайте xml так, как вам нужно.

Оракул Учеб Экс-
delcare
ctx1 dbms_xmlgen.ctxHandle;
начать
ctx1 := dbms_xmlgen.newContext('SELECT * FROM table **** ');
o_eligible_data:=dbms_xmlgen.getXML(ctx1);
dbms_xmlgen.closeContext(ctx1);
конец;

C# Code - получить ниже код в xml doc или любой другой подходящей переменной.
(! (Оракул.ManagedDataAccess.Типы.OracleClob)(objCmd.Parameters["clobData"].Value)).Функция isnull)
? ((Оракул.ManagedDataAccess.Типы.OracleClob)(objCmd.Parameters["clobData"].Value)).Ценность.ToString() : строка.Пустой;


Код C# - получение определенного узла из xml
resultList = (xElementBalance != null) ? xElementBalance.Элементы("строка").
Где(x => x.Element("CORE_ID").Ценность.Отделка().Равно(_coreId)).ToList() : null;


Код C# - для чтения XML-файла с помощью Xmlreader и создания фрагментов. это очень быстро.

string sourcePath = filesSourcePath[0].Метод toString();
int count = 0;

используя (XmlReader myReader = XmlReader.Создать(sourcePath))
{
int fileCount = 0;
Проверьте новое окно инструментов();
myReader.ReadToDescendant("ResidentialStatement");
myReader.ReadToDescendant("CORE_ID");
делать
{
sb.Append(myReader.ReadOuterXml());
считать++;
if (count%10000 == 0)
{
fileCount++;
строки strXml = "&ЛТ;файл"+ filecount="" +="" "=""&и GT;"+ СБ.Метод toString()+ "";

XmlDocument doc = новый XmlDocument();
doc.LoadXml(strXml);
док.Сохранить(Диспетчер Конфигураций.AppSettings["SourcePathConsolicatedXmlResidentialstatement"].ToString() + fileCount + ".xml");
Приставка.Строку(графу);
Приставка.WriteLine("File Create" + @"D:\InvStm1\POC\Chunks\" + fileCount + ".xml");
СБ.Понятно();
doc = null;
}
}
пока (myReader.ReadToNextSibling("CORE_ID"));
}


Richard Deeming

Этот вопрос был задан, дан ответ и решен ПЯТЬ ЛЕТ НАЗАД!