Entity Framework (Telerik) 对 PostgreSQL 存储过程的 ExecuteNonQuery 调用失败
Entity Framework (Telerik) call fails with ExecuteNonQuery to PostgreSQL stored procedure
(PostgreSQL 9.1、Telerik OpenAccess v2.0.50727、PgAdmin III)。
我在从 (Telerik) Entity Framework 调用存储过程时遇到困难。确切的错误是:
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 ...
已通过 pgAdmin 测试 postgreSQL 功能正常工作。
那么“cpatient”一栏是从哪里来的??我做错了什么?
TIA
我永远无法让 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 能正常工作那就太好了。
(PostgreSQL 9.1、Telerik OpenAccess v2.0.50727、PgAdmin III)。
我在从 (Telerik) Entity Framework 调用存储过程时遇到困难。确切的错误是:
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 ...
已通过 pgAdmin 测试 postgreSQL 功能正常工作。
那么“cpatient”一栏是从哪里来的??我做错了什么?
TIA
我永远无法让 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 能正常工作那就太好了。