Thursday 29 September 2016

c# Add migration

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add connectionString="server=localhost;database=Inventory;user id=sa;password=SQLPassword"
         name="ContactsConnection"
         providerName="System.Data.SqlClient"/>
    <add connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\chuanshuoge\Documents\Database1.accdb;
Persist Security Info=False;"
         name="MyCompanyConnection"
         providerName="System.Data.OleDb"/>
  </connectionStrings>
 
</configuration>

----------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace code_first_demo
{
    public class Context:DbContext
    {
        public Context() : base("name = ContactsConnection") { }

        public DbSet<Contact> C { get; set; }
    }
}

----------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace code_first_demo
{
    public class Contact
    {
        public int Id { get; set; }

        public string first_name { get; set; }

        public string last_name { get; set; }

        public string phone { get; set; }

        public string city { get; set; }
    }
}

-----------------------------------------------------------



namespace code_first_demo.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class AddContactscity : DbMigration
    {
        public override void Up()
        {
            AddColumn("dbo.Contacts", "city", c => c.String());
        }
        
        public override void Down()
        {
            DropColumn("dbo.Contacts", "city");
        }
    }
}

----------------------------------------------------------

namespace code_first_demo.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class InitialCreate : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Contacts",
                c => new
                    {
                        Id = c.Int(nullable: false, identity: true),
                        first_name = c.String(),
                        last_name = c.String(),
                        phone = c.String(),
                    })
                .PrimaryKey(t => t.Id);
            
        }
        
        public override void Down()
        {
            DropTable("dbo.Contacts");
        }
    }
}

-----------------------------------------------------

namespace code_first_demo.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<code_first_demo.Context>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "code_first_demo.Context";
        }

        protected override void Seed(code_first_demo.Context context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

c# entity frame 2

using inventory_app;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dframe
{
    public class supplier_manager
    {
//pass small section of data from database to client
        public static List<supplier_dto> get_all()
        {
            var db = new InventoryEntities();
            var suppliers = db.Suppliers.Select(s=>new supplier_dto { id = s.ID, name = s.Name }).ToList();
            return suppliers;
        }

        public static void add(supplier_dto s)
        {
            var db = new InventoryEntities();

            var supp = new Supplier { Name = s.name };
            db.Suppliers.Add(supp);
            db.SaveChanges();
        }

        public static void update(supplier_dto s)
        {
            var db = new InventoryEntities();
            var supp = db.Suppliers.SingleOrDefault(a => a.ID == s.id);
            supp.Name = s.name;
            db.SaveChanges();
        }

        public static supplier_dto find(int id)
        {
            var db = new InventoryEntities();
            var supp = db.Suppliers.Find(id);
            var supplier = new supplier_dto { id = supp.ID, name = supp.Name };
            return supplier;
        }
    }
}

-------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace inventory_app
{
    public class supplier_dto
    {
        public int id { get; set; }
        public string name { get; set; }
    }
}
-----------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;

namespace dframe
{
    public class product_manager
    {
        public static IList get_all()
        {
            var db = new InventoryEntities();
            var prods = db.Products.ToList();
            return prods;
        }

        public static IList get_product(int supplier_id)
        {
            var db = new InventoryEntities();
            var prods = db.Products.Where(p => p.SupplierID == supplier_id).
                Select(p => new { Product = p.Name, p.Price, p.Quantity }).ToList();
            return prods;
        }
    }
}

Calgary Veggie Festival

同学们,你们知道吗?下周,也就是10月1-7日,是“国际素食周”。是全世界素食者享受素食,推广素食的重要节日,也是您开始考虑吃素,或加大素食比例的好日子哟!o(^▽^)o  
 
其中,10月1日是世界素食日(World Vegetarian Day)。卡城一些致力于推广健康饮食的热心人士,将在“国际素食周”的第一天,2016年10月01日,在卡城华人文化中心,举办卡尔加里第一届素食节( Calgary Veggie Festival,CVF)。届时,你会品尝到来自世界各地的特色精美素食。
 


看见了吗?横幅已经扯出来了:)


