0

Как извлечь данные из базы данных SQL Server в C#?

12

У меня есть таблица в базе данных с тремя столбцами: firstname, Lastname и age. В своем C# приложении для Windows я создал три текстовых поля, названные textbox1, и установил соединение с SQL Server следующим образом:

SqlConnection con = new SqlConnection("Data Source = .;
                                       Initial Catalog = domain;
                                       Integrated Security = True");
con.Open();
SqlCommand cmd = new SqlCommand("Select * from tablename", con);

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

Я попробовал следующий метод, но он не работает:

cmd.CommandText = "select * from tablename where firstname = '" + textBox1.Text + "' ";

Как мне получить остальные значения и отобразить их в текстовых полях?

5 ответ(ов)

1

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

"Select * from Employees where FirstName='" + Textbox.Text + "'"

вы правильно изменили на:

"Select * from Employees where FirstName=@fName"
oCmd.Parameters.AddWithValue("@fName", fName);

Теперь давайте разберемся, что будет делать этот блок кода:

Этот код выполняет SQL-запрос к вашей базе данных, чтобы проверить, есть ли какие-либо имена, совпадающие с тем, что вы передали. Если совпадение найдено, данные будут сохранены в объекте класса Person (однако ниже я предоставлю код самого класса для большей ясности). Если совпадений нет, свойства объекта Person останутся null.

Важно помнить, что если в таблице будет более одного человека с совпадающим именем, то будет сохранен и возвращен только последний найденный объект. Если вы хотите сохранить всех людей с таким именем, вам стоит использовать List<Person>.

Вот упрощённый класс Person, чтобы сделать ваш код более аккуратным:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Для вызова метода используйте следующее:

Person x = SomeMethod("John");

Затем вы можете заполнять текстовые поля значениями из объекта Person так:

txtLastName.Text = x.LastName;

Не забудьте также проверить, что объект x не равен null, прежде чем пытаться получить данные из свойств, чтобы избежать исключений в вашем коде.

0

Вопрос: Как создать класс DbManager для доступа к данным пользователей в базе данных SQL?

Вот пример реализации класса DbManager, который подключается к базе данных и получает данные пользователей:

class DbManager
{
    SqlConnection connection;
    SqlCommand command;

    public DbManager()
    {
        connection = new SqlConnection();
        connection.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|DatabaseName.mdf;Integrated Security=True;User Instance=True";
        command = new SqlCommand
        {
            Connection = connection,
            CommandType = CommandType.Text
        };
    }

    public bool GetUsersData(ref string lastname, ref string firstname, ref string age)
    {
        bool returnvalue = false;
        try
        {
            command.CommandText = "SELECT * FROM TableName WHERE firstname=@firstname AND lastname=@lastname";
            command.Parameters.Add("firstname", SqlDbType.VarChar).Value = firstname;
            command.Parameters.Add("lastname", SqlDbType.VarChar).Value = lastname;

            connection.Open();
            using (SqlDataReader reader = command.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        lastname = reader.GetString(1);
                        firstname = reader.GetString(2);
                        age = reader.GetString(3);
                    }
                }
            }
            returnvalue = true;
        }
        catch
        {
            // Здесь можно обработать исключение или записать в журнал
        }
        finally
        {
            connection.Close();
        }
        return returnvalue;
    }
}

Затем, чтобы использовать этот класс при нажатии на кнопку (например, btnretrieve), добавьте следующий код в обработчик события:

private void btnretrieve_Click(object sender, EventArgs e)
{
    try
    {
        string lastname = null;
        string firstname = null;
        string age = null;

        DbManager db = new DbManager();
        bool status = db.GetUsersData(ref lastname, ref firstname, ref age);
        
        if (status)
        {
            txtlastname.Text = lastname;
            txtfirstname.Text = firstname;
            txtAge.Text = age;       
        }
    }
    catch
    {
        // Обработка исключений
    }
}

Пояснения:

  • Класс DbManager: Содержит логику подключения к базе данных и методы для выборки данных.
  • Метод GetUsersData: Выполняет SQL-запрос с использованием параметров для предотвращения SQL-инъекций.
  • Обработчик btnretrieve_Click: При нажатии на кнопку, он создает экземпляр DbManager, получает данные пользователей и заполняет текстовые поля на форме, если данные успешно найдены.

