使用 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;

}