使用 npgsql dll v3.1.9 执行 postgres 查询时出错
Error while executing postgres query with npgsql dll v3.1.9
我正在尝试从 C# web api 执行我的 Postgres 函数。不知何故,在执行它时,Postgres 给出了语法错误。但是当与 'Select' 关键字一起使用时,它不会给出任何错误。我对旧的 Npgsql 库使用过无数次类似的方法,但从未出现任何错误。现在第一次使用最新的 Npgsql 3.1.9。谁能帮我解决这个问题?
使用的代码:
try
{
using (NpgsqlConnection con = new NpgsqlConnection(connectionString))
{
con.Open();
string query = "user_signup(" + _cmpid + "::integer,'" + _email + "','" + _contact + "')";
using (NpgsqlTransaction tran = con.BeginTransaction())
{
using (NpgsqlCommand cmd = new NpgsqlCommand(query, con))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
NpgsqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
if (!reader.IsDBNull(0))
Id = reader.GetValue(0).ToString();
RStatus = "OK";
}
reader.Close();
}
tran.Dispose();
}
con.Close();
}
}
catch(Exception ex){}
查询调用- user_signup(1::integer,'xyz@outlook.com','8965472335')
发生异常- 42601:“(”处或附近的语法错误
堆栈跟踪 -
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadExpecting[T]()
at Npgsql.NpgsqlDataReader.NextResultInternal()
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Npgsql.NpgsqlCommand.ExecuteReader()
at BusToWorkAPI.DBOperations.DbHandler.SignUpUser(Int32 _cmpid, String _email, String _contact) in d:\DbHandler.cs:line 673
从 3.0 开始,Npgsql 在使用 CommandType.StoredProcedure
执行时只需要 CommandText
中的函数名称。您应该使用正确的值将 NpgsqlParameters 添加到您的命令中(至少这将防止您当前代码中潜在的 SQL 注入)。
这在 migration notes 中有记载。
我正在尝试从 C# web api 执行我的 Postgres 函数。不知何故,在执行它时,Postgres 给出了语法错误。但是当与 'Select' 关键字一起使用时,它不会给出任何错误。我对旧的 Npgsql 库使用过无数次类似的方法,但从未出现任何错误。现在第一次使用最新的 Npgsql 3.1.9。谁能帮我解决这个问题?
使用的代码:
try
{
using (NpgsqlConnection con = new NpgsqlConnection(connectionString))
{
con.Open();
string query = "user_signup(" + _cmpid + "::integer,'" + _email + "','" + _contact + "')";
using (NpgsqlTransaction tran = con.BeginTransaction())
{
using (NpgsqlCommand cmd = new NpgsqlCommand(query, con))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
NpgsqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
if (!reader.IsDBNull(0))
Id = reader.GetValue(0).ToString();
RStatus = "OK";
}
reader.Close();
}
tran.Dispose();
}
con.Close();
}
}
catch(Exception ex){}
查询调用- user_signup(1::integer,'xyz@outlook.com','8965472335')
发生异常- 42601:“(”处或附近的语法错误
堆栈跟踪 -
at Npgsql.NpgsqlConnector.DoReadMessage(DataRowLoadingMode dataRowLoadingMode, Boolean isPrependedMessage)
at Npgsql.NpgsqlConnector.ReadMessageWithPrepended(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadMessage(DataRowLoadingMode dataRowLoadingMode)
at Npgsql.NpgsqlConnector.ReadExpecting[T]()
at Npgsql.NpgsqlDataReader.NextResultInternal()
at Npgsql.NpgsqlDataReader.NextResult()
at Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReaderInternal(CommandBehavior behavior)
at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader()
at Npgsql.NpgsqlCommand.ExecuteReader()
at BusToWorkAPI.DBOperations.DbHandler.SignUpUser(Int32 _cmpid, String _email, String _contact) in d:\DbHandler.cs:line 673
从 3.0 开始,Npgsql 在使用 CommandType.StoredProcedure
执行时只需要 CommandText
中的函数名称。您应该使用正确的值将 NpgsqlParameters 添加到您的命令中(至少这将防止您当前代码中潜在的 SQL 注入)。
这在 migration notes 中有记载。