Ответ 1
То, что вы видите, - это параметризованный запрос. Они часто используются при выполнении динамического SQL из программы.
Например, вместо написания этого (примечание: псевдокод):
ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()
Вы пишете это:
ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()
Это имеет много преимуществ, что, вероятно, очевидно. Один из самых важных: функции библиотеки, которые анализируют ваши параметры, являются умными и гарантируют, что строки будут экранированы должным образом. Например, если вы пишете это:
string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()
Что происходит, когда пользователь вводит это?
Robert'); DROP TABLE students; --
(Ответ здесь)
Вместо этого напишите:
s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()
Затем библиотека будет дезинфицировать вход, создавая это:
"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'"
Не все СУБД используют ?
. MS SQL использует именованные параметры, которые я считаю улучшением огромным:
cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()