Member 13650651 Ответов: 2

Как проверить, существует ли мой строковый массив в моей таблице данных и фильтре


<pre> string[] meassteps = { "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "B10" };

                foreach (string ms in meassteps)
                {
                    conStr = String.Format(conStr, filePath, "Yes");
                    OleDbConnection connExcel = new OleDbConnection(conStr);
                    OleDbCommand cmdExcel = new OleDbCommand();
                    OleDbDataAdapter oda = new OleDbDataAdapter();

                    cmdExcel.Connection = connExcel;

                    DataTable sheets = GetSchemaTable(conStr);
                    connExcel.Open();

                     int cnt = 0;
                     foreach (DataRow r in sheets.Rows)
                         {
                            if (cnt > 0) break;
                            string sheetName = r[2].ToString();

                            DataTable dt = new DataTable(sheetName);


                            cmdExcel.CommandText = "SELECT * From [" + sheetName + "]";
                            oda.SelectCommand = cmdExcel;
                            oda.Fill(dt);

                            dtArray[cnt] = dt;

                            //dt.DefaultView.RowFilter = "measstep";

                            DataRow[] row;
                            row = dt.Select(ms);
                            if (row != null & row.Length > 0)
                            {
                                dt = row.CopyToDataTable();
                                dt = dt.DefaultView.ToTable();

                            }

                }


Всем привет. Здесь у меня есть код, в котором я создал новый строковый массив для поиска шагов измерения от "B1" до "B10" в моей таблице данных, которая имеет столбец с именем "measstep".
То, что мой код должен делать, - это отфильтровывать measstep и помещать его в другую datatable. Если "B1" не существует в столбце "measstep", то найдите следующую строку, которая является "B2", и отфильтруйте B2 и так далее, пока не появится "B10".

Однако у меня есть ошибка, которая гласит: "Не удается найти столбец[B1]" когда строка ms = B1.

Как мне написать свой код таким образом, чтобы я искал measstep, который находится в моей таблице данных?

Что я уже пробовал:

Я попытался поместить свой строковый массив в цикл foreach, чтобы строковый массив существовал в моем datatable.

2 Ответов

Рейтинг:
18

OriginalGriff

объект DataTable.Выбрать не получится: объект DataTable.Выберите Метод (Строка) (System.Data)[^] - вы предоставляете критерии поиска thjat - это просто "B1", или "B2", и т. д.-Что не является поиском. Вам нужно заменить его на "ColumnName = 'B1'" и так далее.

Цитата:
О, Значит, я должен заменить строковый массив[] на ColumnName = B1 на B10?


Это работает следующим образом:
DataTable dt = new DataTable();
dt.Columns.Add("A1");
dt.Columns.Add("A2");
dt.Rows.Add("r1", "B1");
dt.Rows.Add("r2", "B2");
dt.Rows.Add("r3", "B1");
dt.Rows.Add("r4", "B2");
DataRow[] rows = dt.Select("A2 = 'B2'");
foreach (DataRow row in rows)
    {
    Console.WriteLine("{0}:{1}", row[0], row[1]);
    }
Дает:
r2:B2
r4:B2
Поэтому я бы изменил ваш код вот так:
DataRow[] row;
row = dt.Select(string.Format("measstep ='{0}'", ms));


Member 13650651

О, Значит, я должен заменить строковый массив[] на ColumnName = B1 на B10?

OriginalGriff

Ответ обновлен

Member 13650651

Большое спасибо OriginalGriff! Цените это!

OriginalGriff

Всегда пожалуйста!

Рейтинг:
12

Maciej Los

Прежде всего: если вы хотите использовать foreach(...) петля, я бы переместил несколько строк вашего кода за пределы foreach(...) петля должная к эффективности. Те несколько строк, где вы открываете соединение Excel и заполнить таблицу.
Во-вторых, вам не нужен второй цикл (foreach (DataRow r in sheets.Rows)), потому что вы используете Select метод фильтрации данных!

foreach(string ms in meassteps)
{
	DataRow[] msrows= dt.Select(string.Format("measstep Like %{0}%", ms));
}


Другой способ заключается в использовании В LINQ.
Если вы хотите фильтровать datatable, сравнивая каждую строку с коллекцией строк, вы можете достичь этого с помощью Where() + Any():
var filteredrows = dt.AsEnumerable()
	.Where(x=> meassteps.Any(y=> x.Field<string>("measstep").Contains(y)))
	.ToList();

или перекрестное соединение:
var filteredrows1 = from dr in dt.AsEnumerable()
	from ms in meassteps
	where dr.Field<string>("measstep").Contains(ms)
	select dr;


Member 13650651

Спасибо Мацей Лос, это работает! Очень ценю это.

Maciej Los

Всегда пожалуйста.

Member 13650651

Другой вопрос, у меня есть код для фильтрации каждого "МС". Я поставил код в цикле foreach?

Maciej Los

Смотрите первую часть моего ответа. ;)

Member 13650651

если B1 равен null, как мне продолжить цикл и запустить свой код фильтра для B2, который не является null?

Wendelius

Хорошо объяснено

Maciej Los

Спасибо, Мика.