Member 14083059 Ответов: 3

Как вставить код на кнопку click in ASP.NET веб-приложение


Я пишу код для вставки данных в таблицу базы данных он работает почти хорошо но одно значение не вставляется в таблицу базы данных coulumn
в базе данных один couloumn show-System.Web.UI.WebControls.текстовый
Системы.Веб.Пользовательского интерфейса.WebControls.текстовый
Системы.Веб.Пользовательского интерфейса.WebControls.текстовый
Системы.Веб.Пользовательского интерфейса.WebControls.текстовый

я получаю ошибку, где имя текстового поля-bstocks.Text

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

namespace NovletyShop
{
    public partial class AdBooks : System.Web.UI.Page
    {
        SqlConnection con;
        SqlCommand cmd;

       
        protected void Page_Load(object sender, EventArgs e)
        {
           String path = "Data Source=HOME-PC\\SQLEXPRESS;Initial Catalog=NoveltySystem;Integrated Security=True";
           con = new SqlConnection();
           con.ConnectionString = path;
           con.Open();
           blang.SelectedIndex = 0;
        }

        protected void addB_Click(object sender, EventArgs e)
        {
           
            String query = "Insert into addBooks(BkName,BkLanguage,BkStd,BkAuthore,BkEditions,BkPrice,BkStocks) values('" + bname.Text + "','" + blang.Text + "','" + bstd.Text + "','" + bauthore.Text + "','" + bedition.Text + "', '" + bprice.Text + "','" + bstocks + "')";
            cmd = new SqlCommand(query, con);
            cmd.ExecuteNonQuery();
            con.Close();

3 Ответов

Рейтинг:
1

Vincent Maverick Durano

Как уже заметили некоторые участники, ваш код плох, а логика запутана. Во-первых, вы должны НЕ добавьте значения вашего TextBox к вашему SQL-оператору, поскольку он потенциально может привести вас к SQL Injection атака. Вот статья, которую я написал некоторое время назад, чтобы продемонстрировать, насколько это опасно: [^]

Во-вторых, не нужно жестко кодировать строку подключения и вставлять ее в код C#. Connection String должен быть помещен в ваш файл web.config под элементом connectionStrings: Создание строки подключения и работа с SQL Server LocalDB | Microsoft Docs[^]

Например:

<connectionStrings>
  <add name="MyDBConnectionString" connectionString="Data Source=HOME-PC\\SQLEXPRESS;Initial Catalog=NoveltySystem;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>


Затем вы можете ссылаться на значение строки подключения с помощью ConfigurationManager класс вроде этого:

string dbConnectionString = ConfigurationManager.ConnectionStrings["MyDBConnectionString"].ConnectionString;


В-третьих, не инициализируйте свой SqlConnection в Page_Load событие, так как вы вставляете данные в ButtonClick событие.

В-четвертых, сделайте привычкой класть объекты, которые едят ресурсы, такие как SqlConnection, SqlCommand внутри блока использования, чтобы гарантировать, что объекты будут правильно утилизированы и после того, как они будут использованы.

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

Ваш код теперь будет выглядеть примерно так:

private void InsertRecord(string name, string language, string std, string author, string edition, string price, string stock){
      string dbConnectionString = ConfigurationManager.ConnectionStrings["MyDBConnectionString"].ConnectionString;
	using (SqlConnection connection = new SqlConnection(dbConnectionString)) {
                string sql = "INSERT INTO addBooks(BkName,BkLanguage,BkStd,BkAuthore,BkEditions,BkPrice,BkStocks) VALUES (@BookName,@BookLanguage,@BookStd,@BookAuthor,@BookEdition,@BookPrice,@BookStock)";
                using (SqlCommand cmd = new SqlCommand(sql, connection)) {

                        connection.Open();
			cmd.Parameters.AddWithValue("@BookName", name);
	        	cmd.Parameters.AddWithValue("@BookLanguage", language);
			cmd.Parameters.AddWithValue("@BookStd", std);
			cmd.Parameters.AddWithValue("@BookAuthor", author);
			cmd.Parameters.AddWithValue("@BookEdition", edition);
                        cmd.Parameters.AddWithValue("@BookPrice", price);
                        cmd.Parameters.AddWithValue("@BookStock", stock);
			cmd.ExecuteNonQuery();
                }
 	}
}

protected void addB_Click(object sender, EventArgs e){
        InsertRecord(bname.Text,blang.Text,bstd.Text,bauthore.Text,bedition.Text, bprice.Text,bstocks);
}


Примечание: возможно, потребуется дважды проверить datatype вы использовали в своем SQL Database поскольку мы передаем все параметры как string datatype в этом примере. Например, если BkPrice и BkStocks столбцы в вашей базе данных-это decimal и integer, то вам нужно изменить свой код C# datatype также.

Надеюсь, это поможет!


Рейтинг:
0

Richard MacCutchan

Прочесть bobby-tables.com: руководство по предотвращению SQL-инъекций[^]. Это объясняет, почему вы никогда не должны использовать конкатенацию строк для создания SQL cpmmands. Вы строите свою команду на основе информации, предоставленной пользователем, не пытаясь проверить, являются ли эти данные действительными или нет.


Рейтинг:
0

Wendelius

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

Я бы рекомендовал пройти через это Правильное выполнение операций с базой данных[^]. Одни и те же принципы применяются независимо от типа пользовательского интерфейса