SQL INSERT - неверное имя столбца - PullRequest
2 голосов
/ 22 июня 2011

Как некоторые из вас могут видеть из моего предыдущего поста, я новичок в использовании C # для создания веб-сайтов (хотя у меня немало опыта использования его для приложений Windows Forms).Возможности, которые меня соблазняют, отвлекают меня от PHP, но я продолжаю ошибаться в том, что считаю основами.

В любом случае, это моя проблема.Я пытаюсь создать простую запись в базе данных SQL.Я знаю, что мое соединение с БД в порядке, так как я могу выполнять запросы SELECT весь день, но у меня возникают проблемы с использованием Insert.

Вот мой код:

string filename = "abc123.jpg";
SqlConnection link = new SqlConnection(//you dont need to see my data here ;));
string sqlcode = "INSERT INTO file_uploads (upload_filename VALUES ("+filename+")";
SqlCommand sql = new SqlCommand(sqlcode,link);
link.open();
sql.ExecuteNonQuery();

Это приводитв "Неверное имя столбца abc123.jpg", возвращаемое из try / catch.

Любая помощь приветствуется.(Я бы хотел, чтобы они позволили мне сделать это на PHP!)

Спасибо,

Tripbrock

Ответы [ 6 ]

13 голосов
/ 22 июня 2011

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

string sqlcode = "INSERT INTO file_uploads (upload_filename) " + 
                 "VALUES ('"+filename+"')";

Однако правильным способом будет использование параметризованного запроса:

string filename = "abc123.jpg";
SqlConnection link = new SqlConnection(/*you dont need to see my data here ;)*/);
string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)";
SqlCommand sql = new SqlCommand(sqlcode,link);
sql.Parameters.AddWithValue("@filename", filename);
link.open();
sql.ExecuteNonQuery();
2 голосов
/ 22 июня 2011

ваш SQL плохо отформатирован. Попробуйте это:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')";

Где upload_filename - это имя столбца

1 голос
/ 22 июня 2011

На самом деле вы должны параметризовать свои запросы - это снижает риск инъекционных атак:

string filename = "abc123.jpg";
using( SqlConnection link = new SqlConnection(/*...*/;)) )
{
    // sql statement with parameter
    string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)";
    using( SqlCommand sql = new SqlCommand(sqlcode,link) )
    {
        // add filename parameter
        sql.Parameters.AddWithValue("filename", filename);
        link.open();
        sql.ExecuteNonQuery();
    }
}

Также обратите внимание на операторы using - они обеспечивают удаление объектов соединения и команд.

0 голосов
/ 22 июня 2011

Не знаю, является ли это опечаткой, но строка должна быть:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')";

Обратите внимание на ) после upload_filename.

Такжетакже добавили одинарные кавычки вокруг имени файла.

Но вы, вероятно, хотите использовать параметризованный запрос:

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES (@filename)";

Затем используйте command.Parameters, чтобы добавить фактическое значение.

0 голосов
/ 22 июня 2011

Попробуйте

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')";

Вам не хватало закрывающих скобок.

0 голосов
/ 22 июня 2011

выглядит так, как будто вам не хватает скобки:

string sqlcode = "INSERT INTO file_uploads (upload_filename VALUES ("+filename+")";

Должно быть

string sqlcode = "INSERT INTO file_uploads (upload_filename) VALUES ('"+filename+"')";

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

using (SQLCommand oSQLCommand = new SQLCommand("INSERT INTO file_uploads (upload_filename) VALUES ( @FileName )")
{
oSQLCommand.Parameters.AddWithValue("@FileName", filename);

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