SQL-запрос из C # - PullRequest
       2

SQL-запрос из C #

4 голосов
/ 01 апреля 2012

Я пытаюсь запросить базу данных SQL Server из C #

У меня есть класс

Class_A 
{
  public fetch((string name, string last_name))
  {
    SqlConnection conn = null;
    double val = 0;
    string server = "123.444.22.sss";
    string dbase = "xyz";
    string userid = "cnsk";
    string password = "xxxxxx";
    string connection = "Data Source=" + server + ";Initial Catalog=" + dbase 
                        + ";User ID=" + userid + ";Password=" + password;

    conn = new SqlConnection(connection);

    try
    {
      conn.Open();
    }
    catch(Exception)
    {
      string e = "Database error contact administrator";
      MessageBox.Show(e, "Error!");
    }
    try
    {
      SqlDataReader myReader = null;
      SqlCommand myCommand = new SqlCommand("select * from table where NAME"
         + " = name and LAST_NAME = last_name", conn);
      myReader = myCommand.ExecuteReader();
      while (myReader.Read())
      {
        //do something

      }
    }
    catch (Exception e)
    {
      Console.WriteLine(e.ToString());
    }
    return (0);
  }
}

В моем запросе есть проблема.

Когда я задаю обычный запрос «выбрать * из таблицы», это дает мне идеальные результаты.

Но когда я пытаюсь указать, где условие, это дает мне ошибку. Любые предложения, чтобы это исправить? Благодаря.

Ответы [ 4 ]

8 голосов
/ 01 апреля 2012

Используйте параметризованный запрос и другие варианты использования и остановитесь на общих исключениях.

что-то вроде этого, где somName и SomeLastName - это значения, к которым вы хотите запросить.

String sql = "Select * From SomeTable Where [Name] = @Name and [Last_Name] = @LastName";
try
{
  using(SqlConnection conn = new SqlConnection(connection))
  {
    conn.Open();
    using( SqlCommand command = new SqlCommand(sql,conn))
    {
      command.Parameters.Add(new SqlParameter("Name", DbType.String,someName));
      command.Parameters.Add(new SqlParameter("LastName", DbType.String,someLastName));
      using(IDataReader myReader = command.ExecuteReader())
      {
        while (myReader.Read())
        {
           //do something
        }
      }
    }
  } 
  return 0; // Huh?
}
catch(SqlException sex)
{
   Console.Writeline(String.Format("Error - {0}\r\n{1}",sex.Message, sex.StackTace))
}

NB не проверено может быть глупо в этом

6 голосов
/ 01 апреля 2012

⚠️ ПРЕДУПРЕЖДЕНИЕ Этот ответ содержит уязвимость безопасности SQL-инъекций. Не используйте его. Попробуйте вместо этого использовать параметризованный запрос, как описано в некоторых других ответах на этот вопрос.

Попробуйте добавить кавычки вокруг значений в предложении where следующим образом:

select * from table where NAME = 'name' and LAST_NAME = 'last_name'

В вашем случае, когда вы используете переменные, вам нужно добавить кавычки и затем объединить значения переменных в строку. Или вы можете использовать String.Format так:

var sql = String.Format("select * from table where [NAME] = '{0}' and LAST_NAME = '{1}'", name, last_name);
SqlCommand myCommand = new SqlCommand(sql);
4 голосов
/ 01 апреля 2012

Попробуйте

select * from table where NAME = 'name' and LAST_NAME = 'last_name'

вместо

select * from table where NAME = name and LAST_NAME = last_name

Редактировать:

Если name и last_name - ваши параметры, попробуйте следующее:

SqlCommand myCommand = new SqlCommand("select * from table where NAME = @name and LAST_NAME = @last_name", conn); 
myCommand.Parameters.AddWithValue( "@name", name );
myCommand.Parameters.AddWithValue( "@last_name", last_name );

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

1 голос
/ 01 апреля 2012

Текст должен быть процитирован, как говорили другие, но здесь это не совсем правильный ответ. Даже без злого умысла вы столкнетесь здесь с ирландцами, посмотрите, что происходит, когда вы пытаетесь найти мистера О'Нила. Вместо этого используйте параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...