使用 C# 时连接未打开
The Connection is not open while in function using C#
我用于处理 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);
}
}
"The Connection not open" 评论就是出事了,我不明白为什么我里面没有连接,所以谁能这么好心解释一下发生了什么事?
执行方法:
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:
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;
}
NpgsqlCommand 缺少连接对象。为了执行查询命令(NpgsqlCommand)需要知道SQL它将执行什么(CommandText),它是什么类型的命令(CommandType = Text,Procedure)和Connection。
在下面的行中,您创建了命令并指定了文本和命令类型,但缺少连接。
using (var cmd = new NpgsqlCommand())
cmd.CommandText = sql;
cmd.CommandType = commandType;
所以正确的实现应该是:
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(sql, conn))
{
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);
}
}
}
此外,我注意到您正在调用 Konekcija_na_server.Spajanje("prekini");
来关闭 SQL 连接,但您没有关闭现有连接,而是初始化了新的 NpgsqlConnection,然后关闭了新连接。
您已经在内部使用块 using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji"))
建立连接,这意味着当您退出该块时,您的连接将自动关闭
正确的实施方式是:
public static NpgsqlConnection Spajanje()
{
var conn = new NpgsqlConnection(Connectionstring);
conn.Open();
return conn;
}
我用于处理 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);
}
}
"The Connection not open" 评论就是出事了,我不明白为什么我里面没有连接,所以谁能这么好心解释一下发生了什么事?
执行方法:
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:
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;
}
NpgsqlCommand 缺少连接对象。为了执行查询命令(NpgsqlCommand)需要知道SQL它将执行什么(CommandText),它是什么类型的命令(CommandType = Text,Procedure)和Connection。
在下面的行中,您创建了命令并指定了文本和命令类型,但缺少连接。
using (var cmd = new NpgsqlCommand())
cmd.CommandText = sql;
cmd.CommandType = commandType;
所以正确的实现应该是:
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(sql, conn))
{
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);
}
}
}
此外,我注意到您正在调用 Konekcija_na_server.Spajanje("prekini");
来关闭 SQL 连接,但您没有关闭现有连接,而是初始化了新的 NpgsqlConnection,然后关闭了新连接。
您已经在内部使用块 using (NpgsqlConnection conn = Konekcija_na_server.Spajanje("spoji"))
建立连接,这意味着当您退出该块时,您的连接将自动关闭
正确的实施方式是:
public static NpgsqlConnection Spajanje()
{
var conn = new NpgsqlConnection(Connectionstring);
conn.Open();
return conn;
}