使用npgsql DLL v3.1.9执行postgres查询时出错

时间:2017-01-15 12:08:59

标签: c# postgresql asp.net-web-api2 npgsql

我正在尝试从C#web api执行我的Postgres功能。不知怎的,在执行Postgres时会出现语法错误。但是当与“选择”关键字一起使用时,它不会给出任何错误。我使用类似的方法与旧的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 ::整数,'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

1 个答案:

答案 0 :(得分:0)

从3.0开始,Npgsql在使用CommandText执行时只需要CommandType.StoredProcedure中的函数名称。您应该使用正确的值将NpgsqlParameters添加到命令中(至少这会阻止您在当前代码中注入潜在的SQL)。

migration notes中记录了这一点。