PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment passer le paramètre à une fonction postgre et obtenir des données à l'aide d'ExecuteReader ?

Sans structure d'entité, vous devez écrire le code qui lit les valeurs du lecteur de données dans une instance de votre AccountInfo classe :

public static AccountInfo GetAccountInfo(string accountNumber)
{
    AccountInfo result = null;
    using(var conn = new NpgsqlConnection("..."))
    {
        conn.Open();
        using(var command = new NpgsqlCommand("SELECT * FROM sms.get_accounts_info(@AccountNumber); ", conn))
        {
            command.Parameters.AddWithValue("@AccountNumber", accountNumber);
            using(var dr = command.ExecuteReader())
            {
                if(dr.HasRows && dr.Read())
                {
                    result = new AccountInfo { 
                        accountNumber = dr["accountNumber"].ToString(),
                        balance = dr["balance"].ToString(),
                        interestRate = Convert.ToInt32(dr["interestRate"]),
                        accountName = dr["accountName"].ToString()
                    };
                }
            }
        }
    }
    return result;
}

Notez que le type de retour de la fonction a été changé en AccountInfo , anciennement chaîne. De plus, il est limité à la lecture d'un seul enregistrement, si un appel à sms.get_accounts_info pourrait renvoyer plus d'un enregistrement, c'est une autre histoire. J'ai juste supposé que account_number est une clé primaire dans le account_holders tableau.

Certains détails nécessitent votre attention, par exemple balance est de l'argent dans la base de données, mais une chaîne dans la classe. Aussi je ne savais pas si et comment product (base de données) et accountType (classe) correspondrait, donc je l'ai omis.

Les connexions à la base de données, les commandes et les lecteurs de données sont IDisposable et doit être enveloppé dans using blocs.