Member 14127871 Ответов: 3

Извлечение данных из SQL server на основе существующих данных в столбце C#


Моя программа может считывать excel в datatable, и там есть столбец штрих-кода с данными. Мне нужно, чтобы получить bookcode из SQL Server на основе данных в колонку штрих-код. Как sql-запрос может получить данные каждой ячейки из столбца штрих-кода? Я запутался, чтобы получить данные по столбцу или строке. Мне удалось получить sql - соединение и получить общие записи до сих пор. Надеюсь, вы, ребята, сможете помочь мне в этом деле. спасибо

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

public void filldatagridview(ExcelWorksheet workSheet)
        {
            DataTable dt = new DataTable();

            //Create the data column
            for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
            {
                dt.Columns.Add(col.ToString());
            }
           // for (int row = workSheet.Dimension.Start.Row; row <= workSheet.Dimension.End.Row; row++)
           for (int row = 12; row <= 26; row++)
            {
                DataRow newRow = dt.NewRow(); //Create a row
                int i = 0;
                for (int col = workSheet.Dimension.Start.Column; col <= workSheet.Dimension.End.Column; col++)
                {
                    newRow[i++] = workSheet.Cells[row, col].Text;
                }
                dt.Rows.Add(newRow);

            }

            //// dataGridView2.ColumnHeadersVisible = false; // dataGridView1.Rows.Remove(dataGridView1.Rows[12]);

            dt.Columns.RemoveAt(0); //remove No 
            dt.Columns.RemoveAt(0); //remove article
            
n            //Get BookCode
            SqlConnection conn = new SqlConnection("Server=10.0.0.10;Database=;UserID=;Trusted_Connection=False");
            string query = "SELECT TOP 14 BookCode FROM Inventory";            

            SqlCommand cmd = new SqlCommand(query, conn);
            conn.Open();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dt);

            dataGridView2.DataSource = dt;

            conn.Close();
            da.Dispose();
}

Member 14127871

Обновление, мне удалось получить Буккод, используя следующий запрос
строка запроса = "выбрать BookCode из инвентаря, где штрихкод='" + ДТ.Рядами[1]["3"].Метод toString().Отделка() + "'"; //3 колонка для штрих-кодов

И теперь я думаю, что мне нужно сделать цикл, чтобы получить весь буккод для всех данных столбца штрих-кода, но я не уверен в последовательности и sql-соединении

Richard Deeming

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

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

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

3 Ответов

Рейтинг:
2

Richard Deeming

Что-то вроде этого должно работать и позволит избежать уязвимости SQL-инъекции:

using (SqlConnection conn = new SqlConnection("..."))
using (SqlCommand cmd = new SqlCommand(null, conn))
{
    StringBuilder sb = new StringBuilder("SELECT BookCode FROM Inventory WHERE BarCode In (");
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        if (i != 0) sb.Append(", ");
        
        string name = "@P" + i;
        cmd.Parameters.AddWithValue(name, dt.Rows[i]["3"]);
        sb.Append(name);
    }
    sb.Append(")");
    
    cmd.CommandText = sb.ToString();
    
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    
    dataGridView2.DataSource = dt;
}


Member 14127871

Спасибо, я все понял. Могу ли я спросить, почему данные, которые я получаю, не следуют порядку в столбце штрих-кода? И там, предположительно, пустая ячейка или ноль, так как в штрих-коде есть данные, которые не имеют книжного кода, как я должен добавить нулевое значение?

Richard Deeming

У вас нет ORDER BY пункт о вашем запросе, поэтому порядок результатов не гарантируется.

Если вы хотите исключить записи без a BookCode, вам нужно будет добавить And BookCode Is Not Null к WHERE пункт.

Member 14127871

Я сделал заказ по штрих-коду, и все равно заказ не совпадает с книжным кодом со штрих-кодом. И я хочу, чтобы если в sql нет буккода, совпадающего со штрих-кодом, он напишет в ячейке "не найден буккод". Не исключаю этого. Я действительно ценю вашу помощь спасибо

Member 14127871

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

StringBuilder sb = new StringBuilder("WITH cte AS(SELECT *,ROW_NUMBER() OVER(PARTITION BY Barcode ORDER BY InvtID Asc) rid FROM InventoryCustomer WHERE Barcode In (");

для (int i = 0; i < dt.строк.Граф; i++)
{
если (i != 0) sb.Append(",");

имя строки = "@P" + i;

cmd.параметры.AddWithValue(name, dt.Rows[i]["3"]);
sb.Append(имя);
}
//sb.Append(") ");
СБ.Функции append(")) выберите InvtID,BOOKCODE = коалесцируют(InvtID, 'значение nodata') от КТР, где мпог = 1 союз выберите InvtID=", BOOKCODE='значение nodata, где не существует (выберите 1 из КТР)");

Рейтинг:
1

Ravi Gaur 11

создать разделителями-запятыми строка из штрих-кодов и

любить

string str = "1111, 11212, 2155";


это можно сделать с помощью

foreach(DataRow dr in dt.Rows)
{
  str += dr["barcode"].ToString() + ",";
}


использовать запрос

string query = "SELECT TOP 14 BookCode FROM Inventory where barcode in ('"+ str + "')"; 


Richard Deeming

Только не это!

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

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

Member 14127871

Я тоже попробовал этот метод. Та же проблема произошла, что заказ не следует за данными столбца штрих-кода, и там нет ячейки пустой или нулевой, так как некоторые из штрих-кодов не имеют книжного кода.

Рейтинг:
0

RickZeeland

Используйте SQL ГДЕ статья или В пункт, см.: Оператор SQL IN[^]

Прежде чем использовать значение штрих-кода, Вы должны сначала проверить, является ли оно НУЛЕВОЙ:

var barcode = dt.Rows[0]["Barcode"];

if (barcode != NULL)
{
  // your code ...
}


Member 14127871

Вот так? Я не знаю, как получить столбец штрих-кода в ()

строка запроса query1 = "выбрать Bookcode из инвентаря, где штрих-кода (штрих-кода столбца в объекте DataTable здесь?)";

Я думал, что это что-то вроде foreach(DataRow dr в datatable.Строки) чтобы получить штрих-код?

RickZeeland

Смотрите обновленное решение, вы можете использовать WHERE Barcode IN (1, 2, 3, ...)