ASP.NET получает данные с SQL Server

Я пытаюсь получить имя сотрудника из базы данных и заполнить его в текстовом поле для соответствующего идентификатора сотрудника.

Я попробовал этот код, но на странице ничего не происходит. Он просто перезагружается, а текстовое поле (имя) остается пустым.

SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-0FUUV7B\SQLEXPRESS;Initial Catalog=EmployeeDetails;Integrated Security=True");
con.Open();
           
SqlCommand cmd = new SqlCommand("select * from ProfessionalDetails where EmpId='"+EmployeeId.Text+"'", con);
          
SqlDataReader da = cmd.ExecuteReader();

while (da.Read())
{
    Name.Text = da.GetValue(1).ToString();
}
            
con.Close();

Вы отладили его и нашли, в чем проблема, потому что код высокого уровня выглядит нормально, поэтому существует много возможностей проблемы, например, EmployeeId.Text имеет значение null, не может подключиться к db, da.GetValue (1) имеет значение null. Итак, сначала добавьте try и catch, затем отладьте его и найдите строку, в которой проблема,

Pradeep Kumar 19.11.2022 10:24
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
117
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Лучшим решением является выполнение оператора sql через параметризованное значение. Подробности этого процесса приведены ниже:

 using (SqlConnection con = new SqlConnection(live_connectionString))
        {
            using (SqlCommand cmd = new SqlCommand("Query", con))
            {
                con.Open();
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.AddWithValue("@EmpId", employeeId);

                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = cmd;
                var ds = new DataSet();
                da.Fill(ds);
             

                string? name = ds.Tables[0].Rows[1]["Variable name"].ToString();
              
              Name.Text =name;
            };
        }
    }
AddWithValue тоже нехорошее решение, это "зло".
Larnu 19.11.2022 11:55

Если вы не хотите указывать тип параметров, вам следует использовать эти функции. Неплохо использовать это, это также мешает нам в Sql-инъекциях.

Rizwan 19.11.2022 13:14

Другой способ использования функции Add(), которая также содержит тип, о котором я говорил в предыдущем комментарии.

Rizwan 19.11.2022 13:16

«Неплохо использовать это», это, безусловно, может быть; типы данных, которые он передает, могут быть неправильными и привести к тому, что запрос будет несовместимым с SARG. Это плохо и может быть ужасно для производительности.

Larnu 19.11.2022 16:40

Как упоминалось выше в комментариях, у вас много проблем.

вы должны использовать использование с соединением, чтобы избавиться от них.

Вы должны использовать параметризованные запросы, чтобы избежать внедрения SQL.

Поместите свой код в try catch, чтобы вы могли легко определить основную причину проблемы.

Определите строку подключения в файле конфигурации три, чем определение в коде С#.

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

Вы можете использовать ExecuteScalar, он используется, когда вы ожидаете одно значение.

И сначала убедитесь, что текстовое поле имеет ожидаемое значение при вызове этого запроса.

Как уже отмечалось, используйте параметры, и ЛУЧШЕ используйте СТРОГО типизированные параметры.

И нет необходимости использовать набор данных, это одна таблица, поэтому используйте таблицу данных.

таким образом:

        string strSQL = 
            @"select * from ProfessionalDetails where EmpId= @ID";

        using (SqlConnection con = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmd = new SqlCommand(strSQL, con))
            {
                con.Open();
                cmd.Parameters.Add("@ID", SqlDbType.Int).Value = EmployeeID.Text;
                DataTable rstData = new DataTable();
                rstData.Load(cmd.ExecuteReader());
                if (rstData.Rows.Count > 0)
                    Name.Text = rstData.Rows[0]["Name"].ToString();
            }
        }

Другие вопросы по теме