Я пытаюсь создать таблицу, используя функции Npgsql
и command.Parameters.AddWithValue
. Вот следующий код:
Попытка 1:
string databaseName = "MyDatabase";
using (NpgsqlCommand command = new NpgsqlCommand(" CREATE DATABASE :DBNAME ", conn))
{
command.Parameters.AddWithValue(":DBNAME", "'" + databaseName + "'");
await command.ExecuteNonQueryAsync();
}
Попытка 2:
string databaseName = "MyDatabase";
using (NpgsqlCommand command = new NpgsqlCommand(" CREATE DATABASE :DBNAME ", conn))
{
command.Parameters.AddWithValue(":DBNAME", "\"" + databaseName + "\"");
await command.ExecuteNonQueryAsync();
}
Попытка 3
string databaseName = "MyDatabase";
using (NpgsqlCommand command = new NpgsqlCommand(" CREATE DATABASE :DBNAME ", conn))
{
command.Parameters.AddWithValue(":DBNAME", databaseName);
await command.ExecuteNonQueryAsync();
}
Я не могу выполнить этот код из-за ошибки syntax error at or near "$1"
. Что я делаю неправильно? Я использовал этот синтаксис для запросов выбора, и не было никаких проблем, например ::1015*
using (NpgsqlCommand command = new NpgsqlCommand(" SELECT * FROM \"Students\" WHERE \"Id\" = :Id ", conn))
{
command.Parameters.AddWithValue(":Id", 1);
int id = (int)await command.ExecuteScalarAsync();
}
и этот запрос работает отлично. В чем разница?
РЕДАКТИРОВАТЬ: Как я могу создавать базы данных и таблицы, предотвращающие внедрение SQL? Безопасно ли следующее утверждение? format('CREATE DATABASE %1$s', 'MyDatabase')