近年来,基于健康、瘦身、环保、动保、宗教、道德等各方面的原因,世界上出现了素食主义热潮。说起要多吃素,少吃肉,不管是不是素食者,身边的朋友都一致赞同。可是要落到实处,身体力行,可就不太容易啦。最常见的两个原因。一是怕营养不够,二是素食没有肉食美味。




事实是,素食摇身一变,已成为时下的流行饮食。在有心人士的推广和厨业高手的精心雕琢下,素食无论在菜色、烹饪方式,还是餐厅经营上都别具特色。加上素食不仅有利于人类身体健康,更有利于资源的有效利用和环境的保护,于是,素食目前已经成为一种全球流行时尚,世界上的素食人口也大有后来居上之势。 

来看看本次第一届“卡城素食节”上会奉献给大家的部分菜单吧(仅是一小部分呦):

盐酥菇
      将多种蘑菇切块、胡椒盐腌入味,再裹上多种粉混合而成的面浆,入油炸制,最后撒上九层塔而成。外面是多层次的酥松,内里是鲜嫩多汁的各类菇香。在九层塔的清香衬托下,让你越吃越想吃。

满都瓦达
      满都瓦达是一种传统的南印度食品,它可视为主食材为黑扁豆制成的印度式炸油饼。它有着与甜甜圈类似的外表,味美酥脆,通常配以扁豆汤或其他蘸料食用,是南印度和斯里兰卡流行的早餐和点心。
 
爆浆芋球
      近来刚兴起的超人气小吃,是将传统芋泥球,变出爆馅新口味!选用槟榔芋头,打碎成泥,再包入起司等馅料,油炸后,外酥内软绵,咸甜交错的奶黄西馅还会爆浆,超级诱人。  

煎饼果子
      传统的中式美食,它以面糊摊制成煎饼、再裹入脆饼,香菜等食材,抹上黄面酱调料后叠卷而成的街头小吃。由于它吃起来外焦里嫩,酱香浓郁,回味深长。由卡城著名的“煎饼义卖”团队制作,如果您错过了义卖,一定要到素食节上来吃个痛快啊!

砵仔糕    
      砵仔糕是广州和香港的街头传统小吃。软软的钵仔糕配合绵绵的红豆,质感柔韧幼滑,质朴原味。主料是红豆, 粘米粉和澄面,味甜。    

凉粉
     凉粉是用绿豆淀粉加水调成糊状,通过漏盆落入沸水锅煮熟,再经冷却成型,凉粉色泽洁白,晶莹剔透,嫩滑爽口。有诗称赞:“冰镇刮条漏鱼穿,晶莹沁齿有余寒。味调浓淡随君意,只管凉来不管酸。  

米豆蒸糕
    米豆蒸糕是印度人以发酵方式制成的传统食物,由于经自然发酵的制作过程,略带发酵后的酸味,纯白及呈碗状,口感类似发糕,不过纯发酵的食物味道并不会太甜,其淡淡的米香是最吸引人之处。材料是以米饭、印度黄豆浸泡并自然发酵约6个小时后形成糊状,再以蒸熟的方式制成。搭配以各种香料制成的甜酸酱,也可加入薄荷增添另一番风味。

素肉夹馍
    它的灵感来自于西安的传统美食肉夹馍,它用冻豆腐、香菇、甜玉米、红枣等加多种调料熬制成素肉,再配上经典的白吉馍,吃起来香嫩可口,回味深长。

炸油饼

炸油饼是中国北方人尤其钟爱的早餐之一。它以面粉、发酵粉和成软硬适中的面团,再擀成饼状,入油炸制而成。色泽金黄,外焦里嫩,油而不腻,鲜香可口。有甜味和南乳味供选择。

椰汁香芋西米露
      拥有百年历史的广东糖水。芋头制泥,西米煮熟,加入椰奶一同熬制。煮好的芋头西米露,西米晶莹剔透,有韧性,芋头独有的香气与椰奶相得益彰,唇齿留香。  

