Member 13608869 Ответов: 2

Как получить данные из базы данных в созданном вручную столбце datagridview


Я пытаюсь получить данные из базы данных в datagridview1 для вручную созданного столбца.
Я создал четыре столбца datagridview1: 1.Serial , 2.CrLedgerName , 3.Amount , 4.Narration. я хочу получить данные в этом столбце datagridview1, которые я вручную добавил в свой gridview.Я пытаюсь использовать следующий код ниже.

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

cn.Open();
SqlCommand cmd = cn.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Select SNo,DrLedgerName,Amount,Narration from ReceiptVoucher where Rid='" + TxtSearch.Text + "'";
cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
dataGridView1.Rows.Add(dt.Rows.Count);
foreach (DataRow item in dt.Rows)
{
    foreach (DataGridViewRow dr in dataGridView1.Rows)
    {
        //MessageBox.Show("");
        //dataGridView1.DataSource = rdr;
        dr.Cells[0].Value = item["SNo"].ToString();
        dr.Cells[1].Value = item["DrLedgerName"].ToString();
        dr.Cells[2].Value = item["Amount"].ToString();
        dr.Cells[3].Value = item["Narration"].ToString();
    }
}
cn.Close();
dataGridView1.Refresh();

Richard Deeming

cmd.CommandText = "Select SNo,DrLedgerName,Amount,Narration from ReceiptVoucher where Rid='" + TxtSearch.Text + "'";

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

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

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

cmd.CommandText = "Select SNo,DrLedgerName,Amount,Narration from ReceiptVoucher where Rid = @Rid";
cmd.Parameters.AddWithValue("@Rid", TxtSearch.Text);

Member 13608869

сэр это приводит к тому же самому с предыдущим результатом

PeejayAdams

Да, результат был бы таким же в обычных обстоятельствах, но Ричард говорит, что если вы просто добавляете пользовательский текст к строке запроса, ваше программное обеспечение очень легко захватить.

Что произойдет, если я введу следующее в TxtSearch?

';DROP TABLE ReceiptVoucher

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

Серьезно, прочтите некоторые статьи, которые Ричард связал - SQL - инъекция является одним из самых распространенных источников существующих уязвимостей безопасности - это такая важная вещь-поймите это, прежде чем делать что-либо еще.

Member 13608869

о все в порядке да я только что прочитал это

2 Ответов

Рейтинг:
8

Member 13608869

Цитата:
спицы.Открыть();
Команда sqlcommand cmd в = ЦН.CreateCommand();
УМК.Свойство Commandtype = Значение Commandtype.Текст;
//cmd.CommandText = "Select SNo,DrLedgerName,Amount,Narration from ReceiptVoucher where Rid='" + TxtSearch.Текст + "'";
УМК.Свойства commandtext = "выбрать СНО,DrLedgerName,суммы,повествование от ReceiptVoucher где Мпог = @избавить";
cmd.параметры.AddWithValue ("@Rid", TxtSearch.Текст);
УМК.Метод executenonquery();
DataTable dt = новый DataTable();
SqlDataAdapter da = новый SqlDataAdapter(cmd);
да.Заполнить(ДТ);
dataGridView1.Строк.Добавить(ДТ.Строк.Рассчитывать);
Серийный.DataPropertyName = "SNo";
CrLedgerName.DataPropertyName = "Drledgerame";
Сумма.DataPropertyName = "Сумма";
Повествование.DataPropertyName = "Повествование";
dataGridView1.AutoGenerateColumns = false;
dataGridView1.Источник данных = ДТ;


Рейтинг:
2

OriginalGriff

Чтобы добавить к тому, что говорит Ричард, две вещи:
1) как говорит райхард, никогда не объединяйте строки для построения 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;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

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

2) сбросьте свой код с этой строки и далее:
dataGridView1.Rows.Add(dt.Rows.Count);
Замените его вот этим:
dataGridView1.DataSource = dt;
и посмотрим, что получится.


Member 13608869

хорошо, спасибо.Приведенный ниже код работает
проверьте это есть ли в нем что то такое