かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[C#][EntLib]Data Access Application Blockお試し

次は、Data Access Application BLockを触ってみようと思う。
ざっとドキュメントを見た感じの印象だと、Data Access Application Block(DAAB)を使うと、DBに依存しないアプリケーションが作りやすくなるよっ!
ADO.NETの素のAPIみたいに煩雑なプログラミングしなくてもよくなるよっ!

ってのがいいみたい。
雑にいっちゃうとADO.NETを、いい感じにラップしてくれているもののようです。

ということで、早速お試し。

プロジェクトの作成

DAABSampleという名前でコンソールアプリケーションを作成する。
そこに、必要な参照を追加する。追加するものは以下の5つ。

  1. Enterprise Library Data Access Application Block
  2. Enterprise Library Shared Library
  3. Microsoft.Practices.ObjectBuilder2
  4. Microsoft.Practices.Unity
  5. System.Configuration

データベースの作成

データベースにアクセスするプログラムを作るので、DBが無いと始まらない。
ということで、Visual StudioのサーバーエクスプローラからSQL ServerのDBを新規作成した。
image

DB名は、DAABSampleDBにした。
image

テーブルは、ありきたりな従業員(Employees)テーブルと部署(Departments)テーブルの2つを作ってEmployeesのDepartmentID列とDepartmentsのID列を外部キーで結んだ。
両テーブルの主キー列は、IDENTITYの設定をして自動で番号がふられるようにしておいた。
image

このテーブルに対して色々やっていこうと思う。

構成ファイルの編集

DBも準備できたので、続いてEnterprise Libraryではお馴染み構成ファイルを組み立てていこうと思う。
App.configをプロジェクトに追加して、右クリックメニューからEdit Enterprise Library Configurationを選択してApp.configを開く。
image

Data Access Application Blockが何故か自動的に作られているので、そこにあるLocal Sql Serverを選択してプロパティを編集していく。
image

Local Sql Serverのノードには、Name, ConnectionString, Provider Nameの3つのプロパティがある。
ここを適時設定していく。今回はNameをDAABSample、ConnectionStringを先ほど作ったDBのものに変更する。
ProviderNameは、SQL ServerなのでそのままでOK。

次に、Data Access Application Blockのノードを選択してDefaultDatabaseをDAABSampleに設定する。
こうすることで、プログラム側で名前を指定しない場合に、自動的にDAABSampleが使われるようになる。
image

設定は基本的に以上で終了。
やったことをまとめると。

  1. App.config追加
  2. Data Access Application BLock/Connection Stringsの下にDBへの接続文字列と名前の設定
  3. Data Access Application BlockのDefaultDatabaseの設定

やることが少なくてよろしい。

ついにプログラミング

下準備が整ったのでプログラミングに入ろうと思う。
Enterprise Library 4.0から、UnityContainerを中心に物事が進むようになっているので、まずUnityContainerのインスタンスを生成する。

そこに、EnterpriseLibraryCoreExtensionとDataAccessBlockExtensionを追加する。この3つを追加することで、さっき作った構成ファイルをもとにコンテナ内にインスタンスの登録などが行われる。

IUnityContainer container = new UnityContainer();
container.AddNewExtension<EnterpriseLibraryCoreExtension>();
container.AddNewExtension<DataAccessBlockExtension>();

次に、Databaseオブジェクトを取得する。
いつもどおりUnityを使うようにResolveメソッドを使うことでインスタンスの取得が出来る。

// Databaseのインスタンスを取得
var database = container.Resolve<Database>();
// 接続文字列等を出力して正しく取得できているか確認
Console.WriteLine(database.ConnectionString);

正しく設定が出来ていれば、先ほど構成ファイルに記述した接続文字列がコンソールに出力される。
ここにDBアクセスする処理を足していこうと思う。

データの登録処理

まだDBのほうに何もデータが入っていないのでINSERT系の処理を書いていく。
とりあえず、データの登録は一度やっちゃえばいいので、privateメソッドに切り出して書いてみた。

// DBにデータを登録する
private static void DoInsert(Database database)
{
    // 部署データを3つ準備
    var depts = new[]
        {
            new { ID = 1, Name = "人事部" },
            new { ID = 2, Name = "総務部" },
            new { ID = 3, Name = "営業部" }
        };

    // 部署データ登録用のDbCommand作成
    DbCommand insertDept = database.GetSqlStringCommand(
        "insert into Departments(ID, Name) values(@ID, @Name)");
    // パラメータの登録
    database.AddInParameter(insertDept, "ID", DbType.Int64);
    database.AddInParameter(insertDept, "Name", DbType.String);

    // データの登録
    foreach (var dept in depts)
    {
        database.SetParameterValue(insertDept, "ID", dept.ID);
        database.SetParameterValue(insertDept, "Name", dept.Name);
        database.ExecuteNonQuery(insertDept);
    }

    // 登録用の従業員データを4つ準備
    var emps = new[]
        {
            new { ID = 1, Name = "田中 太郎", DepartmentID = 1 },
            new { ID = 2, Name = "鈴木 次郎", DepartmentID = 2 },
            new { ID = 3, Name = "丸井 三郎", DepartmentID = 3 },
            new { ID = 4, Name = "木村 四郎", DepartmentID = 3 }
        };

    // 従業員データ登録用のDbCommand作成
    DbCommand insertEmp = database.GetSqlStringCommand(
        "insert into Employees(ID, Name, DepartmentID) values(@ID, @Name, @DepartmentID)");
    // パラメータの登録
    database.AddInParameter(insertEmp, "ID", DbType.Int64);
    database.AddInParameter(insertEmp, "Name", DbType.String);
    database.AddInParameter(insertEmp, "DepartmentID", DbType.Int64);

    foreach (var emp in emps)
    {
        database.SetParameterValue(insertEmp, "ID", emp.ID);
        database.SetParameterValue(insertEmp, "Name", emp.Name);
        database.SetParameterValue(insertEmp, "DepartmentID", emp.DepartmentID);
        database.ExecuteNonQuery(insertEmp);
    }
}

長いけど、これを実行すると下のようなデータがDBに入る。

Departmentsテーブル

ID Name
1 人事部
2 総務部
3 営業部

Employeesテーブル

ID Name DepartmentID
1 田中 太郎 1
2 鈴木 次郎 2
3 丸井 三郎 3
4 木村 四郎 3

更新系のSQLの発行までの流れは以下の通り。

  1. database.GetSqlStringCommandメソッドでDbCommandを作成
  2. DbCommand insertDept = database.GetSqlStringCommand(
         "insert into Departments(ID, Name) values(@ID, @Name)");
    
  3. database.AddInParameterでパラメータの定義
  4. // パラメータの登録
    database.AddInParameter(insertDept, "ID", DbType.Int64);
    database.AddInParameter(insertDept, "Name", DbType.String);
    
  5. database.SetParameterValueでパラメータの値の設定
  6. database.SetParameterValue(insertDept, "ID", dept.ID);
    database.SetParameterValue(insertDept, "Name", dept.Name);
    
  7. database.ExecuteNonQueryでSQL文の実行
  8. database.ExecuteNonQuery(insertDept);

この一連の処理をTransactionScopeで括ってやると、トランザクションもばっちりになる。
しかも、TransactionScopeを使ってると、コネクションを自動でキャッシュしてくれるらしいので、ローカルなトランザクションで済むという素敵なつくりになっているみたいです。

データの検索処理

データの準備が出来たので、検索系の処理のときの例も作ってみる。

// DbCommandを作成してパラメータの設定を行う
DbCommand cmd = database.GetSqlStringCommand(
    "select d.ID, d.Name from Departments d where ID = @ID");
database.AddInParameter(cmd, "ID", DbType.Int64);
database.SetParameterValue(cmd, "ID", 1);

// DataSetを作成して、そこにSQLの結果を読み込む
DataSet ds = new DataSet();
database.LoadDataSet(cmd, ds, "Departments");

// 試しにデータを出力してみる
DataTable deptTable = ds.Tables["Departments"];
Console.WriteLine(deptTable.TableName);
DataRow deptRow = deptTable.Rows[0];
Console.WriteLine("Dept: ID = {0}, Name = {1}", deptRow["ID"], deptRow["Name"]); // -> Dept: ID = 1, Name = 人事部

これも、基本的にDbCommandを作ってパラメータの定義と値を設定する。
そして、Databaseクラスに定義されている、各種読み込みメソッドを使ってデータを読み込む。
今回は、LoadDataSetを使ってDataSetに直接SQLの実行結果を取り込んでいる。

IDataReaderを使う場合はExecuteReaderメソッドを使う。

using(IDataReader r = database.ExecuteReader(cmd))
{
    while (r.Read())
    {
        long id = r.GetInt64(0);
        string name = r.GetString(1);
        Console.WriteLine("Dept: ID = {0}, Name = {1}", id, name);
    }
}

ExecuteReaderの結果のIDataReaderは、きちんとCloseしないといけない。とりあえず、usingで括っておけばOK。

試してみた感想

試してみていいな~と思った部分を列挙してみる。

  1. コネクションを意識しなくてもいい
  2. ADO.NETで直接やるよりコードが少なくなる
  3. TransactionScopeとの相性もよさそうらしい

次に、どうなんだろ?と思った点は

  1. 型付きデータセットとの相性は、そこまでよくないかも?
    型付きデータセットを普通に作るとTableAdapterまで作られちゃうからそっち使っちゃいそう。
  2. DataSetではない、普通のClassへデータを詰め替えるのがメンドクサイかも?
    IDataReaderを使って地道にぐるぐる回すしかなさそう。(ユーテリティクラス作ればいいか)

全体的には、シンプルになっていいな~と思った。

投稿日時 : 2008年11月9日 14:30

Feedback

# longchamps le pliage 2012/12/15 16:20 http://www.saclongchampachete.com/category/longcha

I basically like em. It's in contrast to you dress yourself in these out walking around town many people.

# burberry outlet 2012/12/15 22:57 http://www.burberryuksale.co

Nobody could see you to mug you out of your basement.

# トリーバーチ 財布 2012/12/16 17:55 http://www.torybruchjp.info

make these folks red by using a yellow pony!!

# guess france 2012/12/17 2:50 http://sacsguess.monwebeden.fr

If people sound good I'd totally wear these from home.

# エルメスクリスマス 2012/12/17 22:01 http://www.hermespairs.info/category/エルメスバーキン

It's O . K .. You can always be a youtube star =)

# isabel maratn pas cher 2012/12/18 2:08 http://sneakersisabelmarantsolde.monwebeden.fr

Ill be back down the track read other threads that.

# sac michael kors femme 2012/12/18 21:11 http://sacmichaelkorssoldes.monwebeden.fr/#/photos

Nobody should see one to mug you from your very own basement.

# burberry bags 2012/12/21 8:49 http://burberryukoutlets.wordpress.com/category/bu

Keep up the excellent deliver the results.

# sac michael kors 2012/12/22 18:56 http://sacmichaelkorssoldes.monwebeden.fr

The fashion don't flip the flat and even Philips doesn't offer a travel pouch inside the package.

# code la redoute 2013/03/06 20:54 http://www.k77.fr/

A very bro is probably not an acquaintance, although an acquaintance will be any bro. code la redoute http://www.k77.fr/

# casquette obey 2013/03/16 7:18 http://www.b44.fr/

Enjoyment is a scent you can't serve about a few with out finding a small number loses about one self. casquette obey http://www.b44.fr/

# usine23 2013/03/24 0:34 http://e55.fr/

Precise solidarity foresees the requirements of other rather then promulgate it can be particular. usine23 http://e55.fr/

# gemo 2013/04/04 13:57 http://ruezee.com/

All the most unfortunate solution to miss out a friend or relative is usually to be session properly they always these products finding out yourrrre able to‘tonne ask them to. gemo http://ruezee.com/

# brandalley 2013/04/07 11:57 http://rueree.com/

Absolutely love stands out as the simply rational and furthermore passable answer to the problem created by real person existence. brandalley http://rueree.com/

# tati 2013/04/08 0:29 http://ruenee.com/

Friendships closing the minute the two close friend is sure fresh a slight transcendence across the several. tati http://ruenee.com/

# qyIRJFVUgxySLv 2014/08/28 8:02 http://crorkz.com/

VvhoCu Thanks , I've just been looking for info approximately this topic for a while and yours is the best I have found out so far. But, what about the bottom line? Are you certain concerning the supply?

# uPjHLPomhlIxApm 2014/08/28 8:02 http://crorkz.com/

xrZYF5 You need to participate in a contest for among the finest blogs on the web. I will suggest this website!

# rhjzMABmnet 2014/09/02 19:48 https://www.youtube.com/watch?v=KLiKPsOc22A

F*ckin' amazing issues here. I'm very glad to look your post. Thanks so much and i'm looking forward to contact you. Will you please drop me a mail?

# vfiBVZobJBlP 2014/09/09 17:01 http://500views.com

Hi, i feel that i saw you visited my weblog thus i came to ???return the desire???.I am trying to in finding things to enhance my web site!I guess its good enough to use some of your concepts!!

# athFsKYAng 2014/09/09 18:36 http://www.arrasproperties.com/

you will have an important weblog right here! would you like to make some invite posts on my weblog?

# VrYbmXgJQwzd 2014/09/12 17:53 https://www.youtube.com/watch?v=jtXyUiBeflE

you've an excellent weblog right here! would you prefer to make some invite posts on my weblog?

# JaNGriJBCgWAWc 2014/09/16 7:21 http://ecommerce-investments.com/

Hiya! I simply would like to give an enormous thumbs up for the great info you will have right here on this post. I will probably be coming back to your weblog for extra soon.

# gKvGOChicUvZXLQufs 2014/09/17 7:46 http://www.theboatonlinestore.com/

F*ckin' tremendous issues here. I am very satisfied to peer your post. Thanks a lot and i'm taking a look forward to touch you. Will you please drop me a e-mail?

# It's in point of fact a great and useful piece of information. I am glad that you shared this useful info with us. Please stay us informed like this. Thanks for sharing. 2018/09/24 10:42 It's in point of fact a great and useful piece of

It's in point of fact a great and useful piece of information. I am glad that you shared this
useful info with us. Please stay us informed like this. Thanks
for sharing.

# I am regular reader, how are you everybody? This piece of writing posted at this web site is really fastidious. 2018/10/07 22:10 I am regular reader, how are you everybody? This p

I am regular reader, how are you everybody? This piece of writing posted at this web site is really fastidious.

# Wonderful post however I was wanting to know if you could write a litte more on this topic? I'd be very thankful if you could elaborate a little bit further. Kudos! 2018/11/09 17:02 Wonderful post however I was wanting to know if yo

Wonderful post however I was wanting to know if you could write a
litte more on this topic? I'd be very thankful if you could elaborate a little bit further.
Kudos!

# ghZjUWfLFwtZtmwIP 2021/07/03 4:21 https://www.blogger.com/profile/060647091882378654

There is definately a lot to learn about this subject. I love all of the points you have made.

# Illikebuisse heoaf 2021/07/03 21:29 pharmaceptica.com

tadalafil tablets https://pharmaceptica.com/

# Illikebuisse tnjdz 2021/07/04 7:53 pharmaceptica.com

erectile pictures https://www.pharmaceptica.com/

# Illikebuisse agtnx 2021/07/04 19:04 www.pharmaceptica.com

c-tadalafil https://www.pharmaceptica.com/

# erectile vacuum device 2021/07/06 3:15 plaquenil drug class

hydroxychloroquine 200 mg tab https://plaquenilx.com/# quineprox

# re: [C#][EntLib]Data Access Application Block??? 2021/07/06 8:11 hydroxychloroquine side effects heart

choroquine https://chloroquineorigin.com/# dangers of hydroxychloroquine

# re: [C#][EntLib]Data Access Application Block??? 2021/08/07 17:03 hydrocyhloroquine

clorquine https://chloroquineorigin.com/# hcqs tablet

# I do not know if it's just me or if everyone else encountering problems with your website. It appears like some of the written text within your posts are running off the screen. Can somebody else please provide feedback and let me know if this is happe 2021/08/28 21:05 I do not know if it's just me or if everyone else

I do not know if it's just me or if everyone else encountering problems with your website.

It appears like some of the written text within your posts are running
off the screen. Can somebody else please provide feedback and let me know if this is
happening to them as well? This may be a issue with my internet browser because I've had this
happen before. Kudos

# This is my first time visit at here and i am truly happy to read all at single place. 2021/08/31 23:38 This is my first time visit at here and i am truly

This is my first time visit at here and i am truly happy to read all at single place.

# I savour, cause I found exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye 2021/09/01 20:04 I savour, cause I found exactly what I used to be

I savour, cause I found exactly what I used to be
having a look for. You have ended my four day lengthy hunt!
God Bless you man. Have a great day. Bye

# I savour, cause I found exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye 2021/09/01 20:05 I savour, cause I found exactly what I used to be

I savour, cause I found exactly what I used to be
having a look for. You have ended my four day lengthy hunt!
God Bless you man. Have a great day. Bye

# I savour, cause I found exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye 2021/09/01 20:06 I savour, cause I found exactly what I used to be

I savour, cause I found exactly what I used to be
having a look for. You have ended my four day lengthy hunt!
God Bless you man. Have a great day. Bye

# I savour, cause I found exactly what I used to be having a look for. You have ended my four day lengthy hunt! God Bless you man. Have a great day. Bye 2021/09/01 20:07 I savour, cause I found exactly what I used to be

I savour, cause I found exactly what I used to be
having a look for. You have ended my four day lengthy hunt!
God Bless you man. Have a great day. Bye

# This is a great tip particularly to those new to the blogosphere. Simple but very accurate information… Many thanks for sharing this one. A must read post! 2021/09/04 11:03 This is a great tip particularly to those new to t

This is a great tip particularly to those new to the blogosphere.
Simple but very accurate information… Many thanks
for sharing this one. A must read post!

# This is a great tip particularly to those new to the blogosphere. Simple but very accurate information… Many thanks for sharing this one. A must read post! 2021/09/04 11:04 This is a great tip particularly to those new to t

This is a great tip particularly to those new to the blogosphere.
Simple but very accurate information… Many thanks
for sharing this one. A must read post!

# This is a great tip particularly to those new to the blogosphere. Simple but very accurate information… Many thanks for sharing this one. A must read post! 2021/09/04 11:05 This is a great tip particularly to those new to t

This is a great tip particularly to those new to the blogosphere.
Simple but very accurate information… Many thanks
for sharing this one. A must read post!

# This is a great tip particularly to those new to the blogosphere. Simple but very accurate information… Many thanks for sharing this one. A must read post! 2021/09/04 11:06 This is a great tip particularly to those new to t

This is a great tip particularly to those new to the blogosphere.
Simple but very accurate information… Many thanks
for sharing this one. A must read post!

# Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars 2021/09/14 12:35 Peculiar article, exactly what I wanted to find. q

Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars

# Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars 2021/09/14 12:36 Peculiar article, exactly what I wanted to find. q

Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars

# Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars 2021/09/14 12:37 Peculiar article, exactly what I wanted to find. q

Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars

# Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars 2021/09/14 12:38 Peculiar article, exactly what I wanted to find. q

Peculiar article, exactly what I wanted to find. quest bars https://www.iherb.com/search?kw=quest%20bars quest bars

# I truly love your website.. Great colors & theme. Did you build this website yourself? Please reply back as I'm trying to create my very own site and want to learn where you got this from or what the theme is named. Thanks! 2021/12/29 12:07 I truly love your website.. Great colors & the

I truly love your website.. Great colors & theme.
Did you build this website yourself? Please reply back as I'm trying
to create my very own site and want to learn where you got this from
or what the theme is named. Thanks!

# eigykzvmcsrq 2022/05/30 20:13 bazufjis

http://erythromycinn.com/# erythromycin ophthalmic ointment usp 0.5

# I'm truly enjoying the design and layout of your website. It's a very easy on the eyes which makes it much more pleasant for me to come here and visit more often. Did you hire out a designer to create your theme? Fantastic work! 2022/11/28 17:12 I'm truly enjoying the design and layout of your

I'm truly enjoying the design and layout of your website.
It's a very easy on the eyes which makes it much more pleasant for me to come here
and visit more often. Did you hire out a designer to create your theme?
Fantastic work!

# What a material of un-ambiguity and preserveness of precious know-how about unexpected feelings. 2022/12/02 23:25 What a material of un-ambiguity and preserveness o

What a material of un-ambiguity and preserveness
of precious know-how about unexpected feelings.

# buy cheap doxycycline - https://doxycyclinesale.pro/# 2023/04/22 4:10 Doxycycline

buy cheap doxycycline - https://doxycyclinesale.pro/#

# purchase prednisone - https://prednisonesale.pro/# 2023/04/22 15:16 Prednisone

purchase prednisone - https://prednisonesale.pro/#

# purchase cytotec - https://cytotecsale.pro/# 2023/04/29 4:46 Cytotec

purchase cytotec - https://cytotecsale.pro/#

# ed pills for sale: https://edpills.pro/# 2023/05/16 3:26 EdPillsPro

ed pills for sale: https://edpills.pro/#

# prednisone pill prices https://prednisonepills.pro/# - where to buy prednisone in canada 2023/06/05 5:24 Prednisone

prednisone pill prices https://prednisonepills.pro/# - where to buy prednisone in canada

# buy paxlovid online https://paxlovid.store/
paxlovid 2023/07/13 21:47 Paxlovid

buy paxlovid online https://paxlovid.store/
paxlovid

# paxlovid india https://paxlovid.life/# paxlovid covid 2023/07/26 6:23 Paxlovid

paxlovid india https://paxlovid.life/# paxlovid covid

# online apotheke preisvergleich 2023/09/26 12:07 Williamreomo

http://onlineapotheke.tech/# versandapotheke deutschland
internet apotheke

# п»їonline apotheke 2023/09/26 23:29 Williamreomo

https://onlineapotheke.tech/# internet apotheke
internet apotheke

# online apotheke deutschland 2023/09/26 23:57 Williamreomo

https://onlineapotheke.tech/# versandapotheke versandkostenfrei
online apotheke gГ?nstig

# online apotheke gГјnstig 2023/09/27 2:25 Williamreomo

https://onlineapotheke.tech/# versandapotheke
gГ?nstige online apotheke

# п»їonline apotheke 2023/09/27 5:03 Williamreomo

http://onlineapotheke.tech/# online apotheke gГ?nstig
internet apotheke

# п»їonline apotheke 2023/09/27 9:39 Williamreomo

http://onlineapotheke.tech/# gГ?nstige online apotheke
gГ?nstige online apotheke

# gГјnstige online apotheke 2023/09/27 11:12 Williamreomo

https://onlineapotheke.tech/# gГ?nstige online apotheke
п»?online apotheke

# п»їonline apotheke 2023/09/27 12:45 Williamreomo

https://onlineapotheke.tech/# п»?online apotheke
п»?online apotheke

# farmacia online senza ricetta 2023/09/27 20:50 Rickeyrof

acheter sildenafil 100mg sans ordonnance

# canadian certified pharmacies 2023/10/16 13:27 Dannyhealm

Always up-to-date with international medical advancements. https://mexicanpharmonline.com/# mexico drug stores pharmacies

# canadian pharmecy 2023/10/16 17:21 Dannyhealm

Their team understands the nuances of global healthcare. https://mexicanpharmonline.com/# mexican pharmaceuticals online

# canada prescription online 2023/10/16 18:01 Dannyhealm

Their worldwide services are efficient and patient-centric. https://mexicanpharmonline.com/# mexico drug stores pharmacies

# how to buy prescriptions from canada safely 2023/10/16 18:42 Dannyhealm

They simplify global healthcare. http://mexicanpharmonline.shop/# mexican border pharmacies shipping to usa

# no presciption needed 2023/10/16 23:30 Dannyhealm

Their online portal is user-friendly and intuitive. https://mexicanpharmonline.shop/# mexican pharmaceuticals online

# prescription canada 2023/10/17 22:58 Dannyhealm

They make prescription refills a breeze. http://mexicanpharmonline.shop/# mexican rx online

# prescription online canada 2023/10/18 0:40 Dannyhealm

They provide valuable advice on international drug interactions. http://mexicanpharmonline.shop/# mexican border pharmacies shipping to usa

# buying pharmaceuticals from canada 2023/10/18 1:49 Dannyhealm

Always stocked with what I need. http://mexicanpharmonline.com/# mexican pharmaceuticals online

# mexican pharmacies that ship to usa 2023/10/18 12:13 Dannyhealm

Always leaving this place satisfied. http://mexicanpharmonline.com/# mexican pharmaceuticals online

# prescription meds from canada 2023/10/18 23:50 Dannyhealm

A cornerstone of our community. https://mexicanpharmonline.com/# mexican border pharmacies shipping to usa

# canadian rx store 2023/10/19 12:25 Dannyhealm

Their 24/7 support line is super helpful. https://mexicanpharmonline.com/# mexican pharmaceuticals online

# cheapest ed pills online 2023/11/21 9:37 WilliamApomb

https://sildenafil.win/# buy sildenafil citrate

# doxycycline 150 mg https://doxycycline.forum/ doxycycline 100mg price 2023/11/25 13:18 Doxycycline

doxycycline 150 mg https://doxycycline.forum/ doxycycline 100mg price

タイトル
名前
Url
コメント