2015-05-14 35 views
0

(PostgreSQL 9.1,Telerik OpenAccess v2.0.50727,PgAdmin III)。實體框架(Telerik)調用失敗,ExecuteNonQuery返回PostgreSQL存儲過程

我很難從(Telerik)實體框架調用存儲過程。確切的錯誤是:

NpgsqlException was unhandled by user code.

ERROR: 42703: column "cpatient" does not exist.

的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

回答

0

我無法讓自己的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的工作肯定會很好。