2016-09-20 5 views
-3

Я разрабатываю прикладную программу aC# windows form, которая сохраняет информацию об ученике, например, название курса и т. д. Мой код при сохранении базы данных sql работает, но когда дело доходит до получения информации, я получаю эту ошибку неверно синтаксис около '='. я думаю, что ошибка в code.please помощи извлечь :)Неверный синтаксис рядом с '='. в коде C#

Вот является получить код:

try 
{ 
    string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name=" + textBoxfname.Text + ""; 
    if (conn.State != ConnectionState.Open) 
     conn.Open(); 
    command = new SqlCommand(sql, conn); 
    SqlDataReader reader = command.ExecuteReader(); 
    reader.Read(); 
    if (reader.HasRows) 
    { 
     labeloutputstudnum.Text = reader[0].ToString(); 
     labeloutputcourse.Text = reader[1].ToString(); 
     labeloutputfname.Text = reader[2].ToString(); 
     labeloutputlname.Text = reader[3].ToString(); 
     byte[] img = (byte[])(reader[4]); 
     if (img == null) 
      pictureBox3.Image = null; 
     else 
     { 
      MemoryStream ms = new MemoryStream(img); 
      pictureBox3.Image = Image.FromStream(ms); 
     } 
    } 
    else 
    { 
     textBoxstudno.Text = ""; 
     textBoxcourse.Text = ""; 
     textBoxfname.Text = ""; 
     textBoxlname.Text = ""; 
     pictureBox3.Image = null; 
     MessageBox.Show("does not exist"); 
    } 
    conn.Close(); 
} 
catch (Exception ex) 
{ 
    conn.Close(); 
    MessageBox.Show(ex.Message); 
} 
+0

я не знаю, но предупреждающий знак в строке SQL –

+3

P.S .: Вы делаете инъекции SQL. –

+3

[SQL INJECTION ALERT !!!! ПРЕДУПРЕЖДЕНИЕ !!!] (https://en.wikipedia.org/wiki/SQL_injection) –

ответ

-3

Вы должны использовать одинарные кавычки для строковых параметров/полей в SQL:

string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE f_name='" + textBoxfname.Text + "'"; 

Но это лучше (более безопасный), чтобы использовать параметры:

string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE [email protected]"; 
if (conn.State != ConnectionState.Open) 
    conn.Open(); 
var command = new SqlCommand(sql, conn); 
command.Parameters.Add("@name", SqlDbType.NVarChar).Value = textBoxfname.Text; 
+11

Не распространяйте использование SQL с уязвимостями SQL-инъекций. –

+8

Это не просто «лучше» использовать параметры - это единственный правильный способ, которым каждый должен писать код. Конкатенация - это просто неправильно, неправильно, неправильно - этого нельзя сказать достаточно убедительно. –

+0

@J ...: Ну, как и во всем, есть исключения из правила. Там * * действительные случаи для объединения строк в операторы SQL. Но этот случай очень не один из них. – David

5
string sql = "SELECT studnum,course,f_name,l_name,color_image FROM table3 WHERE [email protected]"; 
command = new SqlCommand(sql, conn); 
command.Parameters.Add(new SqlParameter("@Name", textBoxfname.Text)); 
+1

Похоже, вы получите выгоду от гнева каждого на другие ответы. Но на самом деле вопрос должен быть просто закрыт к настоящему времени. Сам вопрос не полезен. – sstan

-1

Чтобы ответить на ваш вопрос, ваш запрос sql имеет неправильный синтаксис. Я бы сломал точку в строке sql, чтобы точно увидеть, что случилось. Это должно быть очевидно, когда вы это делаете.

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

"SELECT * FROM table WHERE id ='" + userinput.Text + "'"; 

Таким образом, пользователь вводит какое-либо значение и его туда бросает запрос. Просто так?

Что происходит, если пользователь вводит этот

' OR 1=1; -- 

Ну давайте посмотрим, что ваша строка SQL превращается, когда это добавило

SELECT * FROM table WHERE id = '' OR 1=1; -- ' 

Итак, строка запроса говорит выбрать идентификатор или где 1 = 1, что означает, что true, что означает все.

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

Пожалуйста, изучите параметризацию. Это очень легко в C#.

MSDN Article on C# Parameterization

1

Я вижу несколько ошибок:

  1. Наиболее очевидным, всегда использовать параметры в операторах SQL.
  2. Всегда используйте блоки для очистки соединений.
  3. Не используйте соединения повторно, это неверно, поскольку сервер SQL будет автоматически (по умолчанию, если вы не отключите его с помощью исключения) используйте пул соединений.

    // НЕ используйте повторно соединения, при необходимости создайте новый! using (var conn = новый SqlConnection (/ использование подключение из Интернета/приложение.config /)) { const string sql = "SELECT studnum, course, f_name, l_name, color_image FROM table3 WHERE f_name = @name";

    command = new SqlCommand(sql, conn); 
    command.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar) { Value = textBoxfname.Text}); 
    
    conn.Open(); 
    
    /* rest of code unchanged but do not call conn.Close(), the using block will do this for you 
    

    }

Смежные вопросы