tag:crieit.net,2005:https://crieit.net/users/doraxdorax/feed doraxdoraの投稿 - Crieit Crieitでユーザーdoraxdoraによる最近の投稿 2020-03-09T10:04:51+09:00 https://crieit.net/users/doraxdorax/feed tag:crieit.net,2005:PublicArticle/15753 2020-03-09T10:04:51+09:00 2020-03-09T10:04:51+09:00 https://crieit.net/posts/Java-JSON-lib-JSON-Date 【Java】JSON-libを使ってJSON配列を生成する際に日付型(Date)を好きなフォーマットで変換する方法 <p>最近はWEBのサービス開発などでSPA(Single Page Applicatoin)が流行って?るので、<br /> サーバーとクライアントとのデータのやり取りをJSONで行うのはよくあるケースかと思います。</p> <p>サーバー側をJavaで開発している場合に、Javaオブジェクトや Bean を JSONに変換するのに、<br /> JSON-lib というのも結構主流なやり方かと思いますが、ちょっと日付型のところでハマったので備忘的な記事を。</p> <p><span style="color: #de2a2a;">※JSON-lib 自体の詳しい説明(利用方法)などは省略します。</span></p> <h2 id="JSON-libとは"><a href="#JSON-lib%E3%81%A8%E3%81%AF">JSON-libとは</a></h2> <blockquote><a target="_blank" rel="nofollow noopener" href="https://ja.osdn.net/projects/sfnet_json-lib/" target="_blank" rel="noopener noreferrer">OSDNサイト</a>より転載 Json-libは、beans, map, collection, Java配列、XML to JSON, DynaBeansを変革するJavaライブラリです。 Douglas Crockfordによる作業をベースにしています。</blockquote> <p>Javaオブジェクトを簡単に JSON文字列に変換したり、逆に JSON文字列からオブジェクトを生成したりといったことが可能です。</p> <p>昔、XMLへの相互変換ロジックを自作したことがありますが、こういう処理って実際に作ってみると結構大変だったりします。<br /> 便利な世の中ですね。</p> <h2 id="サンプル"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">サンプル</a></h2> <p>変換するサンプルクラスを作成。</p> <p>Person.java</p> <pre><code>package jp.co.doraxdora.sample; import java.io.Serializable; import java.util.Date; /** * パーソンクラス * * @author doraxdora * */ public class Person implements Serializable { /** ID */ private int id; /** 氏名 */ private String name; /** 年齢 */ private int age; /** 更新日時 */ private Date updateDate; public Person() { } /** * パーソンの生成 * * @param id * @param name * @param age */ public Person(int id, String name, int age, Date updateDate) { this.id = id; this.name = name; this.age = age; this.updateDate = updateDate; } /** * @return id */ public int getId() { return id; } /** * @param id セットする id */ public void setId(int id) { this.id = id; } /** * @return name */ public String getName() { return name; } /** * @param name セットする name */ public void setName(String name) { this.name = name; } /** * @return age */ public int getAge() { return age; } /** * @param age セットする age */ public void setAge(int age) { this.age = age; } /** * @return updateDate */ public Date getUpdateDate() { return updateDate; } /** * @param updateDate セットする updateDate */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } } </code></pre> <p>何故か更新日時を持つパーソンクラスです。</p> <h3 id="JavaオブジェクトからJSON文字列に変換"><a href="#Java%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8B%E3%82%89JSON%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B">JavaオブジェクトからJSON文字列に変換</a></h3> <pre><code>import net.sf.json.JSONObject; public class HelloWorld { public static void main(String[] args) { Person person = new Person(1, "サンプル 一郎", 20, new Date()); JSONObject jsonObject = JSONObject.fromObject(person); System.out.println(String.valueOf(jsonObject)); } } </code></pre> <p>こんな感じで、Dateを持つクラスをJSONに変換すると次のような文字列が生成されます。</p> <pre><code>{ "age": 20, "id": 1, "name": "サンプル 一郎", "updateDate": { "date": 23, "day": 2, "hours": 10, "minutes": 22, "month": 3, "seconds": 44, "time": 1555982564167, "timezoneOffset": -540, "year": 119 } } </code></pre> <p>これはこれで正しいのですが、クライアント側で日時の部分が扱いづらい。。</p> <h2 id="対応"><a href="#%E5%AF%BE%E5%BF%9C">対応</a></h2> <p>JSON-lib には、「JsonValueProcessor」という、変換時に対象となる値に対して処理できるインターフェースが定義されているので、<br /> 実装したクラスを作成して日付型オブジェクトに対して別途変換する処理を組み込みます。</p> <p>DateJsonValueProcessor.java</p> <pre><code>package jp.co.doraxdora.sample; import java.util.Date; import net.sf.json.JsonConfig; import net.sf.json.processors.JsonValueProcessor; import java.text.SimpleDateFormat; /** * 日付型をJSON変換する際にフォーマットする * * @author doraxdora * */ public class DateJsonValueProcessor implements JsonValueProcessor { /* (非 Javadoc) * @see net.sf.json.processors.JsonValueProcessor#processArrayValue(java.lang.Object, net.sf.json.JsonConfig) */ @Override public Object processArrayValue(Object value, JsonConfig jsonConfig) { return process((Date) value, jsonConfig); } /* (非 Javadoc) * @see net.sf.json.processors.JsonValueProcessor#processObjectValue(java.lang.String, java.lang.Object, net.sf.json.JsonConfig) */ @Override public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return process((Date) value, jsonConfig); } /** * 日付型を文字列に変換. * * @param date * @param config * @return */ private Object process(Date date, JsonConfig config) { if (date == null) { return null; } SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd(E)"); return formatter.format(date); } } </code></pre> <h3 id="JsonConfig に DateValueProcessor を設定して変換"><a href="#JsonConfig+%E3%81%AB+DateValueProcessor+%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E5%A4%89%E6%8F%9B">JsonConfig に DateValueProcessor を設定して変換</a></h3> <pre><code>import net.sf.json.JSONObject; import net.sf.json.JsonConfig; public class HelloWorld { public static void main(String[] args) { Person person = new Person(1, "サンプル 一郎", 20, new Date()); JsonConfig config = new JsonConfig(); config.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor()); JSONObject jsonObject = JSONObject.fromObject(person, config); System.out.println(String.valueOf(jsonObject)); } } </code></pre> <p>という感じで、日付型だった場合の処理を設定して変換してあげると次のような文字列が生成されます。</p> <pre><code>{ "age": 20, "id": 1, "name": "サンプル 一郎", "updateDate": "2019/04/23(火)" } </code></pre> <p>大分シンプルになりました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ちょっとした単発のプログラムネタでした。</p> <p>実は以前 Python でも同様の問題にぶち当たったことがあって、<br /> だったら Java でも同じようになんとかできるだろうと調べてみたという感じです。</p> <p>何かのお役に立てれば。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15698 2020-01-27T10:01:36+09:00 2020-01-27T10:01:36+09:00 https://crieit.net/posts/JavaFX-Oracle-TableView 【JavaFX】Oracle に接続して取得したデータをTableView に表示する <p>引き続き、JavaFXで Oracle から取得したデータを TableView に表示したいと思います。</p> <p>プログラムは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/30/post-2626/" target="_blank" rel="noopener">【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する</a></p> <h2 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView000.jpg" alt="クラスの作成" /></p> <p>パッケージ・エクスプローラーから「dto」パッケージを右クリックし「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView001.jpg" alt="名前を入力" /></p> <p>クラス名に「TblCat」を入力し、「完了」ボタンをクリックします。</p> <p>作成したクラスの実装は次のようにします。</p> <p>TblCat.java</p> <pre><code>/** * */ package jp.co.doraxdora.dto; import java.io.Serializable; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; /** * TBL猫DTOクラス. * * @author doraxdora * */ public class TblCat implements Serializable { /** No */ private StringProperty no; /** 名前 */ private StringProperty name; /** 性別 */ private StringProperty sex; /** 年齢 */ private StringProperty age; /** 種別 */ private StringProperty kindCd; /** 好物 */ private StringProperty favorite; /** * @return no */ public StringProperty noProperty() { return no; } /** * @param no * セットする no */ public void setNo(String no) { this.no = new SimpleStringProperty(no); } /** * @return name */ public StringProperty nameProperty() { return name; } /** * @param name * セットする name */ public void setName(String name) { this.name = new SimpleStringProperty(name); } /** * @return sex */ public StringProperty sexProperty() { return sex; } /** * @param sex * セットする sex */ public void setSex(String sex) { this.sex = new SimpleStringProperty(sex); } /** * @return age */ public StringProperty ageProperty() { return age; } /** * @param age * セットする age */ public void setAge(String age) { this.age = new SimpleStringProperty(age); } /** * @return kind */ public StringProperty kindCdProperty() { return kindCd; } /** * @param kind * セットする kind */ public void setKindCd(String kindCd) { this.kindCd = new SimpleStringProperty(kindCd); } /** * @return favorite */ public StringProperty favoriteProperty() { return favorite; } /** * @param favorite * セットする favorite */ public void setFavorite(String favorite) { this.favorite = new SimpleStringProperty(favorite); } } </code></pre> <p> </p> <p><span style="color: #000000;">TblViewの仕組み上</span><br /> <span style="color: #000000;">通常のアクセサとは異なり、getter のメソッド名は [メンバ名]Property とします。<br /> こうしておかないと一覧にデータが表示されずにあたふたしますよ。</span></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView002.jpg" alt="" /> メソッドの追加</p> <p>SceneBuilder からであれば、右側のメニューから「On Action」にメソッド名を設定しますが、<br /> fxmlを直接修正しても問題ありません。</p> <p>Smaple.fxml</p> <pre><code><?xml version="1.0" encoding="UTF-8"?> <import javafx.scene.control.Button> <import javafx.scene.control.ComboBox> <import javafx.scene.control.Label> <import javafx.scene.control.TableColumn> <import javafx.scene.control.TableView> <import javafx.scene.control.TextField> <import javafx.scene.layout.AnchorPane> <import javafx.scene.control.cell.PropertyValueFactory> <AnchorPane fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="350.0" prefWidth="530.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"> <children> <Label fx:id="lbName" layoutX="14.0" layoutY="33.0" text="名前:" /> <TextField fx:id="txName" layoutX="58.0" layoutY="29.0" /> <Label fx:id="lbKind" layoutX="221.0" layoutY="33.0" text="種別:" /> <ComboBox fx:id="cbKind" layoutX="264.0" layoutY="29.0" prefWidth="150.0" /> <Button fx:id="btSearch" layoutX="456.0" layoutY="29.0" mnemonicParsing="false" onAction="#btSearchButtonActionHandle" text="検索" /> <TableView fx:id="tvCat" layoutX="14.0" layoutY="63.0" prefHeight="273.0" prefWidth="500.0"> <columns> <TableColumn maxWidth="50.0" minWidth="50.0" prefWidth="50.0" resizable="false" text="No"> <cellValueFactory><PropertyValueFactory property="no"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="100.0" minWidth="100.0" prefWidth="100.0" text="名前" > <cellValueFactory><PropertyValueFactory property="name"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="性別" > <cellValueFactory><PropertyValueFactory property="sex"/></cellValueFactory> </TableColumn> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="年齢" > <cellValueFactory><PropertyValueFactory property="age"/></cellValueFactory> </TableColumn> <TableColumn minWidth="120.0" prefWidth="120.0" text="種別" > <cellValueFactory><PropertyValueFactory property="kindCd"/></cellValueFactory> </TableColumn> <TableColumn minWidth="145.0" prefWidth="147.0" text="好物" > <cellValueFactory><PropertyValueFactory property="favorite"/></cellValueFactory> </TableColumn> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </AnchorPane> </code></pre> <h3 id="CSSの修正"><a href="#CSS%E3%81%AE%E4%BF%AE%E6%AD%A3">CSSの修正</a></h3> <p><span class=" author-d-iz88z86z86za0dz67zz78zz78zz74zz68zjz80zz71z9iz90z9z84zrpz78zez89zz80zz74zz70ziz73z2qz76zgqnz66z0uyz82zz89zz78zz83zhjez73zj">application.css<br /> </span></p> <pre><code> /* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */ .root { -fx-font-family: "Meiryo"; } </code></pre> <h3 id="TableViewの型を変更"><a href="#TableView%E3%81%AE%E5%9E%8B%E3%82%92%E5%A4%89%E6%9B%B4">TableViewの型を変更</a></h3> <p>SampleController.java</p> <p>クラスに定義されているメンバーの型を新規作成した TblCat に変更します。</p> <pre><code> /** テーブルビュー:一覧 */ @FXML private TableView<TblCat> tvCat; </code></pre> <h3 id="検索ボタンクリック時のメソッドを追加"><a href="#%E6%A4%9C%E7%B4%A2%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E6%99%82%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0">検索ボタンクリック時のメソッドを追加</a></h3> <p>SampleController.java(メソッドのみ抜粋)</p> <pre><code> /** * 検索ボタンアクションハンドラー. * * @param ev */ @FXML public void btSearchButtonActionHandle(ActionEvent ev) { try { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM TBLCAT ORDER BY NO"); // 取得したデータを追加 ObservableList<TblCat> list = FXCollections.observableArrayList(); while (rs != null &amp;&amp; rs.next()) { TblCat cat = new TblCat(); cat.setNo(rs.getString("NO")); cat.setName(rs.getString("NAME")); cat.setSex(rs.getString("SEX")); cat.setAge(rs.getString("AGE")); cat.setKindCd(rs.getString("KIND_CD")); cat.setFavorite(rs.getString("FAVORITE")); list.add(cat); } tvCat.setItems(list); } catch (SQLException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView003.jpg" alt="検索" /></p> <p>起動後、検索ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxTblView004.jpg" alt="データが表示される" /></p> <p>無事にデータが表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とりあえず検索の条件などは無視してデータを表示してみました。</p> <p>次回は、検索条件の設定などをやっていきたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15694 2020-01-24T09:43:29+09:00 2020-01-24T09:43:29+09:00 https://crieit.net/posts/JavaFX-Oracle 【JavaFX】Oracleに接続して取得したデータをコンボボックスに設定する <p>前回に引き続き、JavaFXです。<br /> 今回は Oracle からデータを取得してコンボボックスに設定します。</p> <p>利用するテーブルや Oracle のインストールなどは次の記事を参照してください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/08/31/post-2304/" target="_blank" rel="noopener noreferrer">Oracle Database Express Edition 11g Release 2 のインストールからテーブル作成まで</a></p> <p>Swing でやったのとほぼほぼ同じです。</p> <p>プログラムは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/28/post-2615/" target="_blank" rel="noopener noreferrer">【JavaFX】コンボボックスに項目を設定する</a></p> <h2 id="ライブラリの追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリの追加</a></h2> <p>Oracle からデータを取得するために、ライブラリを追加します。<br /> パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb000.jpg" alt="外部 JARの追加" /></p> <p>「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、<br /> 「外部 JAR の追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb001.jpg" alt="外部ファイルの選択" /></p> <p>ファイル選択ダイアログが表示されるので、<br /> Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。</p> <p>デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。</p> <pre><code>C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib </code></pre> <p>ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。</p> <h2 id="パッケージの作成"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90">パッケージの作成</a></h2> <p>次の2つのパッケージを作成します。</p> <pre><code>jp.co.doraxdora.common jp.co.doraxdora.dto </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb002.jpg" alt="パッケージの作成" /></p> <p>パッケージ・エクスプローラーで「src」を右クリック>「新規」>「パッケージ」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb003.jpg" alt="パッケージ名の入力" /></p> <p>名前に「jp.co.doraxdora.common」を入力して「完了」ボタンをクリックします。<br /> 同様に「jp.co.doraxdora.dto」も作成します。</p> <p> </p> <h2 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h2> <p>次の2つのクラスをそれぞれのパッケージに作成します。</p> <pre><code>jp.co.doraxdora.common.DBAccess.java jp.co.doraxdora.dto.MstKind.java </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb004.jpg" alt="クラスの作成" /></p> <p>パッケージ・エクスプローラーでパッケージを右クリック>「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb005.jpg" alt="クラス名の入力" /></p> <p>名前に「DBAccess」を入力して「完了」ボタンをクリックします。<br /> 同様に「MstKind」も作成します。</p> <h3 id="実装"><a href="#%E5%AE%9F%E8%A3%85">実装</a></h3> <p>DBAccess.java</p> <pre><code> package jp.co.doraxdora.common; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import oracle.jdbc.pool.OracleDataSource; /** * @author doraxdora * */ public class DBAccess { private static String DB_URL = "jdbc:oracle:thin:USER01/USER01@localhost:1521:XE"; private static Connection con = null; /** * コンストラクタ. * * @throws Exception */ public DBAccess() throws Exception{ super(); // ドライバのロード OracleDataSource ds = new OracleDataSource(); ds.setURL(DB_URL); // DB接続 con = ds.getConnection(); } /** * SQLを実行して結果を取得します. * @param sql * @return */ public ResultSet executeQuery(String sql) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); return stmt.executeQuery(); } /** * パラメータを指定してSQLを実行し、結果を取得します. * * @param sql * @param param * @return * @throws Exception */ public ResultSet executeQuery(String sql, List<Object> param) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); for (int i = 0; i < param.size(); i++) { if (param.get(i) instanceof String) { stmt.setString(i, (String) param.get(i)); } else if (param.get(i) instanceof Integer) { stmt.setInt(i, (int) param.get(i)); } } return stmt.executeQuery(); } } </code></pre> <p>MstKind.java</p> <pre><code>/** * */ package jp.co.doraxdora.dto; import java.io.Serializable; /** * MST種別クラス. * * @author doraxdora * */ public class MstKind implements Serializable { /** 種別コード */ private String kindCd; /** 種別名 */ private String kindName; /** * @return kindCd */ public String getKindCd() { return kindCd; } /** * @param kindCd セットする kindCd */ public void setKindCd(String kindCd) { this.kindCd = kindCd; } /** * @return kindName */ public String getKindName() { return kindName; } /** * @param kindName セットする kindName */ public void setKindName(String kindName) { this.kindName = kindName; } /* (非 Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return kindName; } } </code></pre> <p>JavaFX の ComboBox の実装が、<br /> toString()メソッドを利用して表示文字列を取得しているため、<br /> toString()メソッドをオーバーライドし、表示するメンバーの値を返すようにする必要があります。</p> <h2 id="コントローラーの修正"><a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E3%81%AE%E4%BF%AE%E6%AD%A3">コントローラーの修正</a></h2> <h3 id="インポート文の追加およびメンバー型の変更"><a href="#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E6%96%87%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%8A%E3%82%88%E3%81%B3%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E5%9E%8B%E3%81%AE%E5%A4%89%E6%9B%B4">インポート文の追加およびメンバー型の変更</a></h3> <p>SampleController.java(変更箇所のみ抜粋)</p> <pre><code>// インポート文追加 import jp.co.doraxdora.common.DBAccess; import jp.co.doraxdora.dto.MstKind; public class SampleController implements Initializable{ /** コンボボックス:名前 */ // String から MstKind のリストに変更 // アクセサも修正が必要 @FXML //private ComboBox<String> cbKind; private ComboBox<MstKind> cbKind; /** * @return cbKind */ public ComboBox<MstKind> getCbKind() { return cbKind; } /** * @param cbKind セットする cbKind */ public void setCbKind(ComboBox<MstKind> cbKind) { this.cbKind = cbKind; } ) </code></pre> <h3 id="初期化処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期化処理の修正</a></h3> <p>SampleController.java(メソッドのみ抜粋)</p> <pre><code> /* * (非 Javadoc) * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle) */ @Override public void initialize(URL location, ResourceBundle resources) { try { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD"); // 指定なしを追加 MstKind empty = new MstKind(); empty.setKindCd("-1"); empty.setKindName("指定なし"); cbKind.getItems().add(empty); // 取得したデータを追加 while (rs != null &amp;&amp; rs.next()) { MstKind kind = new MstKind(); kind.setKindCd(rs.getString("KIND_CD")); kind.setKindName(rs.getString("KIND_NAME")); cbKind.getItems().add(kind); } // 初期選択状態を設定 cbKind.getSelectionModel().select(0); } catch (SQLException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } </code></pre> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxOrclCmb006.jpg" alt="起動した画面" /></p> <p>内容は前回のものと変わりませんが、<br /> 無事に表示することができました。</p> <p>次回は一覧にデータ表示するところまでやってみたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15691 2020-01-20T09:27:40+09:00 2020-01-20T09:27:40+09:00 https://crieit.net/posts/JavaFX 【JavaFX】さくっとコンボボックスに項目を設定してみる <p>今回は、JavaFXの基本的な構成や仕組みなどを学ぶために<br /> とりあえずコンボボックスに項目を設定して選択できるようにしてみます。</p> <p>開発環境については以前の記事を参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/22/post-2584/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【JavaFX】eclipseにJavaFXプラグインをインストールして Hello World してみる</a></p> <h2 id="画面の作成"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BD%9C%E6%88%90">画面の作成</a></h2> <p>画面は SceneBuilder にて作成します。<br /> (WPF で作成した画面と同等のものを作ってみたいと思います。)</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/category/dev/c/" target="_blank" rel="noopener noreferrer">WPF編はこちら</a></p> <p>初期状態では、「BorderPane」が設置されていますが、<br /> それを削除して「AnchorPane」を設置し、その上にコントロールを配置していきます。</p> <p>AnchorPane というのは、<br /> 簡単に言うとコントロールを座標(絶対位置)で配置できるレイアウトになります。</p> <p>その他のレイアウトについてはそのうち紹介できればします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo000.jpg" alt="画面へコントロールを配置" /></p> <p>SceneBuilder上で CTRL + P を押すとプレビュー表示することができます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo001.jpg" alt="プレビュー表示" /></p> <p>eclipse で Java プリケーションの実行をしなくても起動後の画面がサクッと表示されます。<br /> (プログラムは動かないのでコントロールの位置確認のみ)</p> <p>Sample.fxml</p> <pre><code><?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.ComboBox?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.AnchorPane?> <AnchorPane fx:id="mainPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="350.0" prefWidth="530.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.SampleController"><!-- ← コントローラクラスと紐付 --> <children> <!-- 名前 --> <Label fx:id="lbName" layoutX="14.0" layoutY="33.0" text="名前:" /> <TextField fx:id="txName" layoutX="58.0" layoutY="29.0" /> <!-- 種別 --> <Label fx:id="lbKind" layoutX="221.0" layoutY="33.0" text="種別:" /> <ComboBox fx:id="cbKind" layoutX="264.0" layoutY="29.0" prefWidth="150.0" /> <!-- 検索ボタン --> <Button fx:id="btSearch" layoutX="456.0" layoutY="29.0" mnemonicParsing="false" text="検索" /> <!-- 一覧 --> <TableView fx:id="tvCat" layoutX="14.0" layoutY="63.0" prefHeight="273.0" prefWidth="498.0"> <columns> <TableColumn maxWidth="50.0" minWidth="50.0" prefWidth="50.0" resizable="false" text="No" /> <TableColumn maxWidth="100.0" minWidth="100.0" prefWidth="100.0" text="名前" /> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="性別" /> <TableColumn maxWidth="40.0" minWidth="40.0" prefWidth="40.0" text="年齢" /> <TableColumn minWidth="120.0" prefWidth="120.0" text="種別" /> <TableColumn minWidth="145.0" prefWidth="147.0" text="好物" /> </columns> <columnResizePolicy> <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /> </columnResizePolicy> </TableView> </children> </AnchorPane> </code></pre> <h2 id="コントローラクラスの実装"><a href="#%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E5%AE%9F%E8%A3%85">コントローラクラスの実装</a></h2> <p>JavaFX では、<br /> 基本的に fxml (画面定義)と対応するコントローラー(クラス)を作成し、<br /> コントローラーにてイベントなどを処理するような構成となります。</p> <p>fxml に記述した</p> <pre><code> fx:controller="application.SampleController" </code></pre> <p>でコントローラを指定し、コントローラークラスには<br /> 画面に設置したコントロールをメンバーとして定義することが必要。</p> <p>こうすることで、<br /> コントローラークラスにて画面のコントロールを操作することが可能となります。</p> <p>SampleController.java</p> <pre><code>package application; import java.net.URL; import java.util.ResourceBundle; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.AnchorPane; public class SampleController implements Initializable{ /** パネル:メイン */ @FXML private AnchorPane mainPane; /** ラベル:名前 */ @FXML private Label lbName; /** テキストフィールド:名前 */ @FXML private TextField txName; /** ラベル:種別 */ @FXML private Label lbKind; /** コンボボックス:名前 */ @FXML private ComboBox<String> cbKind; /** ボタン:検索 */ @FXML private Button btSearch; /** テーブルビュー:一覧 */ @FXML private TableView<String> tvCat; /** * @return mainPane */ public AnchorPane getMainPane() { return mainPane; } /** * @param mainPane セットする mainPane */ public void setMainPane(AnchorPane mainPane) { this.mainPane = mainPane; } /** * @return lbName */ public Label getLbName() { return lbName; } /** * @param lbName セットする lbName */ public void setLbName(Label lbName) { this.lbName = lbName; } /** * @return txName */ public TextField getTxName() { return txName; } /** * @param txName セットする txName */ public void setTxName(TextField txName) { this.txName = txName; } /** * @return lbKind */ public Label getLbKind() { return lbKind; } /** * @param lbKind セットする lbKind */ public void setLbKind(Label lbKind) { this.lbKind = lbKind; } /** * @return cbKind */ public ComboBox<String> getCbKind() { return cbKind; } /** * @param cbKind セットする cbKind */ public void setCbKind(ComboBox<String> cbKind) { this.cbKind = cbKind; } /** * @return btSearch */ public Button getBtSearch() { return btSearch; } /** * @param btSearch セットする btSearch */ public void setBtSearch(Button btSearch) { this.btSearch = btSearch; } /** * @return tvCat */ public TableView<String> getTvCat() { return tvCat; } /** * @param tvCat セットする tvCat */ public void setTvCat(TableView<String> tvCat) { this.tvCat = tvCat; } /* * (非 Javadoc) * @see javafx.fxml.Initializable#initialize(java.net.URL, java.util.ResourceBundle) */ @Override public void initialize(URL location, ResourceBundle resources) { // コンボボックスに項目を追加 cbKind.getItems().add("指定なし"); cbKind.getItems().add("キジトラ"); cbKind.getItems().add("長毛種(不明)"); cbKind.getItems().add("ミケ(っぽい)"); cbKind.getItems().add("サビ"); cbKind.getItems().add("その他"); // 初期選択状態を設定 cbKind.getSelectionModel().select(0); } } </code></pre> <p> </p> <h2 id="メインクラスの修正"><a href="#%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BF%AE%E6%AD%A3">メインクラスの修正</a></h2> <p>ちょっと嵌ったんですが<br /> fxml で AnchorPane のサイズをいくら変更しても<br /> いざ起動してみるとその通りのサイズになってくれませんでした。</p> <p>よくよく見なおしてみると、メインクラスにて、<br /> Scene のインスタンスを初期化する際に、幅と高さを指定していたことが原因でした。<br /> (デフォルトでそうなっている)</p> <p>幅と高さの指定を取り除いたら問題なく fxml で指定したサイズで表示されるようになりました。</p> <p>Main.java</p> <pre><code>package application; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { try { AnchorPane root = (AnchorPane) FXMLLoader.load(getClass().getResource("Sample.fxml")); // 幅と高さを指定してインスタンスを生成 //Scene scene = new Scene(root, 400, 400); // 幅と高さを指定せずにインスタンスを生成 Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); primaryStage.setScene(scene); primaryStage.show(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { launch(args); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxCombo002.jpg" alt="コンボボックスに項目が設定された画面" /></p> <p>とりあえずコンボボックスへ項目を設定することができました。</p> <p>次回は、データベースから取得したデータを設定してみたいと思います。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15681 2020-01-14T09:57:33+09:00 2020-01-14T10:00:51+09:00 https://crieit.net/posts/JavaFX-eclipse-JavaFX-Hello-World 【JavaFX】eclipseにJavaFXプラグインをインストールして Hello World してみる <p>どうも Swing が廃止される方向のようなので、<br /> 方向転換して Java FX をやってみたいと思います。</p> <p>まずは開発環境の構築から。</p> <h2 id="e(fx)clipseのインストール"><a href="#e%28fx%29clipse%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">e(fx)clipseのインストール</a></h2> <p>JavaFX 用の eclipse プラグインをインストールします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello000.jpg" alt="新規ソフトウェアのインストール" /></p> <p>上部メニューの「ヘルプ」>「新規ソフトウェアのインストール」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello001.jpg" alt="インストール画面" /></p> <p>インストール画面が表示されるので、「追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello002.jpg" alt="リポジトリ-の追加" /></p> <p>名前、ロケーションにそれぞれ下記を入力します。</p> <pre><code>名前: e(fx)clipse ロケーション: [http://download.eclipse.org/efxclipse/updates-released/2.4.0/site](http://download.eclipse.org/efxclipse/updates-released/2.4.0/site) </code></pre> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello003.jpg" alt="インストールモジュールの選択" /></p> <p>インストール画面にて、追加したロケーションを選択し<br /> e(fx)clipse - IDE を選択して「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello004.jpg" alt="インストール詳細画面" /></p> <p>インストール詳細画面が表示されるので「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello005.jpg" alt="同意画面" /></p> <p>ライセンス画面が表示されるので、<br /> 使用条件の条項に同意して「完了」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello006.jpg" alt="再起動確認画面" /></p> <p>再起動確認画面が表示されます。<br /> ソフトウェア更新のため再起動が必要となりますので、「はい」ボタンをクリックして eclipse を再起動します。</p> <h2 id="Scene Builder のインストール"><a href="#Scene+Builder+%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">Scene Builder のインストール</a></h2> <h3 id="ダウンロード"><a href="#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">ダウンロード</a></h3> <p>次のURLにアクセスします。<br /> <a target="_blank" rel="nofollow noopener" href="http://gluonhq.com/products/scene-builder/#download" target="_blank" rel="noopener noreferrer">http://gluonhq.com/products/scene-builder/#download</a></p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello007.jpg" alt="ダウンロードページ" /></p> <p>今回は、 Windows 64bit のインストーラーをダウンロードします。</p> <h3 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h3> <p>ダウンロードした「SceneBuilder-8.3.0.exe」を実行します。</p> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello008.jpg" alt="セキュリティの警告" /></p> <p>セキュリティの警告が表示される場合は「実行」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello009.jpg" alt="ライセンス同意画面" /></p> <p>ライセンス画面が表示されるので、同意して「Next」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello010.jpg" alt="インストール先指定画面" /></p> <p>インストール先指定画面が表示されるので、<br /> デフォルトのまま「Next」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello011.jpg" alt="Scene Builder" /></p> <p>SceneBuilder の画面が起動しました。</p> <h2 id="JavaFXの設定"><a href="#JavaFX%E3%81%AE%E8%A8%AD%E5%AE%9A">JavaFXの設定</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello012.jpg" alt="設定画面の表示" /></p> <p>上部メニューの「ウィンドウ」>「設定」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello013.jpg" alt="Scene Builder のパスを設定" /></p> <p>サイドメニューの「JavaFX」を選択し、<br /> SceneBuilderの実行ファイルまでのパスを設定、「OK」ボタンをクリックします。</p> <p>デフォルトであれば</p> <blockquote>C:\Users\[ユーザ名]\AppData\Local\SceneBuilder\SceneBuilder.exe</blockquote> <p>となります。</p> <h2 id="JavaFX プロジェクトの作成"><a href="#JavaFX+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">JavaFX プロジェクトの作成</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello014.jpg" alt="" /></p> <p>パッケージ・エクスプローラー上で右クリックし、「新規」>「その他」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello015.jpg" alt="プロジェクト作成" /></p> <p>「JavaFX」>「JavaFX Project」を選択し「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello016.jpg" alt="プロジェクト名の入力" /></p> <p>プロジェクト名を入力し「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello017.jpg" alt="ビルド設定画面" /></p> <p>Java設定画面が表示されるので「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello018.jpg" alt="言語設定" /></p> <p>プロジェクト設定画面が表示されるので、言語に「FXML」を選択し、「完了」ボタンをクリックします。</p> <h3 id="Hello World を表示してみる"><a href="#Hello+World+%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">Hello World を表示してみる</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello019.jpg" alt="Scene Builder で開く" /></p> <p>作成したプロジェクト>「src」>「application」>「Sample.fxml」を右クリックし<br /> 「Open with SceneBuilder」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello020.jpg" alt="Scene Builder 起動" /></p> <p>Sample.fxml ファイルが SceneBuilder で開かれます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello021.jpg" alt="ラベルの配置" /></p> <p>左側メニューの「Control」より、ラベルを選択して画面中央に配置し、<br /> 表示名を「Hello World!」に変更します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello022.jpg" alt="保存" /></p> <p>上部メニューの「File」>「Save」を選択して変更を保存して SceneBuilder を終了します。</p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p>プロジェクトを右クリックし「実行」>「Java アプリケーション」を選択します。</p> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/JavaFxHello024.jpg" alt="起動した画面" /></p> <p>無事に表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ひとまず今回はここまで。</p> <p>次回からまた色々やっていきたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15669 2020-01-09T09:39:32+09:00 2020-01-09T09:39:32+09:00 https://crieit.net/posts/Swing-Oracle-JTable 【Swing】Oracleに接続して取得したデータをJTable に表示してみる <p>前回に引き続き、Swingを弄ってみます。<br /> 今回はWPFの時と同様、猫の一覧を表示しました。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/09/2400/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【Swing】Oracleに接続して取得したデータをコンボボックスに設定する</a></p> <h2 id="画面の変更"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%A4%89%E6%9B%B4">画面の変更</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable000.jpg" alt="JTableの配置" /></p> <p>JScrollPane、JTableを配置します。<br /> こうすることにより、JTableにヘッダー、スクロールバーが表示されるようになります。</p> <h2 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h2> <h3 id="新規クラス(インナー)の追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%AF%E3%83%A9%E3%82%B9%EF%BC%88%E3%82%A4%E3%83%B3%E3%83%8A%E3%83%BC%EF%BC%89%E3%81%AE%E8%BF%BD%E5%8A%A0">新規クラス(インナー)の追加</a></h3> <p>検索ボタン押下時の処理を追加します。<br /> イベントは、「ActionListener」を実装したクラスで行います。</p> <p>MainForm.java</p> <pre><code> /** * 検索ボタンアクションリスナークラス * * @author doraxdora * */ public class SearchActionListener implements ActionListener { /** * イベントハンドラ. * */ @Override public void actionPerformed(ActionEvent event) { if (event.getSource().equals(btnSearch)) { try { // SQL文の組み立て // 画面で指定された条件を組み込む String sql = "SELECT C.NO" + ", C.NAME" + ", C.SEX" + ", C.AGE" + ", K.KIND_NAME" + ", C.FAVORITE" + " FROM TBLCAT C" + " LEFT OUTER JOIN MSTKIND K ON (" + " C.KIND_CD = K.KIND_CD" + " )"; String where = ""; String searchName = txSearchName.getText(); if (searchName != null &amp;&amp; !searchName.equals("")) { where = " WHERE C.NAME LIKE '" + searchName + "%'"; } String searchKind = (String)cbSearchKind.getSelectedItem(); if (searchKind != null &amp;&amp; !searchKind.equals("指定なし")) { if (where != "") { where += " AND"; } else { where += " WHERE"; } where += " K.KIND_NAME = '" + searchKind + "'"; } sql += where; sql += " ORDER BY C.NO"; // データを取得し、JTableにセットする TableModel の形に編集 DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery(sql); List<String[]> list = new ArrayList<String[]>(); while (rs != null &amp;&amp; rs.next()) { String[] items = new String[6]; items[0] = rs.getString("NO"); items[1] = rs.getString("NAME"); items[2] = rs.getString("SEX"); items[3] = rs.getString("AGE"); items[4] = rs.getString("KIND_NAME"); items[5] = rs.getString("FAVORITE"); list.add(items); } // JTable にセット String[] columnHeader = {"No","名前","性別","年齢","種別","好物"}; DefaultTableModel tm = new DefaultTableModel((String[][])list.toArray(new String[0][0]), columnHeader); tblCatData.setModel(tm); } catch (Exception e) { System.out.println(e.getMessage()); } } } } </code></pre> <p> </p> <h3 id="初期化処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期化処理の修正</a></h3> <p>少し整理しました。<br /> あとは検索ボタン押下時の処理に、作成したクラスをセットします。</p> <p>MainForm.java</p> <pre><code> /** * 画面生成処理. * */ public MainForm() { // メインパネル setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 480, 304); mainPanel = new JPanel(); mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(mainPanel); mainPanel.setLayout(new BorderLayout(0, 0)); JPanel panel = new JPanel(); FlowLayout flowLayout = (FlowLayout) panel.getLayout(); flowLayout.setHgap(10); flowLayout.setAlignment(FlowLayout.LEFT); mainPanel.add(panel, BorderLayout.NORTH); // 名前ラベル JLabel label = new JLabel("名前:"); panel.add(label); // 名前テキストボックス txSearchName = new JTextField(); panel.add(txSearchName); txSearchName.setColumns(10); // 種別ラベル JLabel label_1 = new JLabel("種別:"); panel.add(label_1); // 種別コンボボックス cbSearchKind = new JComboBox<String>(); cbSearchKind.setMinimumSize(new Dimension(100, 19)); cbSearchKind.setBounds(195, 7, 119, 19); panel.add(cbSearchKind); // 検索ボタン btnSearch = new JButton("検索"); // 検索ボタン押下時の処理としてインナークラスをセット btnSearch.addActionListener(new SearchActionListener()); panel.add(btnSearch); // スクロールパネル // JTableは基本スクロールパネルとセットで使用する // 縦横のスクロールおよび、ヘッダが表示されるようになります。 scrollPane = new JScrollPane(); mainPanel.add(scrollPane, BorderLayout.CENTER); // 猫一覧テーブル tblCatData = new JTable(); tblCatData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); scrollPane.setViewportView(tblCatData); } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable001.jpg" alt="起動後画面" /></p> <p>起動後の画面です。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable002.jpg" alt="検索結果1" /></p> <p>検索条件を指定しないで検索した結果。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable003.jpg" alt="検索結果2" /></p> <p>名前を指定して検索した結果。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable004.jpg" alt="検索結果3" /></p> <p>種別を指定して検索した結果。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Swingはひとまずここまでにするかもしれません。<br /> 次回は Java FX なんかもやってみようかなーとか思っています。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15668 2020-01-09T09:37:13+09:00 2020-01-09T09:37:13+09:00 https://crieit.net/posts/Swing-Oracle 【Swing】Oracleに接続して取得したデータをコンボボックスに設定する <p>今回は、Oracleからデータを取得してコンボボックスに設定してみたいと思います。</p> <p>プロジェクトは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/08/26/post-2203/" target="_blank" rel="noopener noreferrer">【Swing】eclipse に Swingプラグインをインストールして Hello Wolrd してみる</a></p> <h2 id="新規クラスの追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E8%BF%BD%E5%8A%A0">新規クラスの追加</a></h2> <h3 id="パッケージの作成"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90">パッケージの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo000.jpg" alt="" /><br /> パッケージ・エクスプローラーから「src」を右クリックし、「新規」>「パッケージ」を選択します。</p> <div class="mceTemp"></div> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo001.jpg" alt="パッケージ作成" /></p> <p>パッケージ名を入力し、「完了」ボタンをクリックします。<br /> 今回は「jp.co.doraxdora.common」としました。</p> <h3 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo002.jpg" alt="クラス作成" /></p> <p>パッケージ・エクスプローラーから作成したパッケージを右クリックし、<br /> 「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo003.jpg" alt="クラス作成" /></p> <p>クラス名を入力し、「完了」ボタンをクリックします。<br /> 今回は「DBAccess」としました。</p> <p>DBAccess.java</p> <pre><code> /** * */ package jp.co.doraxdora.common; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import oracle.jdbc.pool.OracleDataSource; /** * @author doraxdora * */ public class DBAccess { private static String DB_URL = "jdbc:oracle:thin:USER01/USER01@localhost:1521:XE"; private static Connection con = null; /** * コンストラクタ. * * @throws Exception */ public DBAccess() throws Exception{ super(); // ドライバのロード OracleDataSource ds = new OracleDataSource(); ds.setURL(DB_URL); // DB接続 con = ds.getConnection(); } /** * SQLを実行して結果を取得します. * @param sql * @return */ public ResultSet executeQuery(String sql) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); return stmt.executeQuery(); } /** * パラメータを指定してSQLを実行し、結果を取得します. * * @param sql * @param param * @return * @throws Exception */ public ResultSet executeQuery(String sql, List<Object> param) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); for (int i = 0; i < param.size(); i++) { if (param.get(i) instanceof String) { stmt.setString(i, (String) param.get(i)); } else if (param.get(i) instanceof Integer) { stmt.setInt(i, (int) param.get(i)); } } return stmt.executeQuery(); } } </code></pre> <p> </p> <h3 id="ライブラリの追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリの追加</a></h3> <p>Oracle からデータを取得するために、ライブラリを追加します。<br /> パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo004.jpg" alt="Javaのビルドパス" /></p> <p>「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、<br /> 「外部 JAR の追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo005.jpg" alt="ファイル選択" /></p> <p>ファイル選択ダイアログが表示されるので、<br /> Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。</p> <p>デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。</p> <p>C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib</p> <p>ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。</p> <p> </p> <h3 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo006.jpg" alt="コンポーネントの配置" /></p> <p>WPFの時と同様に、名前ラベル・テキスト、種別ラベル・コンボボックス、ボタンを配置します。</p> <h3 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h3> <p>初期表示時に、<br /> Oracle からデータを取得してコンボボックスに設定するように修正します。</p> <p>MainForm.java</p> <pre><code> package jp.co.doraxdora.form; import java.awt.EventQueue; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import jp.co.doraxdora.common.DBAccess; public class MainForm extends JFrame { private JPanel contentPane; private JTextField textField; private JComboBox<String> comboBox; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainForm frame = new MainForm(); // コンポーネント初期化 frame.initializeComponent(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MainForm() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 462, 304); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("名前:"); label.setBounds(12, 10, 46, 13); contentPane.add(label); textField = new JTextField(); textField.setBounds(47, 7, 96, 19); contentPane.add(textField); textField.setColumns(10); JLabel label_1 = new JLabel("種別:"); label_1.setBounds(159, 10, 56, 13); contentPane.add(label_1); comboBox = new JComboBox(); comboBox.setBounds(195, 7, 119, 19); contentPane.add(comboBox); JButton btnNewButton = new JButton("検索"); btnNewButton.setBounds(345, 6, 91, 21); contentPane.add(btnNewButton); } /** * コンポーネントの初期化処理. * */ private void initializeComponent() throws Exception { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD"); List<String> list = new ArrayList<String>(); while (rs != null &amp;&amp; rs.next()) { list.add((rs.getString("KIND_NAME"))); } DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>((String[])list.toArray(new String[0])); comboBox.setModel(model); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo007.jpg" alt="画面" /></p> <p>無事にデータを設定することができました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ひとまずデータの取得まではできたので、<br /> 次回はデータテーブルを設置して、検索したデータを表示するところをやろうかと思います。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15562 2019-11-27T09:58:00+09:00 2019-11-27T09:58:00+09:00 https://crieit.net/posts/eclipse4-7-Oxygen-Hello-Wolrd eclipse4.7 Oxygen をインストールして Hello Wolrd してみる <p>Javaの開発に必要なIDE eclipse のインストールから Hello World の出力まで。<br /> (今回は eclipse4.7 Oxygen を対象としていますが、色々と便利なので「Pleiades」を利用します。)</p> <h2 id="Pleiadesとは"><a href="#Pleiades%E3%81%A8%E3%81%AF">Pleiadesとは</a></h2> <blockquote>公式サイトから転載 Pleiades All in One は Windows 向けに統合開発環境 Eclipse 本体と Pleiades プラグインおよびプログラミング言語別に便利なプラグインをまとめたパッケージです。 また、Full Edition の場合は JDK のインストールや環境変数の設定が不要で Eclipse の各種設定も自動で行われるため、ダウンロードした zip ファイルを解凍して eclipse.exe を起動すれば、すぐに日本語化された Eclipse を利用できます。</blockquote> <h2 id="ダウンロード"><a href="#%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">ダウンロード</a></h2> <p>次のサイトからダウンロードします。</p> <p><a target="_blank" rel="nofollow noopener" href="http://mergedoc.osdn.jp/" target="_blank" rel="noopener">Pleiades 公式サイト</a></p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_000.jpg" alt="公式サイト" /></p> <p>Eclipse4.7 Oxygenをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_001.jpg" alt="対象選択" /></p> <p>今回は Windows 64bit Full Edition の Java をダウンロードします。</p> <p>対象のリンク(ボタン)をクリックします。</p> <h2 id="インストール"><a href="#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">インストール</a></h2> <p>ダウンロードした「pleiades-4.7.0-java-win-64bit-jre_20170628.zip」を解凍すると、Pleiades フォルダが展開されるので、任意の場所に置きます。</p> <p>今回は「D:\dev\eclipse」としました。</p> <h2 id="起動"><a href="#%E8%B5%B7%E5%8B%95">起動</a></h2> <p>pleaiades\eclipse にある「eclipse.exe」を実行します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_003.jpg" alt="起動中" /></p> <p>起動中。しばしお待ちを。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_002.jpg" alt="ワークスペースの選択" /></p> <p>ワークスペースの選択画面が表示されるので、<br /> 今回は「D:\workspace\Sample」を入力して「起動」ボタンをクリックします。</p> <p>(フォルダは事前に作成してください)</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_004.jpg" alt="起動後画面" /></p> <p>起動後の画面です。</p> <h2 id="サンプルプロジェクト"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88">サンプルプロジェクト</a></h2> <h3 id="プロジェクトの作成"><a href="#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">プロジェクトの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_005.jpg" alt="プロジェクト新規作成" /></p> <p>上部メニューの「ファイル」>「新規」>「Javaプロジェクト」を選択します。<br /> (パッケージエクスプローラ上で右クリックからでも可能)</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_006.jpg" alt="プロジェクト作成ダイアログ" /></p> <p>プロジェクト名を入力して「次へ」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_007.jpg" alt="プロジェクト作成ダイアログ" /></p> <p>「完了」ボタンをクリックします。</p> <h3 id="パッケージの作成"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90">パッケージの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_008.jpg" alt="パッケージ作成" /></p> <p>パッケージ・エクスプローラーに表示されたプロジェクトのツリーを展開し、<br /> 「src」を右クリック、「新規」>「パッケージ」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_009.jpg" alt="パッケージ名入力画面" /></p> <p>パッケージ名を入力して「完了」ボタンをクリックします。</p> <h3 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_010.jpg" alt="クラス作成" /></p> <p>パッケージ・エクスプローラーで、プロジェクトに追加されたパッケージを右クリック、<br /> 「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_011.jpg" alt="クラス名入力画面" /></p> <p>名前に「HelloWorld」、オプションの「public static void main(String[] args)」にチェックをして「完了」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_012.jpg" alt="プロジェクト作成後の画面" /></p> <p>作成したクラスが表示されます。</p> <h3 id="プログラムを記述"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%A8%98%E8%BF%B0">プログラムを記述</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_013.jpg" alt="プログラムを記述" /></p> <p>メインメソッドに次の1文を追加</p> <pre><code>System.out.println(“Hello Wolrd!!”) </code></pre> <p> </p> <h2 id="プログラムの実行"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%AE%9F%E8%A1%8C">プログラムの実行</a></h2> <p>パッケージ・エクスプローラーで、作成したクラスを選択し、<br /> 上部メニューの「実行」>「実行」>「Java アプリケーション」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/08/eclipse4.7_015.jpg" alt="コンソールに出力される" /></p> <p>コンソールビューに「Hello World!!」が表示されれば完了です。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回はひとまずここまで。<br /> 次回以降は Swing で作るクライアントアプリを試していきたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15500 2019-10-23T09:50:42+09:00 2019-10-23T09:50:42+09:00 https://crieit.net/posts/VB-NET-log4net 【VB.NET】log4netを使ったログ出力を試してみた <p>おはようございます。</p> <p>VB.NETでも log4net を使ってログ出力を試してみました。</p> <p>プログラムは前回のものを使用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2018/01/25/post-3769/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】PostgreSQL に接続してデータ操作(追加・更新・削除)をしてみる</a></p> <p>また、WPF@C#は下記の記事を参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/06/10/post-1210/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】log4netを使ってログを出力する</a></p> <h2 id="Nuget でパッケージをダウンロード"><a href="#Nuget+%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">Nuget でパッケージをダウンロード</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net000.jpg" alt="NuGetパッケージ管理を表示" /></p> <p>ソリューションエクスプローラーからプロジェクトを選択、右クリックし<br /> 「Nuget パッケージの管理」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net001.jpg" alt="NuGetパッケージ管理画面" /></p> <p>Nuget パッケージ管理画面が表示されるので、<br /> 検索窓に「log4net」を入力し、「log4net」を選択、インストールボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net002.jpg" alt="プレビュー画面" /></p> <p>変更の確認ダイアログが表示されるので、「OK」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net003.jpg" alt="出力ビュー" /></p> <p>出力ビューに「終了」が出力されればOKです。</p> <h2 id="アセンブリ設定ファイルの修正"><a href="#%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BF%AE%E6%AD%A3">アセンブリ設定ファイルの修正</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net004.jpg" alt="アセンブリファイルの修正" /></p> <p>パッケージエクスプローラーから対象のファイルを開きます。</p> <p>AccemblyInfo.vb</p> <pre><code> // log4net を利用するための設定 // <Assembly: log4net.Config.XmlConfigurator(ConfigFile:="log4net.config", Watch:=True)> </code></pre> <h2 id="設定ファイルの追加"><a href="#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0">設定ファイルの追加</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net005.jpg" alt="新規ファイル追加" /></p> <p>パッケージエクスプローラーから「追加」>「新しい項目」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net006.jpg" alt="ファイル追加画面" /></p> <p>「アプリケーション構成ファイル」を選択して「追加」ボタンをクリックします。</p> <p>log4net.config</p> <pre><code> <?xml version="1.0" encoding="utf-8" ?> <!-- [log4net.config] --> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <appSettings> <!-- log4net 内部のデバッグメッセージを出力 --> <add key="log4net.Internal.Debug" value="true" /> </appSettings> <log4net> <!-- コンソール出力用のアペンダ --> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <!-- 出力文字列のフォーマット --> <layout type="log4net.Layout.PatternLayout"> <!--^「日付、スレッド、レベル、logger名、メッセージ」が出力^--> <!--^「%-5p」というのは5文字以下の場合、右側に空白を入れる設定^--> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> <!-- ファイル出力用のアペンダ(日付でローテーション) --> <appender name="DailyFileAppender" type="log4net.Appender.RollingFileAppender"> <!-- ログファイルの切替 { サイズ: Size, 日付: Date } --> <param name="RollingStyle" value="Date" /> <!-- ファイル名 --> <param name="File" value="log/" /> <!-- ファイル名に付加する日付パターン --> <param name="DatePattern" value='yyyyMMdd".log"' /> <!-- ファイル名の固定 --> <param name="StaticLogFileName" value="false" /> <!-- ファイル書き込み { 追記: true, 上書き: false } --> <param name="AppendToFile" value="true" /> <!-- 出力文字列のフォーマット --> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5level %date{yyyy/MM/dd HH:mm:ss, fff} [%thread] %logger - %message%newline" /> </layout> </appender> <!-- デフォルトの出力設定 --> <root> <level value="ALL" /> <appender-ref ref="ConsoleAppender" /> <appender-ref ref="DailyFileAppender" /> </root> </log4net> </configuration> </code></pre> <p> </p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbLog4net007.jpg" alt="ビルドオプション" /></p> <p>log4net.configファイルのプロパティで、<br /> 「出力ディレクトリにコピーする」を「常にコピーする」に変更します。</p> <h2 id="検索ボタンクリック時にログを出力"><a href="#%E6%A4%9C%E7%B4%A2%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E6%99%82%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%92%E5%87%BA%E5%8A%9B">検索ボタンクリック時にログを出力</a></h2> <p>次の記述を追加します。</p> <p>Form1.vb</p> <pre><code>Form1.vb ' ライブラリのインポート import log4net; public Class Form1 ' ログ出力用インスタンスの宣言 Private logger As ILog = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType) . . . 省略 ''' <summary> ''' 検索ボタンクリックイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click logger.Info("MainWindows 検索ボタンクリック") search() End Sub </code></pre> <p> </p> <h2 id="ログを出力してみる"><a href="#%E3%83%AD%E3%82%B0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">ログを出力してみる</a></h2> <p>アプリケーションをデバッグ起動し、検索ボタンをクリックします。</p> <p>コンソール出力にログが出力されるのを確認します。<br /> 実行ディレクトリ>log>yyyymmdd.log を確認、ログが出力されていればOKです。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>WPF@C#とほとんど同じ手順で使うことができました。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15493 2019-10-20T10:36:15+09:00 2019-10-20T10:36:15+09:00 https://crieit.net/posts/VB-NET-PostgreSQL 【VB.NET】PostgreSQL に接続してデータ操作(追加・更新・削除)をしてみる <p>おはようございます。</p> <p>今回はPostgreSQLで追加、更新、削除をやってみましたが、<br /> Oracle、MySQLと変わらず、クラスを変更するだけでほぼ対応ができてしまいました。</p> <p>プログラムは前回のものを参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2018/01/24/post-3760/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】PostgreSQL に接続してデータを DataGridView に表示してみる</a></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="追加(行追加)処理"><a href="#%E8%BF%BD%E5%8A%A0%EF%BC%88%E8%A1%8C%E8%BF%BD%E5%8A%A0%EF%BC%89%E5%87%A6%E7%90%86">追加(行追加)処理</a></h3> <p>Form1.vb</p> <pre><code> ''' <summary> ''' 追加ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click ' 追加後に更新されていなければ処理しない If (AddRowFlg) Then Return End If AddRowFlg = True Using conn As New NpgsqlConnection("Server=localhost; Port=5432; User Id=USER01;Password=USER01;Database=DB01") ' データベースオープン conn.Open() ' データ追加 Using con As New DataContext(conn) Dim idx = dgvCat.Rows.Count() ' 行追加 dgvCat.Rows.Add() ' 種別マスタ取得 ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM MSTKIND", conn) Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) Dim kindList As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() kindList.Add(k) Next ' 猫一覧取得 cmd = New NpgsqlCommand("SELECT * FROM TBLCAT", conn) da = New NpgsqlDataAdapter(cmd) dt = New DataTable() da.Fill(dt) Dim newNo = 0 ' 使用できるNoを判定 For i As Integer = 1 To dt.Rows.Count() + 1 Dim selectNo = i If dt.Select("No = '" + selectNo.ToString + "'").Length = 0 Then newNo = selectNo End If Next ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = newNo dgvCat(0, idx) = no dgvCat(0, idx).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() dgvCat(1, idx) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"&#x2642;", "&#x2640;"}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, idx) = sex ' 年齢 Dim age = New DataGridViewTextBoxCell() dgvCat(3, idx) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, idx) = kind ' 好物 Dim favorite = New DataGridViewTextBoxCell() dgvCat(5, idx) = favorite End Using conn.Close() End Using End Sub </code></pre> <h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3> <p>Form1.vb</p> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' データ更新 For i = 0 To dgvCat.Rows.Count - 1 ' テーブルから対象のデータを取得 Dim no As Integer = dgvCat(0, i).Value ' シーケンス列としていないので、 ' 最初に件数を取得して No を計算する Dim cmd As OracleCommand = New OracleCommand("SELECT COUNT(*) FROM TBLCAT WHERE No = '" + no.ToString() + "'", conn) Dim cnt As Decimal = cmd.ExecuteScalar() If (cnt = 0) Then ' データ追加 Dim query = "INSERT INTO TBLCAT VALUES (" + (cnt + 1) + ", '" + dgvCat(1, i).Value + "'" + ", '" + dgvCat(2, i).Value + "'" + ", " + dgvCat(3, i).Value + "'" + ", '" + dgvCat(4, i).Value + "'" + ", '" + dgvCat(5, i).Value + "')" cmd = New OracleCommand(query, conn) cmd.ExecuteNonQuery() Else ' データ変更 Dim query = "UPDATE TBLCAT SET" + " NAME = '" + dgvCat(1, i).Value.ToString() + "'" + ", SEX = '" + dgvCat(2, i).Value.ToString() + "'" + ", AGE = '" + dgvCat(3, i).Value.ToString() + "'" + ", KIND_CD = '" + dgvCat(4, i).Value.ToString() + "'" + ", FAVORITE = '" + dgvCat(5, i).Value.ToString() + "' " + "WHERE NO = '" + dgvCat(0, i).Value.ToString() + "'" cmd = New OracleCommand(query, conn) cmd.ExecuteNonQuery() End If Next conn.Close() End Using AddRowFlg = False ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <p> </p> <h3 id="削除処理"><a href="#%E5%89%8A%E9%99%A4%E5%87%A6%E7%90%86">削除処理</a></h3> <p>Form1.vb</p> <pre><code> ''' <summary> ''' 削除ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' 選択されている行 For Each r As DataGridViewRow In dgvCat.SelectedRows Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index) ' データ削除 Dim query As String = "DELETE FROM TBLCAT WHERE NO = " + Cat.No ' クエリ実行 Dim cmd As OracleCommand = New OracleCommand(query, conn) cmd.ExecuteNonQuery() Next conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを削除しました。") End Sub </code></pre> <p> </p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Oracle、MySQLからPostgreSQLに変更するのも簡単にできそうですね。<br /> 次回以降はまた別の言語をやっていこうかと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15491 2019-10-18T10:31:07+09:00 2019-10-18T10:31:07+09:00 https://crieit.net/posts/VB-NET-PostgreSQL-DataGridView 【VB.NET】PostgreSQL に接続してデータを DataGridView に表示してみる <p>おはようございます。</p> <p>今回はVB.NETでPostgreSQLに接続、データの取得をやってみます。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2018/01/18/3718/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】MySQL(MariaDB)に接続してデータ操作(追加・更新・削除)をしてみる</a></p> <p>また、PostgreSQL環境の作成は以下の記事を参考にしてください<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/07/25/post-1748/" target="_blank" rel="noopener noreferrer" data-blogcard="1">PostgreSQL 9.6.3 インストールからテーブル作成まで</a></p> <h2 id="Nuget でパッケージをダウンロード"><a href="#Nuget+%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">Nuget でパッケージをダウンロード</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL000.jpg" alt="NuGetパッケージ管理の選択" /></p> <p>ソリューションエクスプローラーからプロジェクトを選択、右クリックし<br /> 「Nuget パッケージの管理」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL001.jpg" alt="NuGetパッケージ管理画面" /></p> <p>Nuget パッケージ管理画面が表示されるので、<br /> 検索窓に「npgsql」を入力し、「Npgsql」を選択、インストールボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL002.jpg" alt="プレビュー画面" /></p> <p>プレビュー画面が表示された場合は、「OK」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL003.jpg" alt="ライセンス同意画面" /></p> <p>ライセンス同意画面が表示されるので、「同意する」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL004.jpg" alt="出力ビュー" /></p> <p>出力ビューに「終了」が表示されれば完了です。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="宣言の追加"><a href="#%E5%AE%A3%E8%A8%80%E3%81%AE%E8%BF%BD%E5%8A%A0">宣言の追加</a></h3> <p>ダウンロードしたパッケージを利用するための宣言を追加します。</p> <p>Form1.vb</p> <pre><code>Imports Npgsql </code></pre> <h3 id="初期表示処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E8%A1%A8%E7%A4%BA%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期表示処理の修正</a></h3> <p>MySQLに接続していた部分を PostgreSQLに接続するように修正し、<br /> MySqlCommand、MySqlDataAdapterもそれぞれ PostgreSQL用のクラスに変更します。</p> <p>Form1.vb</p> <pre><code> ''' <summary> ''' フォームロード時の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Using conn As New NpgsqlConnection("Server=localhost; Port=5432; User Id=USER01;Password=USER01;Database=DB01") ' データベースオープン conn.Open() ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM MSTKIND", conn) Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) ' コンボボックスに値を設定 Dim sources As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() k.KindCd = "" k.KindName = "指定なし" sources.Add(k) For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() sources.Add(k) Next Me.cmbKind.DataSource = sources Me.cmbKind.DisplayMember = "KindName" ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h3 id="検索処理の修正"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">検索処理の修正</a></h3> <p>初期表示と同様、接続の処理とMysqlのクラスをPostgreSQL用に変更します。</p> <p>Form1.vb</p> <pre><code> ''' <summary> ''' 検索処理 ''' </summary> Private Sub search() Using conn As New NpgsqlConnection("Server=localhost; Port=5432; User Id=USER01;Password=USER01;Database=DB01") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd ' 種別マスタ取得 ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM MSTKIND", conn) Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) Dim kindList As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() kindList.Add(k) Next ' 猫一覧取得 Dim Sql As String = "SELECT * FROM TBLCAT" Dim where As String = "" If (searchName <> "") Then where = " WHERE NAME LIKE '" + searchName + "%'" End If If (searchKind <> "") Then If (where <> "") Then where += " AND" Else where = " WHERE" End If where += " KIND_CD = '" + searchKind + "'" End If Sql += where cmd = New NpgsqlCommand(Sql, conn) da = New NpgsqlDataAdapter(cmd) dt = New DataTable() da.Fill(dt) ' データグリッドビューに設定 Dim i As Integer = 0 dgvCat.Rows.Clear() For i = 0 To dt.Rows.Count() - 1 ' 行追加 dgvCat.Rows.Add() ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = dt.Rows(i)("No") dgvCat(0, i) = no dgvCat(0, i).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() name.Value = dt.Rows(i)("Name") dgvCat(1, i) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"&#x2642; ", "&#x2640; "}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, i) = sex dgvCat(2, i).Value = dt.Rows(i)("Sex") ' 年齢 Dim age = New DataGridViewTextBoxCell() age.Value = dt.Rows(i)("Age") dgvCat(3, i) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, i) = kind dgvCat(4, i).Value = dt.Rows(i)("Kind_Cd") ' 好物 Dim favorite = New DataGridViewTextBoxCell() favorite.Value = dt.Rows(i)("Favorite") dgvCat(5, i) = favorite Next End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL005.jpg" alt="起動後の画面" /></p> <p>種別にデータが設定されました。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbPostgreSQL006.jpg" alt="検索結果" /></p> <p>検索ボタン押下でデータがグリッドに表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>PostgreSQLもほとんど変更無しで対応することができました。</p> <p>実は EntityFrameworkを利用する予定だったのですが、<br /> 依存ファイルが見つからないエラーで嵌ってしまったので断念。</p> <p>いずれ時間のある時にでも。。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15485 2019-10-16T09:41:26+09:00 2019-10-16T09:41:26+09:00 https://crieit.net/posts/VB-NET-MySQL-MariaDB 【VB.NET】MySQL(MariaDB)に接続してデータ操作(追加・更新・削除)をしてみる <p>前回に引き続き、MySQLの話し。<br /> 今回は追加、更新、削除をやってみましたが、ほとんど Oracle と変わらず。</p> <p>プログラムは前回のものを参考にしてください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2018/01/17/post-3707/" target="_blank" rel="noopener noreferrer">【VB.NET】MySQL(MariaDB)に接続してデータ操作(追加・更新・削除)をしてみる</a></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click 'Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") Using conn As New MySqlConnection("Database=DB01;Data Source=localhost;User Id=USER01;Password=USER01; sqlservermode=True;") ' データベースオープン conn.Open() ' データ更新 For i = 0 To dgvCat.Rows.Count - 1 ' テーブルから対象のデータを取得 Dim no As Integer = dgvCat(0, i).Value ' シーケンス列としていないので、 ' 最初に件数を取得して No を計算する Dim cmd As MySqlCommand = New MySqlCommand("SELECT COUNT(*) FROM TBLCAT WHERE No = '" + no.ToString() + "'", conn) Dim cnt As Decimal = cmd.ExecuteScalar() If (cnt = 0) Then ' データ追加 Dim query = "INSERT INTO TBLCAT VALUES (" + no.ToString() + ", '" + dgvCat(1, i).Value + "'" + ", '" + dgvCat(2, i).Value + "'" + ", '" + dgvCat(3, i).Value + "'" + ", '" + dgvCat(4, i).Value + "'" + ", '" + dgvCat(5, i).Value + "')" cmd = New MySqlCommand(query, conn) cmd.ExecuteNonQuery() Else ' データ変更 Dim query = "UPDATE TBLCAT SET" + " NAME = '" + dgvCat(1, i).Value.ToString() + "'" + ", SEX = '" + dgvCat(2, i).Value.ToString() + "'" + ", AGE = '" + dgvCat(3, i).Value.ToString() + "'" + ", KIND_CD = '" + dgvCat(4, i).Value.ToString() + "'" + ", FAVORITE = '" + dgvCat(5, i).Value.ToString() + "' " + "WHERE NO = '" + dgvCat(0, i).Value.ToString() + "'" cmd = New MySqlCommand(query, conn) cmd.ExecuteNonQuery() End If Next conn.Close() End Using AddRowFlg = False ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <h3 id="削除処理"><a href="#%E5%89%8A%E9%99%A4%E5%87%A6%E7%90%86">削除処理</a></h3> <pre><code> ''' <summary> ''' 削除ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click 'Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") Using conn As New MySqlConnection("Database=DB01;Data Source=localhost;User Id=USER01;Password=USER01; sqlservermode=True;") ' データベースオープン conn.Open() ' 選択されている行 For Each r As DataGridViewRow In dgvCat.SelectedRows Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index) ' データ削除 Dim query As String = "DELETE FROM TBLCAT WHERE NO = " + Cat.No ' クエリ実行 Dim cmd As MySqlCommand = New MySqlCommand(query, conn) cmd.ExecuteNonQuery() Next conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを削除しました。") End Sub </code></pre> <p> </p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>起動後の画面は割愛。</p> <p>OracleからMySQLに変更するのは簡単にできそうですね。<br /> 次回は PostgreSQL を試してみたいと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15471 2019-10-10T11:45:58+09:00 2019-10-10T11:45:58+09:00 https://crieit.net/posts/VB-NET-MySQL-MariaDB-DataGridView 【VB.NET】MySQL(MariaDB)に接続してデータを DataGridView に表示してみる <p>今回はVB.NETでMySQLに接続、データの取得をやってみます。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/30/3581/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】Oracleに接続してデータを操作(追加・更新・削除)してみる</a></p> <p>また、C#@WPFでのMySQL接続は下記を参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/07/24/post-1729/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】MySQL(MariaDB)に接続してデータを DataGrid に表示してみる</a></p> <h2 id="Nuget でパッケージをダウンロード"><a href="#Nuget+%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89">Nuget でパッケージをダウンロード</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_000.jpg" alt="NuGetパッケージの管理" /></p> <p>ソリューションエクスプローラーからプロジェクトを選択、右クリックし<br /> 「Nuget パッケージの管理」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_001.jpg" alt="NuGetパッケージの管理画面" /></p> <p>Nuget パッケージ管理画面が表示されるので、<br /> 検索窓に「mysql」を入力し、「MySql.Data」を選択、インストールボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_002.jpg" alt="プレビュー画面" /></p> <p>プレビュー画面が表示された場合は、「OK」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_003.jpg" alt="ライセンス同意画面" /></p> <p>ライセンス同意画面が表示されるので、「同意する」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_004.jpg" alt="出力ビュー" /></p> <p>出力ビューに「終了」が表示されれば完了です。</p> <h2 id="画面(デザイナーソース)"><a href="#%E7%94%BB%E9%9D%A2%EF%BC%88%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%82%BD%E3%83%BC%E3%82%B9%EF%BC%89">画面(デザイナーソース)</a></h2> <pre><code><Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class Form1 Inherits System.Windows.Forms.Form 'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。 <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then components.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub 'Windows フォーム デザイナーで必要です。 Private components As System.ComponentModel.IContainer 'メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。 'Windows フォーム デザイナーを使用して変更できます。 'コード エディターを使って変更しないでください。 <System.Diagnostics.DebuggerStepThrough()> _ Private Sub InitializeComponent() Me.dgvCat = New System.Windows.Forms.DataGridView() Me.ColNo = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.ColName = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.ColSex = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.ColAge = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.ColKind = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.ColRemark = New System.Windows.Forms.DataGridViewTextBoxColumn() Me.lbName = New System.Windows.Forms.Label() Me.lbKind = New System.Windows.Forms.Label() Me.btnSearch = New System.Windows.Forms.Button() Me.txtName = New System.Windows.Forms.TextBox() Me.cmbKind = New System.Windows.Forms.ComboBox() Me.btnAdd = New System.Windows.Forms.Button() Me.btnUpdate = New System.Windows.Forms.Button() Me.btnDelete = New System.Windows.Forms.Button() CType(Me.dgvCat, System.ComponentModel.ISupportInitialize).BeginInit() Me.SuspendLayout() ' 'dgvCat ' Me.dgvCat.AllowUserToAddRows = False Me.dgvCat.AllowUserToDeleteRows = False Me.dgvCat.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize Me.dgvCat.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.ColNo, Me.ColName, Me.ColSex, Me.ColAge, Me.ColKind, Me.ColRemark}) Me.dgvCat.Location = New System.Drawing.Point(12, 56) Me.dgvCat.Name = "dgvCat" Me.dgvCat.RowTemplate.Height = 21 Me.dgvCat.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect Me.dgvCat.Size = New System.Drawing.Size(488, 256) Me.dgvCat.TabIndex = 0 ' 'ColNo ' Me.ColNo.DataPropertyName = "no" Me.ColNo.HeaderText = "No" Me.ColNo.Name = "ColNo" Me.ColNo.Width = 30 ' 'ColName ' Me.ColName.DataPropertyName = "name" Me.ColName.HeaderText = "名前" Me.ColName.Name = "ColName" ' 'ColSex ' Me.ColSex.DataPropertyName = "sex" Me.ColSex.HeaderText = "性別" Me.ColSex.Name = "ColSex" Me.ColSex.Width = 35 ' 'ColAge ' Me.ColAge.DataPropertyName = "age" Me.ColAge.HeaderText = "年齢" Me.ColAge.Name = "ColAge" Me.ColAge.Width = 35 ' 'ColKind ' Me.ColKind.DataPropertyName = "kindCd" Me.ColKind.HeaderText = "種別" Me.ColKind.Name = "ColKind" Me.ColKind.Width = 120 ' 'ColRemark ' Me.ColRemark.DataPropertyName = "favorite" Me.ColRemark.HeaderText = "好物" Me.ColRemark.Name = "ColRemark" Me.ColRemark.Width = 120 ' 'lbName ' Me.lbName.AutoSize = True Me.lbName.Location = New System.Drawing.Point(12, 23) Me.lbName.Name = "lbName" Me.lbName.Size = New System.Drawing.Size(35, 12) Me.lbName.TabIndex = 1 Me.lbName.Text = "名前:" ' 'lbKind ' Me.lbKind.AutoSize = True Me.lbKind.Location = New System.Drawing.Point(192, 23) Me.lbKind.Name = "lbKind" Me.lbKind.Size = New System.Drawing.Size(35, 12) Me.lbKind.TabIndex = 2 Me.lbKind.Text = "種別:" ' 'btnSearch ' Me.btnSearch.Location = New System.Drawing.Point(425, 18) Me.btnSearch.Name = "btnSearch" Me.btnSearch.Size = New System.Drawing.Size(75, 23) Me.btnSearch.TabIndex = 3 Me.btnSearch.Text = "検索" Me.btnSearch.UseVisualStyleBackColor = True ' 'txtName ' Me.txtName.Location = New System.Drawing.Point(53, 19) Me.txtName.Name = "txtName" Me.txtName.Size = New System.Drawing.Size(100, 19) Me.txtName.TabIndex = 4 ' 'cmbKind ' Me.cmbKind.FormattingEnabled = True Me.cmbKind.Location = New System.Drawing.Point(233, 19) Me.cmbKind.Name = "cmbKind" Me.cmbKind.Size = New System.Drawing.Size(121, 20) Me.cmbKind.TabIndex = 5 ' 'btnAdd ' Me.btnAdd.Location = New System.Drawing.Point(14, 318) Me.btnAdd.Name = "btnAdd" Me.btnAdd.Size = New System.Drawing.Size(75, 23) Me.btnAdd.TabIndex = 6 Me.btnAdd.Text = "追加" Me.btnAdd.UseVisualStyleBackColor = True ' 'btnUpdate ' Me.btnUpdate.Location = New System.Drawing.Point(95, 318) Me.btnUpdate.Name = "btnUpdate" Me.btnUpdate.Size = New System.Drawing.Size(75, 23) Me.btnUpdate.TabIndex = 6 Me.btnUpdate.Text = "更新" Me.btnUpdate.UseVisualStyleBackColor = True ' 'btnDelete ' Me.btnDelete.Location = New System.Drawing.Point(176, 318) Me.btnDelete.Name = "btnDelete" Me.btnDelete.Size = New System.Drawing.Size(75, 23) Me.btnDelete.TabIndex = 6 Me.btnDelete.Text = "削除" Me.btnDelete.UseVisualStyleBackColor = True ' 'Form1 ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(514, 353) Me.Controls.Add(Me.btnDelete) Me.Controls.Add(Me.btnUpdate) Me.Controls.Add(Me.btnAdd) Me.Controls.Add(Me.cmbKind) Me.Controls.Add(Me.txtName) Me.Controls.Add(Me.btnSearch) Me.Controls.Add(Me.lbKind) Me.Controls.Add(Me.lbName) Me.Controls.Add(Me.dgvCat) Me.Name = "Form1" Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "一覧" CType(Me.dgvCat, System.ComponentModel.ISupportInitialize).EndInit() Me.ResumeLayout(False) Me.PerformLayout() End Sub Friend WithEvents dgvCat As DataGridView Friend WithEvents lbName As Label Friend WithEvents lbKind As Label Friend WithEvents btnSearch As Button Friend WithEvents txtName As TextBox Friend WithEvents cmbKind As ComboBox Friend WithEvents ColNo As DataGridViewTextBoxColumn Friend WithEvents ColName As DataGridViewTextBoxColumn Friend WithEvents ColSex As DataGridViewTextBoxColumn Friend WithEvents ColAge As DataGridViewTextBoxColumn Friend WithEvents ColKind As DataGridViewTextBoxColumn Friend WithEvents ColRemark As DataGridViewTextBoxColumn Friend WithEvents btnAdd As Button Friend WithEvents btnUpdate As Button Friend WithEvents btnDelete As Button End Class </code></pre> <p> </p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="宣言の追加"><a href="#%E5%AE%A3%E8%A8%80%E3%81%AE%E8%BF%BD%E5%8A%A0">宣言の追加</a></h3> <p>ダウンロードしたパッケージを利用するための宣言を追加します。</p> <p>Form1.vb</p> <pre><code>Imports MySql.Data.MySqlClient </code></pre> <p> </p> <h3 id="初期表示処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E8%A1%A8%E7%A4%BA%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期表示処理の修正</a></h3> <p>Oracleに接続していた部分を MySQLに接続するように修正し、<br /> OracleCommand、OracleDataAdapterもそれぞれ MySQL用のクラスに変更します。</p> <p>Form1.vb</p> <pre><code> ''' <summary> ''' フォームロード時の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 'Using conn As New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") Using conn As New MySqlConnection("Database=DB01;Data Source=localhost;User Id=USER01;Password=USER01; sqlservermode=True;") ' データベースオープン conn.Open() ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 'Dim cmd As OracleCommand = New OracleCommand("SELECT * FROM MSTKIND", conn) 'Dim da As OracleDataAdapter = New OracleDataAdapter(cmd) Dim cmd As MySqlCommand = New MySqlCommand("SELECT * FROM MSTKIND", conn) Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) ' コンボボックスに値を設定 Dim sources As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() k.KindCd = "" k.KindName = "指定なし" sources.Add(k) For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() sources.Add(k) Next Me.cmbKind.DataSource = sources Me.cmbKind.DisplayMember = "KindName" ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h3 id="検索処理の修正"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">検索処理の修正</a></h3> <p>初期表示と同様、接続の処理とOracleのクラスをMysql用に変更します。</p> <p>Form1.vb</p> <pre><code> ''' <summary> ''' 検索処理 ''' </summary> Private Sub search() 'Using conn As New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") Using conn As New MySqlConnection("Database=DB01;Data Source=localhost;User Id=USER01;Password=USER01; sqlservermode=True;") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd ' 種別マスタ取得 ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As MySqlCommand = New MySqlCommand("SELECT * FROM MSTKIND", conn) Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) Dim kindList As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() kindList.Add(k) Next ' 猫一覧取得 Dim Sql As String = "SELECT * FROM TBLCAT" Dim where As String = "" If (searchName <> "") Then where = " WHERE NAME LIKE '" + searchName + "%'" End If If (searchKind <> "") Then If (where <> "") Then where += " AND" Else where = " WHERE" End If where += " KIND_CD = '" + searchKind + "'" End If Sql += where cmd = New MySqlCommand(Sql, conn) da = New MySqlDataAdapter(cmd) dt = New DataTable() da.Fill(dt) ' データグリッドビューに設定 Dim i As Integer = 0 dgvCat.Rows.Clear() For i = 0 To dt.Rows.Count() - 1 ' 行追加 dgvCat.Rows.Add() ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = dt.Rows(i)("No") dgvCat(0, i) = no dgvCat(0, i).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() name.Value = dt.Rows(i)("Name") dgvCat(1, i) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"&#x2642;", "&#x2640;"}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, i) = sex dgvCat(2, i).Value = dt.Rows(i)("Sex") ' 年齢 Dim age = New DataGridViewTextBoxCell() age.Value = dt.Rows(i)("Age") dgvCat(3, i) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, i) = kind dgvCat(4, i).Value = dt.Rows(i)("Kind_Cd") ' 好物 Dim favorite = New DataGridViewTextBoxCell() favorite.Value = dt.Rows(i)("Favorite") dgvCat(5, i) = favorite Next End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_005.jpg" alt="起動後の画面" /></p> <p>種別にデータが設定されました。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2018/01/VbMySQL1_006.jpg" alt="検索結果" /></p> <p>検索ボタン押下でデータがグリッドに表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>MySQLもOracle社のものになったからか、<br /> ほとんど変更無しで対応することができました。めでたし。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15464 2019-10-08T09:41:26+09:00 2019-10-08T09:41:26+09:00 https://crieit.net/posts/VB-NET-Oracle-5d9bdb36dc86b 【VB.NET】Oracleに接続してデータを操作(追加・更新・削除)してみる <p>引き続きVB.NET。</p> <p>プログラムは前回のものを参考にしてください。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/29/post-3579/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】Oracleに接続してデータを検索してみる</a></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' データ更新 For i = 0 To dgvCat.Rows.Count - 1 ' テーブルから対象のデータを取得 Dim no As Integer = dgvCat(0, i).Value ' シーケンス列としていないので、 ' 最初に件数を取得して No を計算する Dim cmd As OracleCommand = New OracleCommand("SELECT COUNT(*) FROM TBLCAT WHERE No = " + no, conn) Dim cnt As Decimal = cmd.ExecuteScalar() If (cnt = 0) Then ' データ追加 Dim query = "INSERT INTO TBLCAT VALUES (" + (cnt + 1) + ", '" + dgvCat(1, i).Value + "'" + ", '" + dgvCat(2, i).Value + "'" + ", " + dgvCat(3, i).Value + "'" + ", '" + dgvCat(4, i).Value + "'" + ", '" + dgvCat(5, i).Value + "')" cmd = New OracleCommand(query, conn) cmd.ExecuteNonQuery() Else ' データ変更 Dim query = "UPDATE TBLCAT SET" + " NAME = '" + dgvCat(1, i).Value + "'" + ", SEX = '" + dgvCat(2, i).Value + "'" + ", AGE = " + dgvCat(3, i).Value + ", KIND_CD = '" + dgvCat(4, i).Value + "'" + ", FAVORITE = '" + dgvCat(5, i).Value + "' " + "WHERE NO = " + dgvCat(0, i).Value cmd = New OracleCommand(query, conn) cmd.ExecuteNonQuery() End If Next conn.Close() End Using AddRowFlg = False ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <h3 id="削除処理"><a href="#%E5%89%8A%E9%99%A4%E5%87%A6%E7%90%86">削除処理</a></h3> <pre><code> ''' <summary> ''' 削除ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click Using conn = New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' 選択されている行 For Each r As DataGridViewRow In dgvCat.SelectedRows Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index) ' データ削除 Dim query As String = "DELETE FROM TBLCAT WHERE NO = " + Cat.No ' クエリ実行 Dim cmd As OracleCommand = New OracleCommand(query, conn) cmd.ExecuteNonQuery() Next conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを削除しました。") End Sub </code></pre> <p> </p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>起動後の画面は、SQLiteの時と変わらないので割愛しました。</p> <p>次回以降は、一応他のDBもやっていこうかと思います。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15458 2019-10-07T09:43:37+09:00 2019-10-07T09:43:37+09:00 https://crieit.net/posts/VB-NET-Oracle 【VB.NET】Oracleに接続してデータを検索してみる <p>またVB.NETですが。<br /> WPFでもやりましたが Oracle に接続してとりあえずのことをやってみます。</p> <p>プログラムは前回のもの、データベースの作成なんかはWPFを参考にしてください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/02/post-2322/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【WPF】Oracleを使ってデータを DataGrid に表示する</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/28/post-3569/" data-blogcard="1">【VB.NET】データグリッドビューの行を動的に追加する</a></p> <h2 id="参照の追加"><a href="#%E5%8F%82%E7%85%A7%E3%81%AE%E8%BF%BD%E5%8A%A0">参照の追加</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000001-1.jpg" alt="参照の追加" /></p> <p>ソリューション・エクスプローラーの「参照」を右クリックして「参照の追加」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000002-1.jpg" alt="dll の追加" /></p> <p>参照の追加画面が表示されるので、「参照」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000003-1.jpg" alt="dll の追加" /></p> <p>Oracle.DataAcess.dllを選択し、「追加」ボタンをクリックして完了です。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="宣言の追加"><a href="#%E5%AE%A3%E8%A8%80%E3%81%AE%E8%BF%BD%E5%8A%A0">宣言の追加</a></h3> <p>下記の記述を追加します。</p> <pre><code>Imports System.Data Imports System.Data.OracleClient </code></pre> <h3 id="起動時の処理"><a href="#%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E5%87%A6%E7%90%86">起動時の処理</a></h3> <pre><code> ''' <summary> ''' フォームロード時の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Using conn As New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As OracleCommand = New OracleCommand("SELECT * FROM MSTKIND", conn) Dim da As OracleDataAdapter = New OracleDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) ' コンボボックスに値を設定 Dim sources As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() k.KindCd = "" k.KindName = "指定なし" sources.Add(k) For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() sources.Add(k) Next Me.cmbKind.DataSource = sources Me.cmbKind.DisplayMember = "KindName" ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h3 id="検索処理"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86">検索処理</a></h3> <pre><code> ''' <summary> ''' 検索処理 ''' </summary> Private Sub search() Using conn As New OracleConnection("Data Source=localhost;User Id=USER01;Password=USER01;") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd ' 種別マスタ取得 ' 種別コンボボックスの内容をデータベースから取得して設定 ' データを取得 Dim cmd As OracleCommand = New OracleCommand("SELECT * FROM MSTKIND", conn) Dim da As OracleDataAdapter = New OracleDataAdapter(cmd) Dim dt As DataTable = New DataTable() da.Fill(dt) Dim kindList As List(Of Kind) = New List(Of Kind) Dim k As Kind = New Kind() For Each row As DataRow In dt.Rows k = New Kind() k.KindCd = row("KIND_CD").ToString() k.KindName = row("KIND_NAME").ToString() kindList.Add(k) Next ' 猫一覧取得 Dim Sql As String = "SELECT * FROM TBLCAT" Dim where As String = "" If (searchName <> "") Then where = " WHERE NAME LIKE '" + searchName + "%'" End If If (searchKind <> "") Then If (where <> "") Then where += " AND" Else where = " WHERE" End If where += " KIND_CD = '" + searchKind + "'" End If Sql += where cmd = New OracleCommand(Sql, conn) da = New OracleDataAdapter(cmd) dt = New DataTable() da.Fill(dt) ' データグリッドビューに設定 Dim i As Integer = 0 dgvCat.Rows.Clear() For i = 0 To dt.Rows.Count() - 1 ' 行追加 dgvCat.Rows.Add() ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = dt.Rows(i)("No") dgvCat(0, i) = no dgvCat(0, i).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() name.Value = dt.Rows(i)("Name") dgvCat(1, i) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"♂", "♀"}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, i) = sex dgvCat(2, i).Value = dt.Rows(i)("Sex") ' 年齢 Dim age = New DataGridViewTextBoxCell() age.Value = dt.Rows(i)("Age") dgvCat(3, i) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, i) = kind dgvCat(4, i).Value = dt.Rows(i)("Kind_Cd") ' 好物 Dim favorite = New DataGridViewTextBoxCell() favorite.Value = dt.Rows(i)("Favorite") dgvCat(5, i) = favorite Next End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ちょっと画面は取り忘れましたが、これでOracleからデータ取得、表示ができます。</p> <p>次回もOracleの予定です。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15448 2019-10-03T09:28:32+09:00 2019-10-03T09:28:32+09:00 https://crieit.net/posts/VB-NET-DataGridView-5d9540b08ea4f 【VB.NET】DataGridView の行を動的に追加してみる <p>引き続き、DataGridView関連の話し。<br /> 今回は行を動的に追加する方法を試してみてました。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/27/post-3564/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】DataGridView を直接変更してデータを更新してみる</a></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="追加処理"><a href="#%E8%BF%BD%E5%8A%A0%E5%87%A6%E7%90%86">追加処理</a></h3> <p>追加ボタンが押されたタイミングで、データグリッドビューの空行を作成して追加します。</p> <p>今回は、1行追加したら「更新」するまで追加できないようにしました。<br /> (グローバルでフラグを持たせています)</p> <pre><code> ''' <summary> ''' 追加ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click ' 追加後に更新されていなければ処理しない If (AddRowFlg) Then Return End If AddRowFlg = True Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ追加 Using con As New DataContext(conn) Dim idx = dgvCat.Rows.Count() ' 行追加 dgvCat.Rows.Add() ' 種別マスタ取得 Dim kinds As Table(Of Kind) = con.GetTable(Of Kind) Dim kindResult As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x Dim kindList = kindResult.ToList() ' 猫一覧取得 Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat) Dim newNo = 0 ' 使用できるNoを判定 For i As Integer = 1 To tblCat.ToList().Count() + 1 Dim selectNo = i If tblCat.SingleOrDefault(Function(x As Cat) x.No = selectNo) Is Nothing Then newNo = selectNo End If Next ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = newNo dgvCat(0, idx) = no dgvCat(0, idx).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() dgvCat(1, idx) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"&#x2642;", "&#x2640;"}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, idx) = sex ' 年齢 Dim age = New DataGridViewTextBoxCell() dgvCat(3, idx) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, idx) = kind ' 好物 Dim favorite = New DataGridViewTextBoxCell() dgvCat(5, idx) = favorite End Using conn.Close() End Using End Sub </code></pre> <h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3> <p>更新処理では、データグリッドビューから直接値を取得して、データベースに存在しなければ追加、存在すれば更新というようにしました。</p> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ更新 Using con As New DataContext(conn) ' 対象のテーブルオブジェクトを取得 Dim Table = con.GetTable(Of Cat) ' 選択されているデータを取得 For i = 0 To dgvCat.Rows.Count - 1 ' テーブルから対象のデータを取得 Dim no As Integer = dgvCat(0, i).Value Dim target As Cat = Table.SingleOrDefault(Function(x As Cat) x.No = no) If (target Is Nothing) Then ' データ作成 Dim Cat As New Cat() Cat.No = dgvCat(0, i).Value Cat.Name = dgvCat(1, i).Value Cat.Sex = dgvCat(2, i).Value Cat.Age = dgvCat(3, i).Value Cat.KindCd = dgvCat(4, i).Value Cat.Favorite = dgvCat(5, i).Value Table.InsertOnSubmit(Cat) Else ' データ変更 target.Name = dgvCat(1, i).Value target.Sex = dgvCat(2, i).Value target.Age = dgvCat(3, i).Value target.KindCd = dgvCat(4, i).Value target.Favorite = dgvCat(5, i).Value End If ' DBの変更を確定 con.SubmitChanges() Next End Using conn.Close() End Using AddRowFlg = False ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_000.jpg" alt="検索後" /></p> <p>とりあえず検索します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_001.jpg" alt="追加ボタンクリック" /></p> <p>追加ボタンをクリックすると空行が追加されます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_002.jpg" alt="データを入力" /></p> <p>追加された行に値を設定します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_003.jpg" alt="更新ボタンをクリック" /></p> <p>更新ボタンをクリック、再検索後の画面が表示されます。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>年の瀬となり忙しくなってまいりましたが<br /> なんとか更新していきたいと思います。</p> <p>次回はどうしようかな。。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15446 2019-10-02T09:28:19+09:00 2019-10-02T09:28:19+09:00 https://crieit.net/posts/VB-NET-DataGridView 【VB.NET】DataGridView を直接変更してデータを更新してみる <p>今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。</p> <p>プログラムは例によって前回のものを。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/24/post-3541/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】SQLiteに接続してデータを登録してみる</a></p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="検索処理"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86">検索処理</a></h3> <p>取得したデータを走査して1行ずつ作成していくように変更します。</p> <pre><code> ''' <summary> ''' 検索処理 ''' </summary> Private Sub search() Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd ' 種別マスタ取得 Dim kinds As Table(Of Kind) = con.GetTable(Of Kind) Dim kindResult As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x Dim kindList = kindResult.ToList() ' 猫一覧取得 Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat) Dim result As IQueryable(Of Cat) If (searchKind = "") Then ' 種別が選択されていなければ名前のみ前方一致指定 result = From x In tblCat Where x.Name.StartsWith(searchName) Order By x.No Select x Else ' 種別が選択されていれば名前+種別で検索 result = From x In tblCat Where x.Name.StartsWith(searchName) &amp; x.KindCd = searchKind Order By x.No Select x End If ' データグリッドビューに設定 'dgvCat.DataSource = result.ToList() Dim list As List(Of Cat) = result.ToList() Dim i As Integer = 0 dgvCat.Rows.Clear() For i = 0 To list.Count() - 1 Dim cat = list(i) ' 行追加 dgvCat.Rows.Add() ' No(プライマリなので編集不可) Dim no = New DataGridViewTextBoxCell() no.Value = cat.No dgvCat(0, i) = no dgvCat(0, i).ReadOnly = True ' 名前 Dim name = New DataGridViewTextBoxCell() name.Value = cat.Name dgvCat(1, i) = name ' 性別 Dim sex = New DataGridViewComboBoxCell() sex.Items.AddRange({"♂", "♀"}) sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(2, i) = sex dgvCat(2, i).Value = cat.Sex ' 年齢 Dim age = New DataGridViewTextBoxCell() age.Value = cat.Age dgvCat(3, i) = age ' 種別 Dim kind = New DataGridViewComboBoxCell() kind.DataSource = kindList kind.DisplayMember = "KindName" kind.ValueMember = "KindCd" kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox dgvCat(4, i) = kind dgvCat(4, i).Value = cat.KindCd ' 好物 Dim favorite = New DataGridViewTextBoxCell() favorite.Value = cat.Favorite dgvCat(5, i) = favorite Next End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <p> </p> <h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3> <p>データグリッドビューに表示されているデータを全て更新するように変更します。</p> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ更新 Using con As New DataContext(conn) ' 対象のテーブルオブジェクトを取得 Dim Table = con.GetTable(Of Cat) ' 選択されているデータを取得 For i = 0 To dgvCat.Rows.Count - 1 ' テーブルから対象のデータを取得 Dim no As Integer = dgvCat(0, i).Value Dim target As Cat = Table.Single(Function(x As Cat) x.No = no) ' データ変更 target.Name = dgvCat(1, i).Value target.Sex = dgvCat(2, i).Value target.Age = dgvCat(3, i).Value target.KindCd = dgvCat(4, i).Value target.Favorite = dgvCat(5, i).Value ' DBの変更を確定 con.SubmitChanges() Next End Using conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <h3 id="コンボボックスの制御"><a href="#%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E5%88%B6%E5%BE%A1">コンボボックスの制御</a></h3> <p>以前の記事でもやりましたが、<br /> コンボボックスがワンクリックで開くように仕込みを入れます。</p> <pre><code> ''' <summary> ''' データグリッドビューセルクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub dgvCat_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCat.CellClick Dim dgv As DataGridView = CType(sender, DataGridView) gridComboHandle(dgv, e) End Sub ''' <summary> ''' データグリッドビューのコンボボックス制御 ''' </summary> ''' <param name="dgv"></param> ''' <param name="e"></param> Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs) ' 対象の列だった場合 If dgv.Columns(e.ColumnIndex).Name = "ColSex" Or dgv.Columns(e.ColumnIndex).Name = "ColKind" Then SendKeys.SendWait("{F4}") End If End Sub </code></pre> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_000.jpg" alt="データ検索後" /></p> <p>データ検索後の画面。<br /> 無事にデータが表示され、データグリッドビューにコンボボックスも表示されています。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_001.jpg" alt="データ変更" /></p> <p>1行目の種別を変更して、「更新」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_002.jpg" alt="データ変更後" /></p> <p>無事に変更できました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>やり方としてはいまいちで、WPFみたいにMVVMとかバインディングとかできるかと思いますが、これはこれでもしかしたら需要があるかもしれません。</p> <p>次回は追加処理をしてみます。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15439 2019-09-30T09:58:53+09:00 2019-09-30T09:58:53+09:00 https://crieit.net/posts/VB-NET-SQLite-5d91534d804b7 【VB.NET】SQLiteに接続してデータを登録してみる <p>VBでSQLite、データ検索までしたので続いて登録、更新、削除をしてみました。<br /> C#からの移植ではありますが、微妙に違うところもありますね。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/22/post-3533/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】SQLiteからデータを取得して表示する</a></p> <h2 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite3_000-1.jpg" alt="ボタンの追加" /></p> <p>画面に追加、更新、削除ボタンを追加し、それぞれにクリックイベントを設定します。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="検索処理の修正"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">検索処理の修正</a></h3> <p>追加更新削除後に再検索するため、別メソッドに切り出します。</p> <pre><code> ''' <summary> ''' 検索ボタンクリックイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click search() End Sub ''' <summary> ''' 検索処理 ''' </summary> Private Sub search() Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat) Dim result As IQueryable(Of Cat) If (searchKind = "") Then ' 種別が選択されていなければ名前のみ前方一致指定 result = From x In tblCat Where x.Name.StartsWith(searchName) Order By x.No Select x Else ' 種別が選択されていれば名前+種別で検索 result = From x In tblCat Where x.Name.StartsWith(searchName) &amp; x.KindCd = searchKind Order By x.No Select x End If ' データグリッドビューに設定 dgvCat.DataSource = result.ToList() End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h3 id="データ追加"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E8%BF%BD%E5%8A%A0">データ追加</a></h3> <pre><code> ''' <summary> ''' 追加ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ追加 Using con As New DataContext(conn) ' 対象のテーブルオブジェクトを取得 Dim Table = con.GetTable(Of Cat) ' データ作成 Dim Cat As New Cat() Cat.No = 5 Cat.Name = "こなつ" Cat.Sex = "&#x2640;" Cat.Age = 7 Cat.KindCd = "01" Cat.Favorite = "布団" ' データ追加 Table.InsertOnSubmit(Cat) ' DBの変更を確定 con.SubmitChanges() End Using conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを追加しました。") End Sub </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite3_003.jpg" alt="データ追加" /></p> <p>追加ボタンをクリックすると、固定ではありますがデータが追加されます。</p> <h3 id="データ更新"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B4%E6%96%B0">データ更新</a></h3> <pre><code> ''' <summary> ''' 更新ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ更新 Using con As New DataContext(conn) ' 対象のテーブルオブジェクトを取得 Dim Table = con.GetTable(Of Cat) ' 選択されているデータを取得 For Each r As DataGridViewRow In dgvCat.SelectedRows Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index) ' テーブルから対象のデータを取得 Dim target As Cat = Table.Single(Function(x As Cat) x.No = Cat.No) ' データ変更 target.Favorite = "高いところ" ' DBの変更を確定 con.SubmitChanges() Next End Using conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを更新しました。") End Sub </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite3_004.jpg" alt="データ修正" /></p> <p>更新ボタンをクリックすると、選択された行の好物が更新されます。</p> <h3 id="データ削除"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E5%89%8A%E9%99%A4">データ削除</a></h3> <pre><code> ''' <summary> ''' 削除ボタンクリックイベント ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' データ削除 Using con As New DataContext(conn) ' 対象のテーブルオブジェクトを取得 Dim Table = con.GetTable(Of Cat) ' 選択されているデータを取得 For Each r As DataGridViewRow In dgvCat.SelectedRows Dim Cat As Cat = CType(dgvCat.DataSource(), List(Of Cat)).Item(r.Index) ' テーブルから対象のデータを取得 Dim target As Cat = Table.Single(Function(x As Cat) x.No = Cat.No) ' データ削除 Table.DeleteOnSubmit(target) ' DBの変更を確定 con.SubmitChanges() Next End Using conn.Close() End Using ' データ再検索 search() MessageBox.Show("データを削除しました。") End Sub </code></pre> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite3_005.jpg" alt="データ削除" /></p> <p>削除ボタンをクリックすると、選択されている行のデータが削除されます。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>とりあえず簡単ではありますが追加、更新、削除ができました。</p> <p>次回はデータグリッドを直接編集してデータの更新等が行えるようにしたいと思います。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15429 2019-09-27T13:09:52+09:00 2019-09-27T13:09:52+09:00 https://crieit.net/posts/VB-NET-SQLite-5d8d8b90b1414 【VB.NET】SQLiteに接続してデータを取得してみる <p>今回はデータベースから取得したデータを表示したいと思います。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/21/post-3519/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】SQLiteのデータベース及びテーブルを動的に作成してみる</a></p> <h2 id="データの追加"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%BF%BD%E5%8A%A0">データの追加</a></h2> <p>前回作成したテーブルにデータをツール、もしくはコマンドラインから追加します。</p> <pre><code> INSERT INTO MSTKIND VALUES ("01", "キジトラ"); INSERT INTO MSTKIND VALUES ("02", "長毛種(不明)"); INSERT INTO MSTKIND VALUES ("03", "ミケ(っぽい)"); INSERT INTO MSTKIND VALUES ("04", "サビ"); INSERT INTO MSTKIND VALUES ("09", "その他"); INSERT INTO TBLCAT VALUES('1','そら','♂','6','01','犬の人形'); INSERT INTO TBLCAT VALUES('2','りく','♂','5','02','人間'); INSERT INTO TBLCAT VALUES('3','うみ','♀','4','03','高級ウェットフード'); INSERT INTO TBLCAT VALUES('4','こうめ','♀','2','04','横取りフード'); </code></pre> <p>追加したデータを確認します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite2_001.jpg" alt="A5m2SQLで確認" /></p> <h2 id="Linq で データを取得、設定する"><a href="#Linq+%E3%81%A7+%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%80%81%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">Linq で データを取得、設定する</a></h2> <h3 id="参照の追加"><a href="#%E5%8F%82%E7%85%A7%E3%81%AE%E8%BF%BD%E5%8A%A0">参照の追加</a></h3> <p>ソリューション・エクスプローラーからプロジェクトの「参照」を右クリックし、「参照の追加」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite2_000-1.jpg" alt="参照の追加" /></p> <p>「System.Data.Linq」で検索、チェックしてOKボタンをクリックします。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="インポート宣言の追加"><a href="#%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E5%AE%A3%E8%A8%80%E3%81%AE%E8%BF%BD%E5%8A%A0">インポート宣言の追加</a></h3> <p>次の記述を先頭に追加します。</p> <pre><code> Imports System.Data.Linq </code></pre> <h3 id="フォームロード時にコンボボックスにデータを設定する"><a href="#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%AD%E3%83%BC%E3%83%89%E6%99%82%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AB%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">フォームロード時にコンボボックスにデータを設定する</a></h3> <p>次の記述をフォームロード時のイベントメソッドに追加します。</p> <pre><code> ' 種別コンボボックスの内容をデータベースから取得して設定 Using con As New DataContext(conn) Dim kinds As Table(Of Kind) = con.GetTable(Of Kind) Dim result As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x Dim empty As New Kind() empty.KindCd = "" empty.KindName = "指定なし" Dim list = result.ToList() list.Insert(0, empty) ' コンボボックスに設定 cmbKind.DataSource = list cmbKind.DisplayMember = "kindName" End Using </code></pre> <h3 id="検索ボタンのクリックイベント追加"><a href="#%E6%A4%9C%E7%B4%A2%E3%83%9C%E3%82%BF%E3%83%B3%E3%81%AE%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%BF%BD%E5%8A%A0">検索ボタンのクリックイベント追加</a></h3> <p>デザイナー画面にて配置した「検索」ボタンをダブルクリックします。</p> <p>検索処理の実装</p> <p>自動生成されたメソッドに次の処理を記述します。</p> <pre><code> ''' <summary> ''' 検索ボタンクリックイベント. ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' 検索条件を指定してデータを取得 Using con As New DataContext(conn) Dim searchName As String = txtName.Text Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat) Dim result As IQueryable(Of Cat) If (searchKind = "") Then ' 種別が選択されていなければ名前のみ前方一致指定 result = From x In tblCat Where x.Name.StartsWith(searchName) Order By x.No Select x Else ' 種別が選択されていれば名前+種別で検索 result = From x In tblCat Where x.Name.StartsWith(searchName) &amp; x.KindCd = searchKind Order By x.No Select x End If ' データグリッドビューに設定 dgvCat.DataSource = result.ToList() End Using ' データベースクローズ conn.Close() End Using End Sub </code></pre> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite009-1.jpg" alt="起動後の画面" /></p> <p>起動後の画面。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite010.jpg" alt="コンボボックスにデータ設定" /></p> <p>コンボボックスに無事にデータが設定されました。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite2_003.jpg" alt="検索した結果" /></p> <p>検索ボタンをクリックして、データグリッドビューにも無事にデータが表示されました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>C#とほぼ同じなので難しくはないですね。</p> <p>次回はデータの追加・更新・削除なんかもやってみます。</p> <p>ではでは。</p> <p> </p> doraxdora tag:crieit.net,2005:PublicArticle/15423 2019-09-25T09:35:38+09:00 2019-09-25T09:35:38+09:00 https://crieit.net/posts/VB-NET-SQLite 【VB.NET】SQLiteのデータベース及びテーブルを動的に作成してみる <p>今回はSQLiteを使ったプログラムを作っていきます。</p> <p>プログラムは前回のものを流用しませんが、WPFのものを移植する感じになります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/06/09/post-1184/" target="_blank" rel="noopener noreferrer">【WPF】SQLiteを使ってデータを DataGrid に表示してみる</a></p> <h2 id="SQLiteのパッケージをインストール"><a href="#SQLite%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB">SQLiteのパッケージをインストール</a></h2> <p>SQLite を利用するためのパッケージをインストールします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite000.jpg" alt="NuGetパッケージ管理" /></p> <p>ソリューションエクスプローラーからプロジェクトを選択、右クリックし「Nuget パッケージの管理」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite001.jpg" alt="パッケージの追加" /></p> <p>Nuget パッケージ管理画面が表示されるので、検索窓に「SQLite」を入力し「System.Data.SQLite」を選択、インストールボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite002.jpg" alt="確認ダイアログ" /></p> <p>変更の確認ダイアログが表示されるので、「OK」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite003.jpg" alt="出力ビュー" /></p> <p>出力ビューに「終了」が出力されればOKです。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite004.jpg" alt="ソリューションエクスプローラー" /></p> <p>ソリューションエクスプローラーの「参照」を開くと「System.Data.*」が追加されていることが確認できます。</p> <h2 id="ビルドを実行する"><a href="#%E3%83%93%E3%83%AB%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">ビルドを実行する</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite005.jpg" alt="リビルドの実行" /></p> <p>上部メニューの「ビルド」>「ソリューションのリビルド」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite006.jpg" alt="ファイルが出力される" /></p> <p>プロジェクトのディレクトリ>bin>Target>x86 、x64 に「SQLite.Interop.dll」が出力されていることが確認できます。</p> <h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2> <h3 id="ロードイベントの追加"><a href="#%E3%83%AD%E3%83%BC%E3%83%89%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">ロードイベントの追加</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite007.jpg" alt="フォームのプロパティ" /></p> <p>デザイナー画面を開き、フォームを選択した状態でプロパティウィンドウの「Load」欄をダブルクリックします。</p> <p>次のようにプログラムが自動生成されます。</p> <p>Form1.vb</p> <pre><code> Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub End Class </code></pre> <h3 id="フォームロード時にテーブルを作成する"><a href="#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%83%AD%E3%83%BC%E3%83%89%E6%99%82%E3%81%AB%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">フォームロード時にテーブルを作成する</a></h3> <p>フォームロード(アプリケーション起動時)に、テーブルを作成するようにプログラムを修正、<br /> 先程追加したイベントに次の処理を記述します。</p> <p>Form1.vb</p> <pre><code> Imports System.Data.SQLite Public Class Form1 ''' <summary> ''' フォームロード時の処理 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite") ' データベースオープン conn.Open() ' テーブルが存在しなければ作成 Using command = conn.CreateCommand() Dim sb As New System.Text.StringBuilder() sb.Append("CREATE TABLE IF NOT EXISTS MSTKIND (") sb.Append(" KIND_CD NCHAR NOT NULL") sb.Append(" , KIND_NAME NVARCHAR") sb.Append(" , primary key (KIND_CD)") sb.Append(")") command.CommandText = sb.ToString() command.ExecuteNonQuery() sb.Clear() sb.Append("CREATE TABLE IF NOT EXISTS TBLCAT (") sb.Append(" NO INT NOT NULL") sb.Append(" , NAME NVARCHAR NOT NULL") sb.Append(" , SEX NVARCHAR NOT NULL") sb.Append(" , AGE INT DEFAULT 0 NOT NULL") sb.Append(" , KIND_CD NCHAR DEFAULT 0 NOT NULL") sb.Append(" , FAVORITE NVARCHAR") sb.Append(" , primary key (NO)") sb.Append(")") command.CommandText = sb.ToString() command.ExecuteNonQuery() End Using ' データベースクローズ conn.Close() End Using End Sub End Class </code></pre> <h2 id="アプリケーションの実行"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E5%AE%9F%E8%A1%8C">アプリケーションの実行</a></h2> <p>上部メニューの開始ボタンをクリックし、アプリケーションを実行すると「MSTKIND」、「TBLCAT」テーブルが作成されます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite008.jpg" alt="A5m2で確認" /></p> <p>A5m2などを使って確認をしてください。</p> <p>以上でひとまず完了です。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>少し長くなったのでここまにして続きは次回にします。</p> <p>次回はコンボボックス、データグリッドにデータベースから取得したデータを表示したいと思います。</p> <p>ではでは。</p> doraxdora