Рекомендуется добавить обработку исключений в catch блоках для лучшего управления ошибками и диагностикой.

0

Чтобы извлечь данные из базы данных в C#, вы можете использовать следующий пример кода:

private SqlConnection Conn;

private void CreateConnection()
{
    string ConnStr = ConfigurationManager.ConnectionStrings["ConnStr"].ConnectionString;
    Conn = new SqlConnection(ConnStr);
}

public DataTable getData()
{
    CreateConnection();

    string SqlString = "SELECT * FROM TableName WHERE SomeID = @SomeID;";

    SqlDataAdapter sda = new SqlDataAdapter(SqlString, Conn);
    sda.SelectCommand.Parameters.AddWithValue("@SomeID", yourSomeIDValue); // Убедитесь, что передаете значение для параметра

    DataTable dt = new DataTable();

    try
    {
        Conn.Open();
        sda.Fill(dt);
    }
    catch (SqlException se)
    {
        // Здесь можно обработать SqlException
        throw; // Прокидываем исключение
    }
    catch (Exception ex)
    {
        // Здесь можно обработать общее исключение
        throw; // Прокидываем исключение
    }
    finally
    {
        Conn.Close(); // Закрываем подключение в блоке finally
    }
    return dt;
}

Примечания:

  1. Убедитесь, что значение yourSomeIDValue передается правильно для параметра @SomeID, иначе запрос не будет работать.
  2. Я добавил механизм для передачи параметра в запрос, что помогает избежать SQL-инъекций.
  3. Обработка исключений осуществляется базовым образом. Возможно, вы захотите добавить более детальную обработку для конкретных случаев.
  4. Не забывайте закрывать соединение с базой данных, лучше использовать блок finally.
0

Вы можете использовать этот простой метод после настройки вашего соединения:

private void getAgentInfo(string key) // "key" - это ваш параметр поиска в базе данных
{
    con.Open();
    string sqlquery = "SELECT * FROM TableName WHERE firstname = @fName";

    SqlCommand command = new SqlCommand(sqlquery, con); 
    SqlDataReader sReader;

    command.Parameters.Clear();
    command.Parameters.AddWithValue("@fName", key);
    sReader = command.ExecuteReader();

    while (sReader.Read())
    {
        textBoxLastName.Text = sReader["Lastname"].ToString(); // SqlDataReader
        // ["Lastname"] - это имя столбца, который вы хотите получить из БД

        textBoxAge.Text = sReader["age"].ToString();
        // ["age"] - еще один столбец, который вы хотите получить
    }
    con.Close();
}

Теперь вы можете передать ключ в этот метод, используя ваш textBoxFirstName, следующим образом:

getAgentInfo(textBoxFirstName.Text);

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

0

Этот фрагмент кода может быть полезен для тестирования и валидации данных, передаваемых из базы данных в API. В нем реализован метод GetValuesFromDB, который выполняет запрос к базе данных и возвращает список значений, соответствующих определенному коду местоположения.

class Db
{
    private readonly static string ConnectionString =
            ConfigurationManager.ConnectionStrings
                        ["DbConnectionString"].ConnectionString;

    public static List<string> GetValuesFromDB(string LocationCode)
    {
        List<string> ValuesFromDB = new List<string>();
        string LocationqueryString = "select BELocationCode,CityLocation,CityLocationDescription,CountryCode,CountryDescription " +
            $"from [CustomerLocations] where LocationCode='{LocationCode}';";

        using (SqlConnection Locationconnection = new SqlConnection(ConnectionString))
        {
            SqlCommand command = new SqlCommand(LocationqueryString, Locationconnection);
            try
            {
                Locationconnection.Open();
                SqlDataReader Locationreader = command.ExecuteReader();
                while (Locationreader.Read())
                {
                    for (int i = 0; i <= Locationreader.FieldCount - 1; i++)
                    {
                        ValuesFromDB.Add(Locationreader[i].ToString());
                    }
                }
                Locationreader.Close();
                return ValuesFromDB;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
    }
}

Обратите внимание, что для успешного выполнения этого кода вам потребуется строка подключения (в вашем случае это "DbConnectionString"). Надеюсь, это будет полезно!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь