Home > Mobile >  Call db connectivity values from a file
Call db connectivity values from a file

Time:06-03

I am fairly new to c# and would like to know how values can be called from a file instead of statically hard coding it in the class. I know in java spring boot applications we can have it in application.properties files. In my case I have the db hostname, username and pwd stored in a file

namespace NunitTestCase
{
    [TestFixture]
    public class Test
    {   
        string query = "SELECT * FROM SYSTEM.ADMIN.EMPLOYEE";
        string host = "vm1.test.app.com";  //want these data in a file
        int port = 5480;
        string dbName = "SYSTEM";
        string userName = "admin";
        string password = "password";
        
        [Test]
        public void TestCase()
        {
            var builder = new ConnectionStringBuilder();
            builder.UserName = userName;
            builder.Password = password;
            builder.Port = port;
            builder.Host = host;
            builder.Database = dbName;

            using (var con = new Connection(builder.ConnectionString))
            {
                con.Open();
                NUnit.Framework.Assert.That(con.State == ConnectionState.Open);
                using (var cmd = new Command(query, con))
                {
                    var rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {
                        for (int i = 0; i < rdr.FieldCount; i  )
                        {
                            object o = null;
                            try
                            {
                                o = rdr.GetValue(i);
                            }
                            catch (Exception ex)
                            {
                                o = ex.Message;
                            }
                            
                            Console.WriteLine(o);
                        }
                    }
                }
                con.Close();
                NUnit.Framework.Assert.That(con.State == ConnectionState.Closed);
            }
        }
    }
}

file.yaml

database:
   host: "vm1.test.app.com"
   port: 5480
   dbName: "SYSTEM"
   userName: "admin"
   password: "password"

How do I make changes in my code so that instead of hardcoding, these values can be picked up from the file

CodePudding user response:

  1. Traditionally, in .net we store configuration in .json/.xml files and C# supports built-in functionality to parse it, but as far as you are using .YAML file you can install the library to parse this file: YAMLDotNet and use this to parse.
public class Database {
    public string Host { get; set; }
    public string Port { get; set; }
    public string DbName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
 } 
 public class Configuration
 {
    public Database Database { get; set; }
 }
    var yamlString = File.ReadAllText(@"...\file.yaml");
    
    var deserializer = new DeserializerBuilder().WithNamingConvention(new CamelCaseNamingConvention()).Build();
    
    var config = deserializer.Deserialize<Configuration>(yamlString);
  1. If you don't want to use any libraries you can parse it manually, so create a class which reflects your model in YAML, something like:

Function to get the value of a property:

    public string GetValueOfPropertyYaml(string yamlStr) {
        return yamlStr?.Split(":")?.Skip(1)?.FirstOrDefault()?.Trim() ?? string.Empty;
    }

Main code:

        string[] yamlStringArray = File.ReadAllLines(@"..\file.yaml");
        var config = new Database();
        foreach (var yamlStr in yamlStringArray) {
            if (yamlStr.Contains("host:")) {
                config.Host = GetValueOfPropertyYaml(yamlStr);
            }
            if (yamlStr.Contains("port:"))
            {
                config.Port = GetValueOfPropertyYaml(yamlStr);
            }
            if (yamlStr.Contains("dbName:"))
            {
                config.DbName = GetValueOfPropertyYaml(yamlStr);
            }
            if (yamlStr.Contains("userName:"))
            {
                config.UserName = GetValueOfPropertyYaml(yamlStr);
            }
            if (yamlStr.Contains("password:"))
            {
                config.Password = GetValueOfPropertyYaml(yamlStr);
            }
        }
        ;
        // use filled `config` variable below.

your model:

public class Database
{
    public string Host { get; set; }
    public string Port { get; set; }
    public string DbName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

NOTE: I highly recommend you to use library, because it was already tested and worked perfectly(my method should be tested properly)

  • Related