【发布时间】:2017-10-07 21:36:06
【问题描述】:
我用于处理 ExecuteScalar Postgresql 查询的方法:
public T ExecuteScalar<T>(string sql, CommandType commandType, List<NpgsqlParameter> parameters)
{
using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji"))
{
return Execute<T>(sql, commandType, c =>
{
var returnValue = c.ExecuteScalar(); //The Connection is not open.
return (returnValue != null && returnValue != DBNull.Value && returnValue is T)
? (T)returnValue
: default(T);
}, parameters);
}
}
“连接未打开”评论是它发生的地方,我不明白为什么我内部没有连接,所以有人可以解释一下发生了什么吗?
执行方法:
T Execute<T>(string sql, CommandType commandType, Func<NpgsqlCommand, T> function, List<NpgsqlParameter> parameters)
{
using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji"))
using (var cmd = new NpgsqlCommand())
{
cmd.CommandText = sql;
cmd.CommandType = commandType;
if (parameters.Count > 0 )
{
foreach (var parameter in parameters)
{
cmd.Parameters.AddWithValue(parameter.ParameterName,parameter.Value);
}
}
Konekcija_na_server.Spajanje("prekini");
return function(cmd);
}
}
}
我的连接类:
class Konekcija_na_server
{
public static string Connectionstring = "Server=127.0.0.1;Port=5433;User Id=postgres;" +
"Password=*********;Database=postgres;Pooling=false;";
public static NpgsqlConnection Spajanje(string konekcija)
{
bool spajanje = false;
NpgsqlConnection conn = new NpgsqlConnection(Connectionstring);
if (konekcija == "spoji")
{
conn.Open();
spajanje = true;
}
else if (konekcija == "prekini")
{
conn.Close();
}
if (spajanje == true)
{
return conn;
}
else return null;
}
【问题讨论】:
-
@mjwills 什么都没有,因为 c 在那里被声明,所以当你写 conn 时你再次声明它,我们都知道这是一个错误
-
请包含您的
Execute方法的源代码 - 因为错误在于您的Execute和ExecuteScalar之间的交互。 -
您似乎没有将连接分配给命令。您需要在 Execute 方法中替换: using (var cmd = new NpgsqlCommand()) 与 using (var cmd = new NpgsqlCommand(sql, conn)) 并删除 cmd.CommandText = sql;下面一行
-
@IvanMilosavljevic 似乎可行,但你能解释一下原因并给出答案吗?
标签: c# postgresql function executescalar