Member 12267555 Ответов: 4

Я не знаю, что такое errore в этом коде


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Configuration;

namespace TestCon
{
    public partial class index : System.Web.UI.Page
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
        protected void Page_Load(object sender, EventArgs e)
        {
            con.Open();
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            SqlCommand cmd = new SqlCommand("insert into tbl_user values('"+TextName.Text+"','"+TextAdd.Text+"','"+TextDate.Text+"')",con);
            cmd.ExecuteNonQuery();
            con.Close();
            LabSave.Visible = true;
            LabSave.Text = "Data Save";
            TextName.Text = "";
            TextAdd.Text = "";
            TextDate.Text = "";


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

дайте мне ошибку при запуске веб-приложения в этом предложении
cmd.ExecuteNonQuery();
           con.Close();

F-ES Sitecore

Всякий раз, когда ваш код выдает ошибку, всегда говорите, что это за ошибка, а также строка, на которую она выбрасывается.

Как бы то ни было, ваша проблема почти наверняка будет решена с помощью параметризованных запросов (google "ado.net параметризованные запросы")

4 Ответов

Рейтинг:
35

#realJSOP

0) Не открывайте соединение с БД при загрузке страницы. Подождите, пока вам действительно нужно, чтобы он был открыт, прежде чем делать это.

1) Используйте параметризованные запросы, чтобы избежать атак SQL-инъекций

Лучший код:

SqlConnection con = null;
SqlCommand cmd = null;
try
{
    using (con = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"]))
    {
        con.Open();
        string query = "insert into tbl_user (column1, column2, ...) values (@col1, @col2, ...)";
        SqlParameter[] parameters = new SqlParameter[]
        {
            new SqlParameter("@col1", col1Value),
            new SqlParameter("@col2", col2Value),
            ...
        };
        using (cmd = new SqlCommand(query, con))
        {
            cmd.CommandType = CommandType.Text;
            cmd.Parameters.AddRange(parameters);
            cmd.ExecuteNonQuery();
        }
    }
}
catch (Exception ex)
{
    // do something with exception
}


CHill60

Опереди меня. Однако я добавлю несколько вещей
Edit - 5D кстати

Member 12267555

не работает извините

#realJSOP

Чувак, я набрал его без того, чтобы иметь доступную IDE. Будьте программистом и исправьте это. Это в основном там, так что это действительно не должно быть трудно. Вообще.

#realJSOP

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

Рейтинг:
2

CHill60

См. Решение 1.

Я придумал похожее решение :

using SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString)
{
	con.Open();
	SqlCommand cmd = new SqlCommand("insert into tbl_user values(@name, @add, @date)",con);
	cmd.Parameters.AddWithValue("@name", TextName.Text);
	cmd.Parameters.AddWithValue("@add", TextAdd.Text);
	cmd.Parameters.AddWithValue("@date", TextDate.Text);
	cmd.ExecuteNonQuery();
	// rest of your code 
	// ...
	
}//This closes the using and therefore closes your connection and properly disposes of it
Обратите внимание на комментарий в самом конце ... для получения дополнительной информации см. оператор using (Справочник по c#) | Майкрософт документы[^]

Если вы все еще получаете ошибку после использования параметров, то проверьте содержимое вашего TextDate.Text - ты действительно можешь назначить мне свидание? Возможно, вы захотите рассмотреть вопрос о введении некоторой проверки, которая гарантирует, что это действительная дата.


Member 12267555

не работает извините

CHill60

Вы не хотите дать мне ключ к разгадке того, как это не работает? Подсказка - фактическое сообщение об ошибке-это действительно хорошее место для начала, ваш фактический код (после попытки применить предлагаемые решения) Это тоже хорошая идея. Помогите нам помочь вам

#realJSOP

Да, он действительно программист...

CHill60

Я собирался сделать горький комментарий о том, куда делась наша работа, но теперь я это отпустил :-)

#realJSOP

Кстати, вы можете использовать DateTime.TryParse для преобразования текста в DateTime или просто сделать это Convert.ToDateTime и если он создает исключение, это не действительная дата.

Рейтинг:
2

Liktor Janos

Проверьте поля таблицы базы данных. В таблице БД точно такое же количество полей, как и в вашей SQL-команде? Однако без точного сообщения об ошибке это просто дикая догадка.

И прислушайтесь к намекам других респондентов об использовании и проблемах SQL-инъекции, это может привести к серьезным проблемам.

РЕДАКТИРОВАТЬ:
Если вы определяете команду следующим образом:

insert into tbl_user (field1, field2, field3) values (@param1, @param2, @param3);
затем:
* код не аварийно завершается при добавлении дополнительных полей в таблицу tbl_user,
* вы не обязаны добавлять все ненужные параметры в эту команду.


Рейтинг:
0

Patrice T

Цитата:
дайте мне ошибку при запуске веб-приложения в этом предложении

Это хорошая идея, чтобы дать текст ошибки, как он говорит, что это ошибка.

SqlCommand cmd = new SqlCommand("insert into tbl_user values('"+TextName.Text+"','"+TextAdd.Text+"','"+TextDate.Text+"')",con);

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


Member 12267555

ошибка в
против.Открыть();

Patrice T

Это, конечно, не точное сообщение об ошибке.

Member 12267555

я не знаю но если у тебя есть новая идея скажи мне
тнх

Member 12267555

Все, что вам нужно сделать, это создать страницу регистрации данных, связанную с базой данных SQL Server

Member 12267555

я использую sql server 2012 & vb 2012 c#

#realJSOP

Мы зря теряем время. Он хочет, чтобы мы делали за него его работу.

Patrice T

Я знаю :)