Warum funktioniert NpgsqlParameter nicht, wenn es an DbSet.FromSqlRaw übergeben wird?

Sep 03 2020

Wie ich im Titel erwähnt habe, DbSet.FromSqlRawfunktioniert es nicht, wenn ich bestanden habe NpgsqlParameter. Ich bekomme immer null.

Hier sind einige Variationen, die ich ausprobiert habe:

long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = '@value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();
long value = 3;
NpgsqlParameter npgsqlParameter = new NpgsqlParameter("value", value);
string query = "SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = ':value'";

var _user = _AdminPanelDbContext
           .User
           .FromSqlRaw(query, npgsqlParameter)
           .FirstOrDefault();

Bevor jemand fragt "Warum verwenden Sie keine interpolierten Inline-Zeichenfolgen?" so was.

FromSqlRaw($"SELECT * FROM \"Admin\".\"User\" as usr WHERE \"usr\".\"Value\" = {value}");

Der erste Grund ist, dass ich diese SQL-Abfrage wieder verwende (genauer gesagt, speichere sie für die Prüfung), und der zweite Grund ist, dass ich weiß, dass dies NpgsqlParameterauch für die SQL-Injektion sicher ist.

Antworten

2 fuzzy_logic Sep 04 2020 at 13:31

Entschuldigung, ich kann die genaue Syntax momentan nicht überprüfen - aber wie wäre es mit so etwas wie:

    long value = 3;
    var searchParam = new NpgsqlParameter("value", value);
    var _user = _AdminPanelDbContext.User.FromSqlRaw("select * from admin.user as usr where usr.value = @searchParam;", searchParam).FirstOrDefault();

Es gibt ein End-to-End - Beispiel hier .

Klingt jedoch so, als würden Sie Postgres verwenden. Wenn ja, wird erklärt, warum der Fehler angezeigt wird, dass NpgsqlParameter anstelle von SqlParameter verwendet werden muss.