素麻辣烫
起源于中国四川,是时下风靡全中国的美食。它以各种食材切片,在味道香辣可口的酱锅中汆烫而成。其色泽红亮,香味扑鼻,食之更是又麻、又辣、又鲜、又爽,让人食欲大开、欲罢不能。




加多加多





加多加多是混合或什锦的意思,因为准备此菜需要多种时令蔬菜和配料。这道有名的印尼色拉,是由各色时令蔬菜,加上煮鸡蛋,煎豆腐和天贝,拌上香浓的花生酱,再佐上香脆可口的素虾片,真是天作之合。



展位:


Borobudur Resto



马莎拉薄饼
印度马莎拉薄饼是一款非常经典的南印度菜肴,它是由大米和某种豆子磨成粉发酵后放在平底锅上烙出来的薄饼,单面烙好的饼子中间厚有韧性,边缘薄非常脆。通常可以搭配很多不同的食物一起吃,比较常见的就是薄饼配用马莎拉香料制作的土豆。用手撕下一小份薄饼,夹着土豆,直接吃或者蘸配送的酱料食用。2012年被选为"全球最佳10款美食”之一。        
注:由些沾酱含有酸奶和坚果
展位:
Sifoods, 503 -4656 Westwinds Dr NE, Calgary,AB T3J 3Z5
T: 403 4755672


www.freshshifoods.com



无奶起司
Prana的无奶起司是小批量制成,只使用最优质的食材,以确保质量并在口味上通过我们最严格的裁判—小朋友的考验。口味包括:辣椒cheeZe,莳萝泡菜,尖辣椒,烟熏切达干酪,韭菜,比萨,番茄干和原味。      
展位:
Prana Kitchen 111
111, 355 Center St north Langdon AB
T: (403) 936-8640


https://www.facebook.com/pranakitchen111/



印尼风味天贝



天贝是用大豆发酵制成的一种传统的印尼食品。它含有丰富的蛋白质,膳食纤维和维他命。这道菜的天贝是店里自制的,加上浓郁的印尼风味酱,一定要试试哦。      
展位:
Borobudur Resto

素沙爹串

马来特别风味,素沙爹串。清爽的青瓜配上吸足特制的马来沙爹的面筋,清与浓,爽脆与软韧的碰撞!快来尝尝这异域的不同美食吧。



材料
·        麸质(GLUTEN)
·        黄瓜 (CUCUMBER)
·        坚果(NUT)
·        姜黄 (TUMERIC)
·        高粱姜 (GALANGA)
·        柠檬 (LEMON)
·        糖 (SUGAR)
·        盐 (SALT)
·        醋 (VINEGAR)



豆腐





豆腐一道著名的中式传统小吃,历史久远,可追溯到汉朝,它最大特点是豆腐的细嫩以及柔软,再依据各地口味不同,加入调料调制,北方多爱咸食,而南方则偏爱甜味,亦有地区如四川等喜爱酸辣口味。本次素食节提供的是咸豆腐脑,加入特制的咸味调料,足以让酷爱咸味豆腐脑的朋友解馋啦。



海苔酥





一款既美味又营养的素食。海苔富含维生素AE、C及矿物质,豆泡不但含各种维生素和矿物质,同时富含高氨基酸、蛋白质、不饱和脂肪酸。这款使用海苔、豆包、白芝麻、秘制酱料等精心制作海苔酥一定会让你吃得既好吃又营养。







和风薯包
豆包包上土豆泥,炸成金黄。浇上特制酱汁,撒上白芝麻和海苔。外脆内绵的薯包,吸收了可口的酱汁外加海苔和芝麻的助兴,真是一口盛宴。



手撕菠萝蜜迷你汉堡
你有没有想过用菠萝蜜代替猪肉?这个烧烤烟香十足,加上层牛油果拌的卷心菜胡萝卜色拉,再加上片莳萝腌黄瓜的健康迷你汉堡,要不要来一个?




南印度食品
怎么样?是不是看上去非常有食欲?
记住,这还不是全部呦!

要想尝遍美食一定到现场来大快朵颐!





