Goran Bibic Ответов: 2

Две струны когда-нибудь с#


У меня есть две струны

Нет никакого результата

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

String 1 = "select id from dbo.normativi_lista where name="+ nametextbox.tex


String 2="select * from dbo.normativi_roba where id_fakture=" + String1


<pre>
            PullData();

            using (SqlConnection openCon = new SqlConnection(con))

            {
                String selectid = "select id from dbo.normativi_lista where naziv= " + nazivTextBox.Text;

                String saveStaff = "SELECT id, redni_broj as 'R.b.', sifra as 'Šifra', naziv as 'Naziv', proizvodjac as 'Proizvođač', jedinica_mjere as 'J.M.',"
                                 + "kolicina as 'Količina', prosjecna_nab_cijena as 'Pr. Nab. Cij.', iznos as 'Iznos' from dbo.normativi_roba where id_fakture=" + selectid;



                Console.WriteLine(saveStaff);


                openCon.Open();

                using (SqlDataAdapter querySaveStaff = new SqlDataAdapter(saveStaff, con))

                {

                    DataTable dt = new DataTable();
                    querySaveStaff.Fill(dt);
                    NormativRobaDataGridView.DataSource = dt;
                    NormativRobaDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                    NormativRobaDataGridView.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;


                    NormativRobaDataGridView.Columns["id"].Visible = false;
                    NormativRobaDataGridView.Columns["R.b."].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
                    NormativRobaDataGridView.Columns["R.b."].Width = 80;
                    NormativRobaDataGridView.Columns["Šifra"].Width = 100;
                    NormativRobaDataGridView.Columns["Naziv"].MinimumWidth = 280;
                    NormativRobaDataGridView.Columns["Naziv"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                    NormativRobaDataGridView.Columns["Proizvođač"].Width = 150;
                    NormativRobaDataGridView.Columns["J.M."].Width = 130;
                    NormativRobaDataGridView.Columns["Količina"].Width = 150;
                    NormativRobaDataGridView.Columns["Pr. Nab. Cij."].Width = 150;
                    NormativRobaDataGridView.Columns["Iznos"].Width = 150;


                    NormativRobaDataGridView.Update();
                    NormativRobaDataGridView.Refresh();

                    //countRowsLabel.Text = "Ukupno normativa: " + NormativListaDataGridView.RowCount.ToString();
                    //countRowsLabel2.Text = "Ukupno stavki: " + NormativRobaDataGridView.RowCount.ToString();
                    this.NormativRobaDataGridView.Sort(this.NormativRobaDataGridView.Columns["R.b."], ListSortDirection.Ascending);


                    //double[] columnData4 = new double[NormativRobaDataGridView.Rows.Count];
                    //columnData4 = (from DataGridViewRow row in NormativRobaDataGridView.Rows
                    //               where row.Cells["Iznos"].FormattedValue.ToString() != string.Empty
                    //               select Convert.ToDouble(row.Cells["Iznos"].FormattedValue)).ToArray();
                    //UkupnoLabel.Text = columnData4.Sum().ToString("#,0.00");

                }

            }

2 Ответов

Рейтинг:
2

OriginalGriff

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

К тому времени, когда вы исправите это во всем своем приложении (и пропустите один экземпляр, и кто-то его найдет), вы, вероятно, обнаружите, что проблема, которую вы заметили, исчезла.


Рейтинг:
0

Richard Deeming

В дополнение к уязвимости SQL-инъекции вы никогда не выполняете свой первый запрос. В конечном итоге вы получите недопустимый SQL-запрос, который выглядит примерно так:

SELECT id, ... FROM dbo.normativi_roba where id_fakture=select id from dbo.normativi_lista where naziv= NULL; DELETE FROM dbo.normativi_roba; --Little Bobby Tables strikes again!

(Где пользователь ввел код: "NULL; удалить из dbo.normativi_roba; --Little Bobby Tables снова наносит удар!")

Вместо этого соедините два запроса вместе и используйте параметр:
const string Query = @"SELECT 
    NR.id, 
    NR.redni_broj as 'R.b.', 
    NR.sifra as 'Šifra', 
    NR.naziv as 'Naziv', 
    NR.proizvodjac as 'Proizvođač', 
    NR.jedinica_mjere as 'J.M.',
    NR.kolicina as 'Količina', 
    NR.prosjecna_nab_cijena as 'Pr. Nab. Cij.', 
    NR.iznos as 'Iznos' 
FROM
    dbo.normativi_roba As NR
    INNER JOIN dbo.normativi_lista As NL
    ON NL.id = NR.id_fakture
WHERE
    NL.naviz = @naviz";

using (SqlConnection openCon = new SqlConnection(con))
using (SqlDataAdapter querySaveStaff = new SqlDataAdapter(Query, openCon))
{
    querySaveStaff.SelectCommand.Parameters.AddWithValue("@naviz", nazivTextBox.Text);
    
    DataTable dt = new DataTable();
    querySaveStaff.Fill(dt);
    ...