SQL Server Неверное имя столбца при добавлении строкового значения
6807 просмотра
5 ответа
Я новичок в 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 Источник Размещён: 12.11.2019 09:28Ответы (5)
7 плюса
Интересно, почему он считал «а» именем колонки?
Это не сложно увидеть. Вы не должны разрабатывать программное обеспечение, развертывать его и надеяться, что оно работает. Вы должны проверить это. Извлеките исполняемый код в метод класса и вызовите его из своего сервиса. При разработке вы вызываете этот метод из программы модульного тестирования или командной строки или из того, что вам нравится тестировать.
Ваша проблема: вы не помещаете кавычки вокруг строк (или 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
4 плюса
Пожалуйста, замените ваш код этим.
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:082 плюса
Вам нужны кавычки вокруг ваших строк. Вы просто напрямую подставляете значения, поэтому 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:592 плюса
Я предполагаю, что значение GUID начинается с a
. Если бы это началось с, 3
вы, вероятно, получили бы что-то более интересное.
Поскольку вы передаете его в виде строки, а не экранируете его кавычками, вы получаете сообщение об ошибке.
SqlCommand cmd = new SqlCommand("INSERT INTO Accidents (GUID,Latitude,Longitude,PhotoName) VALUES ("
+ "\"" + GUID + "\"," + latitude + "," + longitude + ",\"" + photoName + "\")", con);
Несколько моментов:
Вы действительно должны избегать построения запросов таким способом. Используйте хранимую процедуру или параметризованный запрос.
почему ты хранишь
guid
какvarchar()
? Существует очень хорошийGuid
тип данных.Не называйте столбцы после типов данных.
1 плюс
вам нужны одинарные кавычки для строковых значений
Но я настоятельно рекомендую вам использовать SQLParameters, чтобы избежать любых SQLInjections
атак
Вы можете найти примеры использования параметров SQL здесь
Автор: HaBo Размещён: 11.05.2013 10:00Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- asp.net Контрольный список для проверки подлинности Windows IIS 6 / ASP.NET?
- asp.net Валидация клиентской стороны ASP.Net
- asp.net .NET - получить протокол, хост и порт
- asp.net Как получить полный URL страницы, на которой я нахожусь в C #
- sql Проверить наличие изменений в таблице SQL Server?
- sql Обменять уникальные индексированные значения столбцов в базе данных
- sql Как работает индексация базы данных?
- sql Как индексировать столбец базы данных
- database Двоичные данные в MySQL
- web-services Завить командную строку для использования веб-сервисов?
- web-services Как получить долготу и широту для адреса улицы программно (и юридически)
- web-services Как я могу контролировать имя универсальных возвращаемых типов WCF?
- web-services Java, API веб-службы Alfresco и Unicode NamedValues