本次素食节我们邀请到了各国风味餐厅的加盟。有印度风,马来风,印尼风,地中海风,日本风,非洲风,本地local风,当然更少不了两岸三地中国风!保证您能吃到过去未曾吃到的风味,回去后能为家人做出更加丰富多彩的美味素食。

现场我们还设置了非食品区,邀请卖家入驻。

Wednesday 28 September 2016

C# entity framework 1






using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace entity_frame
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            var db = new InventoryEntities();
            var suppliers = db.Suppliers.ToList();
            comboBox1.DataSource = suppliers;
            comboBox1.DisplayMember = "Name";
            comboBox1.ValueMember = "ID";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var db = new InventoryEntities();
            var result = db.Products.
                Where(p => p.Supplier.Name == comboBox1.Text).
                Select(p => new { Product = p.Name, p.Quantity, p.Price, CompanyName = p.Supplier.Name }).
                ToList();

            dataGridView1.DataSource = result;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var supp = new Supplier { Name = textBox1.Text };
            var db = new InventoryEntities();
            db.Suppliers.Add(supp);
            db.SaveChanges();
        }
    }
}

reference:

深度分析 中国楼市可能将急跌

最近房价暴涨,有人欢喜、有人恐慌,也有人质疑,难道政府就打算这么一直下去吗?其实政府也不是傻子,大把大把的流动资金投向房产,实业怎么办,没有实业,就业怎么办,没有就业,这么多人无事可干也是很危险的。实业是一定要救的,但是有个先来后到,先帮地方政府过了难关,理顺中央和地方的关系,再帮人民币(专题)顺利走出去,扶好人民币国际化这一步,既然大家都知道房地产市场是国家放水放出来的,难道关掉这个水很难吗?为什么还不关,这不是还没装满吗?

  不用怀疑上层的智商,从数月前权威人士的隔空喊话,到如今官媒不咸不淡的敲打,都说明上层精英很清楚这种缺乏基本面支撑的非理性的上涨所蕴藏的风险.但他们仍然选择支持泡沫。


  原因无它,两害相权取其轻,对于上层来说,眼下最大的风险不是房地产泡沫破裂,毕竟房地产泡沫破裂最大的受害者只是高位抢房入市的少部分人。最大的风险是国民的帐户上有太多可以动用的人民币,而国内的经济低迷加货币超发,如果不能营造出一种人民币资产在国内能够保值增值的氛围,国民会都想着换汇避险或者外逃.这种情况一旦发生,除非紧急外汇管制,否则三万多亿的外储几天就会被这些年超发的人民币换光.而外汇管制是要付出代价的,这是绝对不能承受的风险。
  让房价上涨,吸引资本进入,不要换汇外流,其实就是在保汇率。保汇率是目的,支持房价上涨只是手段,当民众感觉只有买房能赚钱,其他干什么都不靠谱,资金必然如洪水一般涌进楼市,一浪接一浪推高房价。当民众把多年的存款和未来的收入都绑定到了那堆钢筋水泥上,也不会有大量的资金来威胁外汇安全了,这也直接降低了外汇贬值的压力。因为海外的人民币总量没有多少,对付这点资金量央行得心应手,但国民手里的人民币如果都跟央行成了对手盘,那周行长就算是三头六臂也玩不起。

  锁定的方法无非就是改变上涨趋势,让房价下跌。央行盯着大数据,等存款搬家搬得差不多的时候,收紧货币政策。让房价急跌一波或者先缓跌数月之后再急跌一波,在购买力本来就已经透支的市场高位上,为数不多的尚有财力接盘的买家甚至刚需,马上会选择观望,买盘一夜之间就将消失殆尽,只要房子卖不出去,投资客无法套现,资金就成功锁定了。今年疯抢着入市的买家们,如果是囤房想着两年之后出手套现,大概率会失望.这里面的大部分资金,可能都将成为炮灰,不会有套现的机会,其实经不起推敲。

  有3成首付在,有每个月准时的还贷在,银行相信你不会选择断供。这也是为什么不论房价怎么涨,银行都敢借钱给你的原因。断供之后的麻烦,会远远超过你接受买房亏损的麻烦,在欠款还清之前你基本上可以说告别银行服务了,不能有银行卡,不能网上支付,甚至不能有资产,在这个社会我无法想像要怎么生活。可以说绝大多数人只要不到走投无路的地步,都不会主动选择断供的,这一轮大涨,已经帮助政府消化或者延缓了大量的地方不良债务,本身卖地财政就是无法持续的,房子以高价大量转移到了居民手上,以此为基点征收房产税正是最佳时机。而且房价上涨导致民怨沸腾,正好借房价下跌招揽一下失去的民心.这局棋环环相扣,步步精心。

  加入SDR的期限越来越近了,留给人民币的时间已经不多了,还不买房,国家都要哭了

  粉丝意见:

  老曾阿牛:高!实在是高!让房产套住超发的货币而不引发通胀,还稳住了汇率,最后再把房产价格打下去相当于回收超发的货币,还顺应了沸腾的民心!这样的策略谁出的?太厉害了

  否极泰董宝珍:最近研究了银行业各类贷款的坏账率,发现个人贷款是贷款中坏账率较低的,个人房地产贷款在个人贷款中坏账率最低,把房地产企业的库存转到老百姓手里救了房地产商,保护了银行坑了谁?人生是美好的也是残酷的!人生在世到处是坑,只有理性的人能避免无所不在的坑!

  链家马红:这手法跟温州帮操盘手法好像啊,拉高,把追涨的散户死死套在上影线上。这一轮上涨,老百姓30年来的定期存款整一步一步变为某些人/企业的活期存款。现在老百姓的定期存款还有多少呢,央妈知道

