SQL Server Неверное имя столбца при добавлении строкового значения

c# asp.net sql database web-services

6807 просмотра

5 ответа

4977 Репутация автора

Я новичок в SQL Server

Я создал свою таблицу следующим образом:

CREATE TABLE Accidents (
     Id INT NOT NULL PRIMARY KEY IDENTITY,
     GUID VARCHAR(100),
     Latitude VARCHAR(100),
     Longitude VARCHAR(100),
     PhotoName VARCHAR(100)        
     )

и я создал веб-сервис для вставки данных в эту таблицу, например:

    SqlConnection con = new SqlConnection(@"workstation id=DatabaseSample.mssql.somee.com;packet size=4096;user id=???;pwd=???;data source=DatabaseSample.mssql.somee.com;persist security info=False;initial catalog=DatabaseSample");

    public string addAccidentToDatabase(string GUID, string imageBase64String, string latitude, string longitude, string photoName)
    {
        SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES ("
            + GUID + "," + latitude + "," + longitude + "," + photoName + ")", con);

        try
        {
            con.Open();
            cmd.ExecuteNonQuery();
        }
        catch (Exception e)
        {
            return e.Message;
        }
        finally
        {
            con.Close();
        }

        return "succeeded";
    }

Все это размещено на бесплатном хостинг-сервере.

Когда я тестирую веб-сервис от VS2010 и когда я передаю числа всем параметрам, новая строка успешно добавляется в таблицу. Но когда я передаю в сервис хотя бы одну строку, например «а», я получаю такой результат:

<string xmlns="http://tempuri.org/">Invalid column name 'a'.</string>

и строка не добавляется. Интересно, почему он считал «а» именем колонки? Кто-нибудь может помочь?

Автор: Hamzeh Soboh Источник Размещён: 11.05.2013 09:55

Ответы (5)


7 плюса

116836 Репутация автора

Решение

Интересно, почему он считал «а» именем колонки?

Это не сложно увидеть. Вы не должны разрабатывать программное обеспечение, развертывать его и надеяться, что оно работает. Вы должны проверить это. Извлеките исполняемый код в метод класса и вызовите его из своего сервиса. При разработке вы вызываете этот метод из программы модульного тестирования или командной строки или из того, что вам нравится тестировать.

Ваша проблема: вы не помещаете кавычки вокруг строк (или varchars, если хотите) в запросе. Вы бы видели это, если бы вы просто напечатали строку запроса в консоли, например.

Но, честно говоря, это наименьшая из ваших проблем. Вы не должны вручную создавать SQL. По крайней мере, используйте параметризованные запросы. Итак, пусть ваш запрос будет:

"INSERT INTO Accidents (GUID, Latitude, Longitude, PhotoName) 
                VALUES (@GUID, @Latitude, @Longitude, @PhotoName)"

И привязать параметры:

cmd.Parameters.AddWithValue("@GUID", GUID);
...
Автор: CodeCaster Размещён: 11.05.2013 09:59

2 плюса

3803 Репутация автора

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

SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName)    
       VALUES ('" + GUID + "','" + latitude + "','" + longitude + "','" + photoName + "')", con);

Однако вы должны заметить, что это крайне небезопасный код. Это очень склонно к внедрению SQL. Попробуйте вместо этого использовать параматеризованные запросы.

Автор: Mike Precup Размещён: 11.05.2013 09:59

2 плюса

21958 Репутация автора

Я предполагаю, что значение GUID начинается с a. Если бы это началось с, 3вы, вероятно, получили бы что-то более интересное.

Поскольку вы передаете его в виде строки, а не экранируете его кавычками, вы получаете сообщение об ошибке.

SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES ("
            + "\"" + GUID + "\"," + latitude + "," + longitude + ",\"" + photoName + "\")", con);

Несколько моментов:

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

  2. почему ты хранишь guidкак varchar()? Существует очень хороший Guidтип данных.

  3. Не называйте столбцы после типов данных.

Автор: 3Dave Размещён: 11.05.2013 09:59

1 плюс

7225 Репутация автора

вам нужны одинарные кавычки для строковых значений

Но я настоятельно рекомендую вам использовать SQLParameters, чтобы избежать любых SQLInjectionsатак

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

Автор: HaBo Размещён: 11.05.2013 10:00

4 плюса

189815 Репутация автора

Пожалуйста, замените ваш код этим.

 SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) " + 
                                 "VALUES (@guid, @lat, @long, @photo)", con);
 cmd.Parameters.AddWithValue("@guid", GUID);
 cmd.Parameters.AddWithValue("@lat", latitude);
 cmd.Parameters.AddWithValue("@long", longitude);
 cmd.Parameters.AddWithValue("@photo", photoName);

Почему? Хорошо, предположим, что одна из ваших строк содержит одну кавычку.
Запрос не будет выполнен с синтаксической ошибкой. Но не останавливайтесь на струнах. А как насчет дат и десятичных чисел? Вам нужно отформатировать их так, чтобы это соответствовало настройкам глобализации базы данных, чтобы не дать следующему клиенту с другими настройками. Параметр решит это за вас.

Хуже . Предположим, что злоумышленник вводит в поле ввода для PhotoName что-то вроде этого:

 p1.jpg'); DROP TABLE ACCIDENTS; -- 

Это большая, большая проблема - она ​​называется Sql Injection , и да, параметр предотвращает это. Я действительно надеюсь, что вы не напишите этот код в базах данных, где у вас есть конфиденциальная информация.

Автор: Steve Размещён: 11.05.2013 10:08
Вопросы из категории :
32x32