Как извлечь данные из базы данных SQL Server в C#?
У меня есть таблица в базе данных с тремя столбцами: 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 ответ(ов)
Ваш код выглядит неплохо, но я хотел бы сделать несколько замечаний и улучшений. Во-первых, вы используете параметризованный запрос, что делает ваш код более безопасным. Это важно, поскольку конкатенация строк в 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
, прежде чем пытаться получить данные из свойств, чтобы избежать исключений в вашем коде.
Вопрос: Как создать класс 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
блоках для лучшего управления ошибками и диагностикой.
Чтобы извлечь данные из базы данных в 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;
}
Примечания:
- Убедитесь, что значение
yourSomeIDValue
передается правильно для параметра@SomeID
, иначе запрос не будет работать. - Я добавил механизм для передачи параметра в запрос, что помогает избежать SQL-инъекций.
- Обработка исключений осуществляется базовым образом. Возможно, вы захотите добавить более детальную обработку для конкретных случаев.
- Не забывайте закрывать соединение с базой данных, лучше использовать блок
finally
.
Вы можете использовать этот простой метод после настройки вашего соединения:
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
) и другие элементы управления корректно инициализированы.
Этот фрагмент кода может быть полезен для тестирования и валидации данных, передаваемых из базы данных в 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"). Надеюсь, это будет полезно!
"Вставка результатов хранимой процедуры в временную таблицу"
Обновление данных в одной таблице из другой на основе совпадения ID
Как вставить перенос строки в строке VARCHAR/NVARCHAR SQL Server
Возможно ли задать условия в Count()?
with(nolock) или (nolock) - есть ли разница?