Monday 26 September 2016

就楼市发声:失去奋斗,房产再多我们也将无家可归

9月26日报道,这段时间以来,房价问题备受关注。在杭州,一条限购令,五千追随者,限购实施前一天签约5105套房产;在北京,一家上市公司通过出售两套学区房来续命保壳……全国大中城市这一轮房价风云,制造出新一轮楼市热潮,也在众人心中卷起波澜。

面对不断上涨的房价,有人冷眼旁观,有人莫名恐慌,有人犹豫观望,有人则不惜借高利贷凑首付,房价就像一面多棱镜,映照着不同社会群体的多样选择。快速城镇化的推动,上涨预期的助力,对实体经济的影响,可能存在的金融风险……经济学的专业分析,从各个角度展现出房地产市场的复杂。高企的房价,对经济的影响还有待观察,但对社会心态的影响已经显现。

早在深圳房价上涨时,网上就流传这样一个段子:一个商人10年前卖房创业,经过10年的艰辛奋斗,又用赚来的钱把当年卖掉的房子买了回来。这样一个虚构的故事,用一种近乎寓言的方式戳到了现实的痛点:在快速上涨的房价面前,奋斗者最终又回到了起点。于是,有企业主关厂炒房,直言“开工厂不如买几套房”;而有房一族则从房价涨幅与工资收入的对比中发现,“房子升值秒杀努力工作”。这些社会现象潜藏着这样一个逻辑,即快速上涨的房价,会令奋斗的价值贬值,解构奋斗的意义。这或许是高房价对社会心态的最大影响。

“人世间的一切幸福都需要靠辛勤的劳动来创造”,这句话应该是一个社会最为牢固的共识。只有人们相信奋斗与劳动,并愿意通过自己的双手创造未来,一个社会才能充满生机活力。相反,如果一套房子的升值就能覆盖奋斗的努力,甚至成为一个人无论怎样奋斗都无法跨越的鸿沟,那么按照理性选择的原理,房产投机自会大行其道,而踏踏实实的奋斗、勤勤恳恳的努力,则会遭到冷落。

而当努力奋斗还不如投机房产,就可能树立一种错误的导向和价值观。据央行公布的数据,今年7月新增人民币贷款4636亿元,其中住户部门新增贷款占比近99%,与之形成鲜明对比的,则是企业新增信贷为负增长。有人感叹:美的、海尔、苏宁、国美做地产,娃哈哈、喜之郎、五粮液做地产,连长城床垫都在做地产,房地产让72行最后都殊途同归。如果公众把更多精力放在房地产投机的短期收益上,就会挤占为长期目标努力奋斗的空间;而如果企业偏离实体经济的主攻方向,则有可能丢失最为核心的竞争力,最终威胁中国经济持续健康发展的动力。

