C # - Веб-сайт - SQL Select Statement - PullRequest
1 голос
/ 10 мая 2011

Я хочу использовать оператор выбора, чтобы найти, существует ли запись, которая уже существует.Я поместил код ниже, но он выдает ошибку в dReader = comm.ExecuteReader ();и я не уверен почему.Любая помощь?

    string connString = "Data Source=KIMMY-MSI\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True";

    SqlDataReader dReader;
    SqlConnection conn = new SqlConnection(connString);
    SqlCommand comm = new SqlCommand();
    comm.Connection = conn;

    comm.CommandText = "SELECT * FROM Customers WHERE CustomerID == " + txtID.Text;
    comm.Connection.Open();

    dReader = comm.ExecuteReader();

    if (dReader.HasRows == true)
    {
        Response.Write("Exists");
    }

Ошибка:

Invalid Column Name (whatever I input)

Кажется, что я ищу столбец с именем, который я ввожу, а не фактические данные.

Ответы [ 5 ]

5 голосов
/ 10 мая 2011

Измените == на =. Это неверный SQL как есть.

Также, если txtID.Text не числовой, он должен быть в одинарных кавычках. Вы не должны создавать свой SQL как этот, вместо этого используйте параметр:

comm.CommandText = "SELECT * FROM Customers WHERE CustomerID = @CustomerID";
comm.Parameters.AddWithValue("CustomerID", txtID.Text);    

Подробнее

C # с использованием оператора

ссылка на SQL

SQL-инъекция (почему вы должны параметризировать свои запросы)

4 голосов
/ 10 мая 2011

Похоже, ваша команда имеет проблему:

SELECT * FROM Customers WHERE CustomerID == 1

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

Попробуйте:

SELECT * FROM Customers WHERE CustomerID = 1

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

2 голосов
/ 10 мая 2011

Измените эту строку:

comm.CommandText = "SELECT * FROM Customers WHERE CustomerID == " + txtID.Text;

На эту строку:

comm.CommandText = "SELECT * FROM Customers WHERE CustomerID = @id";
comm.Parameters.AddWithValue("id", int.Parse(txtID.Text));

Предполагая, что ваш идентификатор клиента указан в базе данных как int.

1 голос
/ 10 мая 2011

Вы используете неверный SQL. Ваше имя, чтобы изменить "==" на "=".

Вам также следует рассмотреть возможность упаковки объектов IDisposable в операторы using, чтобы неуправляемые объекты должным образом удалялись и соединения были должным образом закрыты.

Наконец, подумайте об использовании параметров в SQL вместо объединения строк, чтобы избежать атак внедрения SQL:

string connString = @"Data Source=KIMMY-MSI\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True";
string sql = "SELECT * FROM Customers WHERE CustomerID = @CustomerID";
using (SqlConnection conn = new SqlConnection(connString))
using (SqlCommand comm = new SqlCommand(sql, conn))
{
    comm.Connection.Open();
    comm.Parameters.AddWithValue("@CustomerID", txtID.Text);
    using (SqlDataReader dReader = comm.ExecuteReader())
    {
        if (dReader.HasRows == true)
        {
            Response.Write("Exists");
        }   
    }
}
1 голос
/ 10 мая 2011

Оператор equals в SQL - это всего лишь один =.

Кроме того, вам действительно не следует объединять SQL-запросы подобным образом, вы просто открываете себя для атаки SQL-инъекцией .Поэтому измените его следующим образом:

comm.CommandText = "SELECT * FROM Customers WHERE CustomerID = @CustomerId";
comm.Parameters.AddWithValue("@CustomerId", txtID.Text);

См. Остановите атаки SQL-инъекций, прежде чем они остановят вас в MSDN.

...