Karam Ibrahim Ответов: 4

Код C# для проверки наличия данных одного столбца из таблицы в других таблицах


Я очень ценю если кто нибудь мне поможет я запутался я хочу проверить одну запись из таблицы а чтобы проверить существует ли она в другой таблице В.
Я подсчитываю, сколько данных было введено в таблицу B.

Я пробовал много раз, но это не работает.

например:

   A                       B
------------------------------
John                     John
Joon                     Jorge
Jorge                    Joon
Elizabet                 Elizabet
Suzan                    Suzan
                         Elizabet
                         Joon
                         Suzan
                         John
                         Elizabet


Ответ должен быть таким:

John = 2
Joon = 2
jorge = 1
Elizabet = 3
Suzan = 2


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

using (ImportInvoiceMasterForm.ApplicationSqlConnection2 = new SqlConnection(MainForm.ApplicationDataBase))
            {
                ImportInvoiceMasterForm.ApplicationSqlConnection2.Open();
                using (ImportInvoiceMasterForm.ApplicationSqlCommand1 = new SqlCommand("SELECT * FROM TBL_Stock_Item", ImportInvoiceMasterForm.ApplicationSqlConnection2))
                using (ImportInvoiceMasterForm.ApplicationSqlDataReader1 = ImportInvoiceMasterForm.ApplicationSqlCommand1.ExecuteReader())
                {
                    while (ImportInvoiceMasterForm.ApplicationSqlDataReader1.Read())
                    {
                        ImportInvoiceMasterForm.GetImportQuantity = 0;
                        #region Get Import Quantity
                        using (ImportInvoiceMasterForm.ApplicationSqlConnection1 = new SqlConnection(MainForm.ApplicationDataBase))
                        {
                            ImportInvoiceMasterForm.ApplicationSqlConnection1.Open();
                            using (ImportInvoiceMasterForm.ApplicationSqlCommand = new SqlCommand("SELECT * FROM TBL_Import_Items WHERE ImportItemName='" + ImportInvoiceMasterForm.ApplicationSqlDataReader1.GetString(1) + "'", ImportInvoiceMasterForm.ApplicationSqlConnection1))
                            using (ImportInvoiceMasterForm.ApplicationSqlDataReader = ImportInvoiceMasterForm.ApplicationSqlCommand.ExecuteReader())
                            {
                                while (ImportInvoiceMasterForm.ApplicationSqlDataReader.Read())
                                {
                                    GetImportQuantity += double.Parse(ImportInvoiceMasterForm.ApplicationSqlDataReader.GetValue(4).ToString());
                                }
                            }
                        }
                        #endregion Get Import Quantity
                    }
                }
            }

Eric Lynch

Более эффективным средством достижения этой же цели может быть использование объединения и группирования по столбцам, которые являются общими для двух таблиц. Поскольку вы не включаете много имен столбцов в свой запрос, трудно привести хороший пример, но что-то вроде следующего:

выбранная категория.CategoryID, COUNT(категории.CategoryID) как RowCount из продуктов
Левое внешнее соединение категорий с категориями.Кодтипа=Товары.CategoryID
Группировка по категориям.CategoryID

Если вы не хотите нулевых отсчетов, вы можете использовать Левое внутреннее соединение вместо этого.

Karam Ibrahim

Дорогой Эрик, я хочу использовать это утверждение о SELECT также я хочу использовать RowCount позже в коде C#. куда я могу его положить.

Gerry Schmitz

Выберите из A, где "имя" находится в B.
Затем выберите счетчик, сгруппированный по имени из предыдущего результата.

Richard Deeming

"SELECT * FROM TBL_Import_Items WHERE ImportItemName='" + ImportInvoiceMasterForm.ApplicationSqlDataReader1.GetString(1) + "'"

Не делай этого так!

Если пользователи имеют какой-либо контроль над содержимым таблицы запасов, ваш код будет уязвим для SQL-инъекция[^].

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

using (ImportInvoiceMasterForm.ApplicationSqlCommand = new SqlCommand("SELECT * FROM TBL_Import_Items WHERE ImportItemName=@ImportItemName", ImportInvoiceMasterForm.ApplicationSqlConnection1))
{
    ImportInvoiceMasterForm.ApplicationSqlCommand.Parameters.AddWithValue("@ImportItemName", ImportInvoiceMasterForm.ApplicationSqlDataReader1.GetString(1));
}

4 Ответов

Рейтинг:
33

Maciej Los

Как Эрик Линч[^] уже упоминалось, что вы должны объединять таблицы и группировать их по именам.


SELECT b.Name, COUNT(b.Name) AS Count
FROM TableA AS a 
    JOIN TableB AS b ON a.Name = b.Name
GROUP BY b.Name 

DataTable dtA = new DataTable();
dtA.Columns.Add(new DataColumn("name", typeof(string)));
dtA.Rows.Add(new object[]{"John"});
dtA.Rows.Add(new object[]{"Joon"});
dtA.Rows.Add(new object[]{"Jorge"});
dtA.Rows.Add(new object[]{"Elizabet"});
dtA.Rows.Add(new object[]{"Suzan"});


DataTable dtB = new DataTable();
dtB.Columns.Add(new DataColumn("name", typeof(string)));
dtB.Rows.Add(new object[]{"John"});
dtB.Rows.Add(new object[]{"Jorge"});
dtB.Rows.Add(new object[]{"Joon"});
dtB.Rows.Add(new object[]{"Elizabet"});
dtB.Rows.Add(new object[]{"Suzan"});
dtB.Rows.Add(new object[]{"Elizabet"});
dtB.Rows.Add(new object[]{"Joon"});
dtB.Rows.Add(new object[]{"Suzan"});
dtB.Rows.Add(new object[]{"John"});
dtB.Rows.Add(new object[]{"Elizabet"});

//#standard version
var result = from a in dtA.AsEnumerable()
		join b in dtB.AsEnumerable() on a.Field<string>("name") equals b.Field<string>("name")
		group b by b.Field<string>("name") into names
		select new
		{
			Name = names.Key,
			Count = names.Count()
		};

//#lambda version
var result1 = dtA.AsEnumerable()
		.Join(dtB.AsEnumerable(),
			a => a.Field<string>("name"),
			b => b.Field<string>("name"),
			(a, b) => new {a, b})
		.GroupBy(x=>x.b.Field<string>("name"))
		.Select(grp=> new
		{
			Name = grp.Key,
			Count = grp.Count()
		});

//both methods return the same result:
//John 2 
//Joon 2 
//Jorge 1 
//Elizabet 3 
//Suzan 2 



Примечание: существует несколько способов объединения таблиц, и поэтому результат может быть разным. Для получения более подробной информации, пожалуйста, смотрите: Визуальное представление SQL-соединений[^]
В этот момент я использовал INNER JOIN, из - за ваших выборочных данных и ожидаемого результата.


Рейтинг:
24

abishens

Просто нужно использовать соединения, которые должны решить вашу проблему


Рейтинг:
20

Patrice T

SqlCommand("SELECT * FROM TBL_Import_Items WHERE ImportItemName='" + ImportInvoiceMasterForm.ApplicationSqlDataReader1.GetString(1) + "'", ImportInvoiceMasterForm.ApplicationSqlConnection1))

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам. Пользовательский ввод может варьироваться от неудачного до вредоносного.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]


Рейтинг:
0

Karam Ibrahim

Спасибо, ребята, я решил свою проблему.