房价涨跌有其自身规律,房地产市场的发展也有自身路径。但无论怎样,都不应该让房价消解奋斗的价值。否则,没房的人为房子日夜奔波,成为物质上的房奴;炒房的人则梦想着躺着把钱挣了,成为精神上的房奴。其结果,则可能是房价在高歌猛进中,消解了社会的活力与创造力。当每个人都相信依靠奋斗能够改变命运,当每个企业都相信坚持主业才是人间正道,我们这个社会才能释放更强发展动力、开拓更好发展前景。纵览世界各国的现代化历史,房地产可以是国民经济的重要组成部分,但绝不是一个国家的核心竞争力。最为重要的是,我们不能因为房价高企而失去对奋斗的信仰,相比于房子,我们更应该相信自己的双手;相比于炒房,我们更应该激发努力奋斗的士气。否则,失去奋斗,拥有再多的房产,我们也将无家可归。

Saturday 24 September 2016

SQL common database object compatible with Access, PostgreSQL, SQLite, MySQL, MSSQL, Sybase...

//App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
      <add connectionString="server=localhost;database=Inventory;user id=sa;password=SQLPassword"
           name="InventoryConnection"
           providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>

---------------------------------------------------------------------------------
// database layer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Common;
using System.Data;
using System.Configuration;

namespace CPRG254.Framework.Data
{
    public class DBObject
    {
        DbConnection Connection { get; set; }
        DbCommand Command { get; set; }
        DbDataReader Reader { get; set; }
        String ConnectionString { get; set; }

        DbProviderFactory Factory { get; set; }

        public DBObject(string connectionString, string providerName)
        {
            Factory = DbProviderFactories.GetFactory(providerName);
            ConnectionString = connectionString;
        }

        public IDataParameter CreateParameter
        {
            get
            {
                return Factory.CreateParameter();
            }
        }

        public IDataReader Query(string commandText,
                                        CommandType commandType,
                                        IDataParameter[] parameters)
        {
         
            try
            {
                //create connection
                Connection = Factory.CreateConnection();
                Connection.ConnectionString = ConnectionString;

                //create the command and set properties
                Command = Connection.CreateCommand();
                Command.CommandText = commandText;
                Command.CommandType = commandType;
                //add any parameters to the command object
                if (parameters != null)
                {
                    Command.Parameters.AddRange(parameters);
                }

                //open the connection
                Connection.Open();

                //execute the reader and return the reader
                Reader = Command.ExecuteReader(CommandBehavior.CloseConnection);
            }
            catch(Exception ex)
            {
                //log the error
                if (Reader != null) Reader.Close();
                if(Connection != null && Connection.State == ConnectionState.Open) Connection.Close();
            }
            return Reader;
        }

        public bool NonQuery(string commandText,
                                    CommandType commandType,
                                    IDataParameter[] parameters)
        {
         
            try
            {
                using (Connection = Factory.CreateConnection())
                {
                    Connection.ConnectionString = ConnectionString;

                    //instantiate the command
                    Command = Factory.CreateCommand();
                    Command.CommandText = commandText;
                    Command.Connection = Connection;

                    Command.CommandType = commandType;

                    //add any parameters to the command object
                    if (parameters != null)
                    {
                        Command.Parameters.AddRange(parameters);
                    }

                    //open the connection
                    Connection.Open();

                    //execute the command
                    Command.ExecuteNonQuery();

                    return true;
                } //closes the connection implicitly/automatically
            }
            catch (Exception ex)
            {
                //log the exception

                return false;
            }
        }

    }
}

---------------------------------------------------------------------------------
//business layer

using System;
//using System.Data.SqlClient;
using System.Collections.Generic;
using System.Configuration; //used for ConfigurationManager class
using System.Data;
using CPRG254.Framework.Data;

