【问题标题】:Entity Framework (Telerik) call fails with ExecuteNonQuery to PostgreSQL stored procedureEntity Framework (Telerik) 调用失败,ExecuteNonQuery 到 PostgreSQL 存储过程
【发布时间】:2015-05-21 08:11:58
【问题描述】:

(PostgreSQL 9.1,Telerik OpenAccess v2.0.50727,PgAdmin III)。

我很难从 (Telerik) 实体框架调用存储过程。确切的错误是:

NpgsqlException 未被用户代码处理。

错误:42703:“cpatient”列不存在。

Telerik 模板调用是:

public int SaveDx(string cpatient, Object o, Object n)
    {
        OAParameter parameterCpatient = new OAParameter();
        parameterCpatient.ParameterName = "cpatient";
        parameterCpatient.Size = -1;
        if(cpatient != null)
        {
            parameterCpatient.Value = cpatient;
        }   
        else
        {
            parameterCpatient.DbType = DbType.String;
            parameterCpatient.Value = DBNull.Value;
        }

        OAParameter parameterO = new OAParameter();
        parameterO.ParameterName = "o";
        parameterO.Value = o;

        OAParameter parameterN = new OAParameter();
        parameterN.ParameterName = "n";
        parameterN.Value = n;

        int queryResult = this.ExecuteNonQuery("SELECT * FROM \"public\".\"g_savedx\"(cpatient, o, n)", CommandType.Text, parameterCpatient, parameterO, parameterN);
    
        return queryResult;
    }

ExecuteNonQuery 语句生成错误的位置。 PostgreSQL存储过程是:

  FUNCTION g_savedx(cpatient character varying, o view_dx, n view_dx)
  RETURNS void AS ...

postgreSQL 函数已经过测试,可以在 pgAdmin 中正常工作。

那么“cpatient”列是从哪里来的??我做错了什么?

TIA

【问题讨论】:

    标签: entity-framework postgresql stored-procedures telerik


    【解决方案1】:

    我永远无法让 Telerik EntitiesModel ExecuteNonQuery 在任何条件下工作。因此建议的代码为:

            using (var cxt = new Nova.Data.Data())
            {
                cxt.SaveDx();
                cxt.SaveChanges();
            }
    

    其中 cxt.SaveDx() 是 postgresql g_savedx 存储过程的域模型名称,失败。

    我对 PostgreSQL 的最终解决方法是直接使用 Npgsql:

      public void SaveDx(View_dx dx, bool alldx = false)
        {
            using (var cxt = new Nova.Data.Data())
            {
                string connstring = cxt.Connection.ConnectionString;
    
                using (NpgsqlConnection conn = new NpgsqlConnection(connstring))
                {
                    conn.Open();
                    using (var cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "g_savedx";
                        cmd.CommandType = CommandType.StoredProcedure;
                        NpgsqlCommandBuilder.DeriveParameters(cmd);
                        cmd.Parameters["groupid"].Value = ....
    
                     var rowsAffected = cmd.ExecuteNonQuery();  
                    }
                }
            }
        }
    

    这样做时,只使用 PostgreSQL 过程接口中的 NpgsqlDbType 枚举中定义的类型。 (PostgreSQL 可以使用复合类型,Npgsql 没那么多)。

    Telerik ExecuteNonQuery 工作肯定会很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多