[C#]使用Oracle.ManagedDataAccess與dapper來跟Oracle做溝通

[C#]使用Oracle.ManagedDataAccess與dapper來跟Oracle做溝通

前言

Oracle說實在的跟C#結合坑真的還不少,比如說32位元或64位元的問題會造成無法連接的問題等等,而Oracle.ManagedDataAccess是Oracle後來為了.net出的package,造福了後來寫Oracle的.net工程師,至於Dapper則是stack overflow專用針對ado.net包裝的非常好用的package,那就來看看如何做結合吧。

安裝Oracle.ManagedDataAccess

安裝Dapper

接著先來新增資料吧,這邊用到的是之前介紹過的BOGUS來快速新增假資料

    public class OracleController : ApiController
    {
        public IDbConnection GetConnection //回傳OracleConnection
        {
            get
            {
                string connString = "Data source=localhost/book;User id=your account;Password=your pwd;";
                return new OracleConnection(connString);
            }
        }

        public async Task<IHttpActionResult> Get() //取得資料
        {
            using (var con = GetConnection)
            {
                var dao = con.QueryAsync<EmployeeDto>("SELECT id,name,address,phone_number as phoneNumber FROM  EMPLOYEE");
                var companyResult = con.QueryAsync<CompanyDto>("SELECT id,companyName FROM company");
                return Ok(new { Employee = await dao, Companys = await companyResult });
            }
        }

        public async Task<IHttpActionResult> Post() //新增假資料,各新增一百筆
        {

            var faker = new Faker("en"); //使用BOGUS,設定為英文版
            var employees = new List<EmployeeDto>();
            var companys = new List<CompanyDto>();
            for (int i = 0; i < 100; i++)
            {
                employees.Add(new EmployeeDto
                {
                    Address = faker.Address.City(),
                    Name = faker.Name.FirstName(),
                    PhoneNumber = faker.Random.Replace("092#######")
                });

                companys.Add(new CompanyDto
                {
                    CompanyName = faker.Company.CompanyName()
                });
            }
            using (TransactionScope scope = new TransactionScope()) //要自己加入參考 System.Transactions
            {
                using (var con = GetConnection) //使用屬性來得到IDbConnection
                {
                    var task1 = con.ExecuteAsync("EMPLOYEE_CREATE",
                        employees.Select(x => new { Address = x.Address, Name = x.Name, PhoneNumber = x.PhoneNumber }),
                        commandType: CommandType.StoredProcedure);
                    var task2 = con.ExecuteAsync("COMPANY_CREATE",
                        companys.Select(x => new { CompanyName = x.CompanyName }),
                        commandType: CommandType.StoredProcedure);
                    await task1;
                    await task2;
                    scope.Complete();
                    return Ok();
                }
            }
        }
    }

我先去取得資料,証明目前資料庫是沒有資料,然後按POST去新增一百筆資料,最後再取得資料顯示出來

結論

簡單記錄一下用C#跟oracle溝通的部份,算是很初學者入門的,如果不想理解其他的部份,其實只要著重在dapper和oracle連線的部份,接下來有時間再整理一下使用nanoprofiler整合的部份,如果有任何錯誤再請指教。