namespace InventoryDomain
{
    public class SupplierManager
    {
      
        public static bool Add(Supplier supplier)
        {
            //connection string retrieved from config file
            var connectionString =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ConnectionString;

            var providerName =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ProviderName;

            DBObject db = new DBObject(connectionString, providerName);
            //sql command text
            var sql = "prSupplierInsert";

            //create a SqlParameter object and and include it in an array
            var par = db.CreateParameter;
            par.ParameterName = "@Name";
            par.Value = supplier.Name;
            par.DbType = DbType.String; //optional

            var par2 = db.CreateParameter;
            par2.ParameterName = "@ID";
            par2.DbType = DbType.Int32;
            par2.Direction = ParameterDirection.Output;

            var pars = new IDataParameter[] { par, par2 };

            return db.NonQuery(sql, CommandType.StoredProcedure, pars);
        }

        public static bool Update(Supplier supplier)
        {
            //connection string retrieved from config file
            var connectionString =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ConnectionString;

            var providerName =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ProviderName;

            DBObject db = new DBObject(connectionString, providerName);

            //sql command text
            var sql = "UPDATE Supplier SET Name = @name WHERE ID = @id";

            //create a SqlParameter object and and include it in an array
            var par = db.CreateParameter;
            par.ParameterName = "@name";
            par.Value = supplier.Name;
            par.DbType = DbType.String; //optional

            var par2 = db.CreateParameter;
            par2.ParameterName = "@id";
            par2.DbType = DbType.Int32;
            par2.Value = supplier.Id;

            var pars = new IDataParameter[] { par, par2 };

            return db.NonQuery(sql, CommandType.Text, pars);
        }

        public static List<Supplier> GetAll()
        {
            //connection string retrieved from config file
            var connectionString =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ConnectionString;

            var providerName =
                ConfigurationManager.ConnectionStrings["InventoryConnection"].ProviderName;

            DBObject db = new DBObject(connectionString, providerName);

            var suppliers = new List<Supplier>();
            Supplier supplier; //used in the while loop below

         try
            {
                //execute the command
                using (var reader = db.Query("SELECT * FROM Supplier", CommandType.Text, null))
                {
                    var idOrdinal = reader.GetOrdinal("ID");
                    var nameOrdinal = reader.GetOrdinal("Name");

                    while (reader.Read())
                    {
                        //instantiate and set the state of a Supplier
                        supplier = new Supplier();
                        supplier.Id = reader.GetInt32(idOrdinal);
                        supplier.Name = reader.GetString(nameOrdinal);

                        //add the supplier to the suppliers collection
                        suppliers.Add(supplier);
                    }
                }//closes the data reader implicitly  - which also closes the connection because of CommandBehavior enum set in ExecuteReader in DBObject                  
               
            }
            catch (Exception ex)
            {
                //log the exception                
            }

            return suppliers;
        }


//copy to access
public static void Synchronize()
        {
            var suppliers = GetAll();
            var connstring = ConfigurationManager.
                               ConnectionStrings["MyCompanyConnection"].
                               ConnectionString;
            var provname = ConfigurationManager.
                               ConnectionStrings["MyCompanyConnection"].
                               ProviderName;
            var db = new DBObject(connstring, provname);
         

            string sql = null;
            foreach(var supp in suppliers)
            {
                var par = db.CreateParameter;
                var par2 = db.CreateParameter;

                par.Value = supp.Id;
                par2.Value = supp.Name;

                var pars = new IDataParameter[] { par, par2};

                sql = "INSERT INTO Companies VALUES(?,?)";
                db.NonQuery(sql, CommandType.Text, pars);
            }

        }

---------------------------------------------------------------------------------
//App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
      <add connectionString="server=DESKTOP-EUFGQAP;database=Inventory;Trusted_Connection=Yes"
           name="InventoryConnection"
           providerName="System.Data.SqlClient"/>
      <add connectionString="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\chuanshuoge\Documents\Database1.accdb;
Persist Security Info=False;"
           name="MyCompanyConnection"
           providerName="System.Data.OleDb"/>
    </connectionStrings>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
</configuration>