Stelig Ответов: 1

Как создать роли для postgresql в C#?


Привет,
Я пытаюсь создать форму Win на C#, которая будет использоваться для добавления пользователей (роли входа в систему) на мой сервер PostgreSQL.

SQL-запрос для Postgres-это:
"CREATE USER john LOGIN PASSWORD 'abc';"

Расширенный запрос будет:
"CREATE USER john LOGIN PASSWORD 'abc' IN ROLE "members" CREATEROLE;"

Вот код C#, который я использую:
public static void CreateUser(NpgsqlConnection pgConnection, TextBox[] txtCredentials)
{
 try
  {
   if (pgConnection.State != ConnectionState.Open)
      pgConnection.Open();
   using (var pgCommand = new NpgsqlCommand())
    {
     pgCommand.Parameters.Clear();
     pgCommand.Parameters.AddWithValue("@user", txtCredentials[0].Text);
     pgCommand.Parameters.AddWithValue("@pw", txtCredentials[1].Text);
     pgCommand.CommandText = "CREATE USER @user LOGIN PASSWORD @pw;";
     pgCommand.Connection = pgConnection;
     pgCommand.ExecuteNonQuery();
    }
  }
   catch (NpgsqlException pgMsg)
  {
    MessageBox.Show(pgMsg.Message);
  }
}

Когда он достигает ". ExecuteNonQuery ()", он выдает ошибку со следующим сообщением: 42601: ошибка синтаксиса в или рядом "$1"

Я понятия не имею, в чем может быть проблема, потому что запрос с параметрами в C# выглядит так же, как и в SQL.
Можете ли вы пожалуйста, поделитесь советом?
Спасибо

Что я уже пробовал:

Я попытался использовать "создать роль "вместо" создать пользователя", но все равно тот же результат.

camaron182

можете ли вы включить команду SQL при предоставлении значений для txtCredentials? это может быть синтаксис PostgreSQL

Stelig

Я использую TextBox[] txtCredentials = {txtUser, txtPw};
а затем вызовите метод.

1 Ответов

Рейтинг:
2

RickZeeland

Когда я использую следующее, это работает, но, конечно, многие будут протестовать против того, чтобы не использовать параметризованный запрос:

public static void CreateUser(NpgsqlConnection pgConnection, string user, string password)
{
    try
    {
        string sql = string.Format("CREATE USER {0} LOGIN PASSWORD '{1}';", user, password);
        pgConnection.Open();

        using (var pgCommand = new NpgsqlCommand())
        {
            pgCommand.Connection = pgConnection;
            pgCommand.CommandText = sql;
            pgCommand.ExecuteNonQuery();
        }
    }
    catch (NpgsqlException pgMsg)
    {
        MessageBox.Show(pgMsg.Message);
    }
}


Stelig

Я попробовал выполнить приведенную выше команду, но все та же ошибка: 42601: синтаксическая ошибка на уровне или около "$1".

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

Stelig

Спасибо Рик,
Ваше решение работает и для меня.

Но, как вы уже упоминали, он не параметризован.