Я пытался создать программное обеспечение, которое можно было бы использовать в качестве базы данных для библиотек, поэтому я начал изучать SQL. Я уже нашел способ сохранить книгу в базе данных, но я застрял в поиске в базе данных. Я действительно не знаю, как написать запрос с пользовательским вводом. Я пытался гуглить, но не могу найти ответ. Я застрял в этой проблеме на некоторое время, пожалуйста, помогите мне кто-нибудь (обычно я пишу свой код на своем родном языке, но я переписал его на английском, но если я забыл что-то переписать, мне очень жаль Я немного тороплюсь, когда пишу это).
try
{
using (connection = new SqlConnection(connectionString))
{
if (connection.State == ConnectionState.Closed)
connection.Open();
using(DataTable dt = new DataTable("Search"))
{
using(SqlCommand cmd = new SqlCommand("SELECT * FROM books WHERE name = @name OR name LIKE @name", connection))
{
cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);
cmd.Parameters.AddWithValue("author", string.Format("%{0}%", txtboxSearchAuthor.Text));
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
}
}
}
}
catch (Exception)
{
MessageBox.Show("Something went wrong", "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Как бы вы хотели собирать пользовательский ввод? Требуется ли вам разработать пользовательский интерфейс с текстовым полем для ввода условий поиска? Ваш вопрос о том, как написать метод С# с входными данными, которые вы затем вводите в запрос? Мне трудно понять, о чем вы спрашиваете. Пожалуйста, улучшите свой вопрос.
name = @name OR name LIKE @name
один из них должен быть автор? потому что иначе это утверждение не имеет смысла
Вы почти выполнили задание; тем не менее, некоторые проблемы должны быть исправлены:
try {
// Remove old DataSource if any
if (dataGridView1.DataSource is IDisposable old)
old.Dispose();
using (connection = new SqlConnection(connectionString)) {
// Let sql be readable
// name = @name seems to be redundant: LIKE is broader in the context
string sql =
@"SELECT *
FROM books
WHERE name LIKE @name";
using(SqlCommand cmd = new SqlCommand(sql, connection)) {
// Your command uses just one parameter - @name; no @author is used
cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);
// SqlDataAdapter must know which command to use
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable("Search");
adapter.Fill(dt);
dataGridView1.DataSource = dt;
}
}
}
catch (DbException e) { // Don't catch (= swallow) all the exception
// Message: let user know what went wrong - e.Message
MessageBox.Show($"Something went wrong: {e.Message}",
"Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
Из того, что я понял, вы пытаетесь найти что-то в своей базе данных
ваш запрос выглядит так:
SELECT * FROM books WHERE name = @name OR name LIKE @name
знак знак равно означает, что имя должно совпадать с параметром @name
оператор «НРАВИТСЯ» используется в предложении WHERE для поиска указанного шаблона в столбце.
поэтому, если вы ищете книги с определенным названием, вы можете использовать:
SELECT * FROM books WHERE name = @name
если вы ищете книги с именами, похожими на @name, вы можете использовать:
SELECT * FROM books WHERE name like @name
при использовании подобного оператора вы должны использовать %, чтобы указать сходство обратитесь к этой статье, чтобы вы могли понять
я думаю, в вашем случае лайк для автора
вот ваше окончательное исправление:
using(SqlCommand cmd = new SqlCommand("SELECT * FROM books WHERE name = @name OR name LIKE @author", connection))
{
cmd.Parameters.AddWithValue("@name", txtboxSearchName.Text);
// you were missin an @ in author parameter
cmd.Parameters.AddWithValue("@author", string.Format("%{0}%", txtboxSearchAuthor.Text));
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.Fill(dt);
dataGridView1.DataSource = dt;
}
Убедитесь, что вы не злоупотребляете тегами. Я убрал для вас тег
[visual-studio]
.