Member 13985914 Ответов: 2

Getchanges не работает после добавления столбца


когда я добавляю новый столбец программно он не работает во вновь добавленном столбце но работает в остальных столбцах

SqlDataAdapter da;
DataSet ds;


string query = @"Select sale.SaleID,item.ItemID, invoice.InvoiceID,
 Item.ItemName as
item,  invoice.Qty
,invoice.SalePrice as [Sale Price] FROM invoice
JOIN item ON invoice.ItemID = item.ItemID
JOIN sale ON invoice.SaleID = sale.SaleID
where sale.SaleID = '" + textBox1.Text + "'";
da = new SqlDataAdapter(query, con);
ds = new System.Data.DataSet();
da.Fill(ds);
dataGridView1.DataSource = ds.Tables[0];


//creating new column
DataGridViewTextBoxColumn column2 = new DataGridViewTextBoxColumn();
column2.ReadOnly = false;
column2.Name = "column2";
column2.Resizable = DataGridViewTriState.False;
//column1.SortMode = DataGridViewColumnSortMode.Automatic;
column2.HeaderCell.Style.Alignment =
DataGridViewContentAlignment.MiddleCenter;
column2.DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleCenter;
column2.HeaderText = "New Quantity";

//adding column to dataGridView
dataGridView1.Columns.Add(column2);



    private void button3_Click(object sender, EventArgs e)
{

    DataSet dasetGetChanges = ds.GetChanges();
    dataGridView2.DataSource = dasetGetChanges.Tables[0];


}


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

я много искал но не нашел ничего красивого

Richard MacCutchan

Вы должны добавить столбец в свой источник данных, который используется для обновления DataGridView.

Member 13985914

не могли бы вы упомянуть код?.

2 Ответов

Рейтинг:
2

Maciej Los

Прежде всего, не используйте конкатенированный текст в качестве запроса! Это может привести к серьезным проблемам, потому что ваш код SQL-инъекция[^] уязвимый!

Вместо этого вы должны использовать параметризованные запросы!

DataTable dt = new DataTable();
string sSqlConn = "enter connection details here";
using (SqlConnection connection = new SqlConnection(sSqlConn))
{
    string sql = @"SELECT * FROM YourTable WHERE FieldName=@param1";
    connection.Open();
    
    using (SqlCommand command = new SqlCommand(sql, connection))
    {
        command.Parameters.AddWithValue("@param1", textBox1.Text);
        using (SqlDataReader reader = command.ExecuteReader())
        {
            dt.Load(reader); //load data into datatable!	
        }
    }
}
DataColumn dc = dt.Columns.Add("New Quantity", typeof(double));
dc.Expression = "qty * SalePrice";

dataGridView1.DataSource = dt;
}


Для получения более подробной информации, пожалуйста, смотрите:
Коллекции sqlparametercollection.Метод AddWithValue(String, Object) (System.Data.SqlClient) | Microsoft Docs[^]
Написание безопасного динамического sql в sql server[^]
Динамический SQL &SQL инъекция – блог Рауля Гарсии[^]
объект DataColumn.Свойство Выражения (System.Data) | Microsoft Docs[^]
Создание Столбцов Выражений | Microsoft Docs[^]


Рейтинг:
1

MadMyche

Ну, во-первых, ваш код уязвим для SQL-инъекция! Никогда и никогда не создавайте SQL-запрос, разбивая его на части в команде и переменных. Правильный способ сделать это-использовать Parameters.

Это добавляет только 2 строки кода; одна определяет команду, а другая добавляет к ней параметр. Затем эта команда может быть использована для вашего адаптера данных.

string query = @"Select sale.SaleID,item.ItemID, invoice.InvoiceID,
 Item.ItemName as
item,  invoice.Qty
,invoice.SalePrice as [Sale Price] FROM invoice
JOIN item ON invoice.ItemID = item.ItemID
JOIN sale ON invoice.SaleID = sale.SaleID
where sale.SaleID = @SaleID";

SqlCommand cmd = new SqlCommand(query, con);
cmd.Parameters.AddWithValue("@SaleID", textBox1.Text);
da = new SqlDataAdapter(cmd);

Теперь о вашем первоначальном вопросе
Вы хотите добавить новый столбец в свой набор данных для "нового количества". Самый простой способ сделать это-добавить заполнитель в исходный запрос. То, что я сделал, это просто добавил псевдоним к вашему заявлению. Если вам когда нибудь понадобится перейти на объектные модели или строго типизированные наборы данных это изменение также будет содержать правильные метаданные SQL
SELECT sale.SaleID,
	item.ItemID,
	invoice.InvoiceID,
	Item.ItemName as item,
	invoice.Qty,
	invoice.SalePrice as [Sale Price],
	invoice.Qty as [New Quantity]      -- New column prefilled with current values
FROM invoice
JOIN item ON invoice.ItemID = item.ItemID
JOIN sale ON invoice.SaleID = sale.SaleID

Вот некоторые ресурсы о SQL-инъекции, которые вы можете прочитать:
xkcd: подвиги мамы[^]
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Maciej Los

Вот это да!