データベースの最近のブログ記事

VisualBasic から ADO.NET を使用して SQL Server に接続・使用する簡単な例。

SQL Server のインストールや、DB作成、TABLE作成は済んでいること。

(1) データソースの選択と、DB接続設定を行う

    • [表示]→[サーバーエクスプローラー] でサーバーエクスプローラーを表示する。
    • サーバーエクスプローラー上にある DB アイコン(データベースへの接続)をクリック。
    • 「データソースの選択」ダイヤログが開くので、データソースで「Microsoft SQL Server」を選択。データプロバイダーは「.NET Framework SQL Server用データプロバイダー」を選択する。[続行]ボタン押下。
    • 「接続の追加」画面が開くので、「サーバー名」を設定。サーバ名がわからなければ SQL Server Management Studio 等で調べる。うちの場合は「XVIDEOS\SQLEXPRESS」。XVIDEOS は PC名。(一覧から選択するのかと思ったが、フルに手入力しないといけなかった)
    • 「サーバにログオンする」の「認証」を「SQL Server 認証」に変更する。ユーザ名とパスワードが入力可能になるので入力。(あらかじめ SQL Server Management Studio で作成したもの)
    • 「データベースへの接続」の「データベース名の選択または入力」を選択。DB名を入力する。
    • 画面下の「テスト接続」ボタンを押してみて正常に接続されれば「OK」ボタン押下。(うまくいかなければ、DB名やユーザアカウント、パスワードが間違っていないか?)

(2) データソースの登録

    • [表示]→[その他のウィンドウ]→[データソース]でデータソースウィンドウを表示。
    • データソースウィンドウの上の一番左の DB アイコン(データソースの追加)をクリック。
    • 「データソースの種類の選択」画面で「データベース」を選択し「次へ」ボタン押下。
    • 「データベースモデルの選択」画面で「データセット」を選択して「次へ」ボタン押下。
    • 「データ接続の選択」では、対象の「データ接続」を選択し、「はい。重要情報を接続文字列に含めます」を選択し「次へ」ボタン押下。
    • 「接続文字列をアプリケーション構成ファイルに保存する」画面では、そのまま「次へ」ボタン押下。
    • 「データベースオブジェクトの選択」画面では、プログラムから参照する TABLE などをすべて選択する。「完了」ボタン押下。

(3) プログラム開発

サンプル用に、超簡単なプログラムを作る。
ID と NAME という項目を持つ m_user という TABLE を参照し、NAME を画面に出すというプログラム。
例えば、ID='admin' の NAMEは'偉い人'である。

20200701_VB1.jpg

開発する画面は「IDを入力し『参考』ボタン(・・・参照と打ったつもりなのに(^^;)を押すと、下に『名前は○○です』」と表示する」という単純なもの。

「参考」ボタンの Click イベントのソースを下記のとおり書いた。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim sql As String

        'SQLステートメント
        sql = "SELECT name FROM m_user WHERE id='" & TextBox1.Text & "'"

        Label1.Text = ""

        'コネクション指定
        Using connection As New SqlClient.SqlConnection(My.Settings.nandfConnectionString)

            'データコマンドを定義する
            Using command As New SqlClient.SqlCommand(sql, connection)

                'コネクションを開く
                connection.Open()

                'データリーダの生成
                Dim dr As SqlClient.SqlDataReader = command.ExecuteReader()

                'データが存在する場合、label1にセット
                '検索結果は1件だけ
                Do While dr.Read
                    Label1.Text = "名前は " & dr("name") & " です"
                Loop

                'データリーダを閉じる
                dr.Close()

                'コネクションを閉じる
                connection.Close()

            End Using

        End Using

    End Sub

いやあ、ADO.NET はデータソースの選択までのアレコレが煩わしいね。まあ、おかげでソースを書くのは楽なんだけど(笑)

それより、うーむ・・・まだ 5年前にやった VB.NET 案件で DB 利用をどのようにコーディングしたか思い出せない。なんとなく、インタフェースは ADO.NET だったような気がするが・・・
SQL Server に接続して DB を新しく作ったり色々と操作をお個合うためのツールが「SQL Server Management Studio」(SSMS)である。
今回、v18.5.1 をインストールした。

んが、起動してみると英語表記である。日本語になっていない。まあ、DB に関することだから英語でも使えなくはないが、やはり設定画面等は日本語の方が使い易い。英語苦手なもんで(^^;;;

 20200701_SQLManagement1.jpg

というわけで、[Tools]→[Options]→[Environment]→[International Setting] と設定画面を進み、 Language を「Same as Microsoft Windows」にしてみた。
多分、「Windows と同じ言語」ってことだろうなあと。
「Changes to the language setting will not take effect until the environment is restarted.」と言われたので、念の為 Windows の再起動までしてみたのに・・・

英語のままやんけ(^^;;;

調べてみると、なんか、SSMS は簡体中国語、繁体中国語、英語 (米国)、フランス語、ドイツ語、イタリア語、日本語、韓国語、ポルトガル語 (ブラジル)、ロシア語、スペイン語それぞれのインストーラーがあるようだ・・・


というページの、最初に出てきた「SQL Server Management Studio (SSMS) のダウンロード」というリンクからダウンロードをすると、SSMS-Setup-ENU.exe という英語版のインストーラーになっていた・・・。ページのもっと下の「日本語」というリンクをクリックすれば、SSMS-Setup-JPN.exe という日本語版がダウンロードされるようである・・・

一旦、英語版をアンインストールし、日本語版をインストール。これで無事、日本語版の SSMS が使えるようになった。

 20200701_SQLManagement2.jpg

ただ、英語版だと接続時にサーバ名が自動でセットされていたが、日本語版は自分で参照しないといけなかった。
しかし、次の接続からはちゃんと前回選択した DB がディフォルトでセットされるので問題なしである。
さっき、「Oracle で DATE 項目に YYYY-MM-DD hh:mm:ss 形式で日時をセット」って話書いたけど、なんなん、Oracle、SELECT のときも、

SELECT houmon_ymdhms FROM user_list WHERE id='000011';

みたいに検索すると、結果として返ってくるのは

2019-06-11

までなんやね。

時分秒まで表示しようとすると、いちいち、

SELECT TO_CHAR(houmon_ymdhms, 'yyyy-mm-dd hh24:mi:ss')  FROM user_list WHERE id='000011';

とかせんと、

2019-06-11 12:23:34

っていう結果は返ってこん、というか、表示されんのやね。

まあ、コンソールで SQL 実行したときの話で、プログラム内ではちゃんと時分秒まで渡されてるけど。表示のときは、NLS_DATABASE_PARAMETERS.NLS_DATE_FORMAT が設定されてるとかで。

ほんま、面倒くさいんや!Oracle め!!
あんまり Oracle って触ったことがなかったので今の今まで気づかなかったんだけど、DATE 項目に例えば '2019-06-11 12:23:34' みたいな時間を登録しようとすると、

UPDATE user_list SET houmon_ymdhms=''2019-06-11 12:23:34' WHERE id='000011';

じゃ、「ORA-01830 : 日付書式の変換で不要なデータが含まれています」なんてエラーになっちゃうのね。

UPDATE user_list SET houmon_ymdhms=TO_DATE('2019-06-11 12:23:34', 'yyyy-mm-dd hh24:mi:ss') WHERE id='000011';

と、TO_DATE 関数で変換しないと駄目。
PostgreSQL なら普通に、

UPDATE user_list SET houmon_ymdhms=''2019-06-11 12:23:34' WHERE id='000011';

これで日時として登録されるけどなあ。

Oracle、ただただ面倒くさい。なんか肌が合わんわ(笑)
そろそろ「本当に Oracle じゃないと駄目?」ってことを、関係者の皆さんにも考えてみていただきたい。

最近は富士通さんなんかも業務システム開発の場面で Oracle ではなく PostgreSQL を担いで来られることも増えて、3〜4年くらい前までなら信じられない話だなあって思ってたんだけど、最近よく話題になる Oracle の馬鹿高いライセンス料の件も絡んで、確実に不沈空母 Oracle もところどころ浸水が始まってるな(笑)

いいぞ、いいぞ(笑)
テスト用データを Oracle DB にセットアップする必要があったんで、本番DBのバックアップファイルから impdb コマンドでインポートをしようかと。
全部のテーブルではなく、必要なのは3つだけなので、以下のようなコマンドを実行。

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=(ロケーション,IPアドレスリスト,ユーザーマスタ)

そしたら、こんなエラーが出て失敗しちゃう。

ORA-39002: 操作が無効です
ORA-39166: オブジェクトHOGE.IPアドレスリストが見つかりません。

これ、エラーになるタイミングは毎回バラバラで、

ORA-39002: 操作が無効です
ORA-39166: オブジェクトHOGE.IPアドレスリストが見つかりません。
ORA-39166: オブジェクトHOGE.ユーザーマスタが見つかりません。

こういうときもある。
別にテーブル名が問題なわけではなく、

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=(IPアドレスリスト)

こんな感じで、エラーになったテーブル単体でインポートすると、

. . "HOGE"."IPアドレスリスト"    12.3MB   12034行がインポートされました

こんな具合に成功する。カンマ区切りで複数テーブルを指定したときだけ問題。
でも、英語名のテーブルではエラーにならないんで、やっぱ日本語名なのが問題なんだろうなあと思って、

impdb HOGE/HOGEPW@HOGEDB directory=backup_dir dumpfile=backup.dmp table_exists_action=replace tables=("ロケーション","IPアドレスリスト","ユーザーマスタ")

こんな風に、テーブル名をダブルクォーテーションで括ってみた。

. . "HOGE"."ロケーション"    28.5MB   9800行がインポートされました
. . "HOGE"."IPアドレスリスト"    12.3MB   12034行がインポートされました
. . "HOGE"."ユーザーマスタ"      1.3MB   109行がインポートされました

ああ、やっぱり成功。

俺はそもそもテーブル名や項目名などに日本語を使うのが嫌い(プログラムでも、(日本語対応されているかどうかは関係なく)日本語の変数名を使うのとか大嫌い(読みづらいは!!)なんだけど、まあ、それはおいといて、日本語使えるんなら、英語名と同じ動きをしっかりしてほしいわ!!

Oracle は金に汚いだけの会社じゃのお。
Microsoft の Access で、Oracle に ODBC 接続(リンクテーブル)して表に展開。レコードの編集をしているときによく遭遇するエラー。

「バリアント型ではない変数に Null値を代入しようとしました。」

Not Null の項目に半角スペースを入れようとすると発生する。何個半角スペースを入れてもだ。
「半角スペースは Null じゃねえ!!」という正論を口にしたところで、Access なんぞをフロントエンドにしている時点で俺の負けである。

唯一の対応法を実践することになるのだが、毎回「どうすんだっけ?」と思っちゃうので、今回ばかりはここにメモしておく(笑)

つっても、色々なところで同じ質問がされているので、その URL を貼っておこうと思ったんだが、なんか、参考ページが Forbidden なエラーで見えなくなってる(^^;

なので、過去コピった内容から以下に抜粋。

    1. あらかじめクリップボードに半角スペースを1文字入れておく。(エディタに半角スペースを入力してコピーとか)
    2. 入力したいセルの左端にカーソルを持っていき、カーソルが+(白い大きな+ね)になる状態でセルをクリック。セルを選択状態にする。(入力待ち状態にしないように。やってみればわかる)
    3. Ctrl + v で貼り付け。 

これで、半角スペースが入力できる。

なんなんかね?
でも、それが Microsoft Access というものだ(笑)
Oracle のインポート走らせて、しっこに行って席に戻ったらコンソールがエラーの山。

imp user/pass@hogedb file=D:¥temp¥hoogedb.dmp log=D:¥temp¥hogedb.log ignore=y commit=y table(tbl1,tbl2,tbl3)

みたいにインポートしようとしたんだけど「一意制約エラー」が山程出てきてる(^^;

ちゃんと最初に

TRUNCATE TABLE tbl1;
TRUNCATE TABLE tbl2;
TRUNCATE TABLE tbl3;

せんと、やっぱ駄目じゃーん!ってなったってだけの話なんだけど、いや、俺、Oracle ってアプリ側から読み書きしたことくらいしかなくて、コンソールから sqlplus 立ち上げてあれこれしたのも初めてってくらいで(^^; だから最初に「インポートの前にテーブル空にしとかないと駄目ですよね?」って確認したのに、「いや、丸っと書き換わるんじゃない?」とか言われて。

単に、教えてくれた人も「Oracle よく知らなくて」ってオチでした(^^;;;
Visual Basic 2013 から SQL Server を扱うプログラムのお勉強をしようと思ってたのに、結局、Visual Studio と SQL Server のセットアップで時間を取られ、やっと今日、プログラムにとりかかることが出来たよ。

サーバ CHIBIKURO2-PC\SQLEXPRESS
DB testdb
ID dbtest
PW testpasswd

という環境で、meigen テーブルの中身を読んでグリッド・コントロールにはめ込むだけの処理。

テーブルの中身はこんな感じで。

20140628_VB2.jpg

Visual Basic のソースコードは、とりあえず試しに動かしたかったので、例外処理もまったく書いてないけど(^^;、こんな感じ。

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim strConnectSQL As String
        Dim strSQL As String
        Dim SQLDA As SqlClient.SqlDataAdapter
        Dim SQLDS As New DataSet()

        strConnectSQL = _
          "Server=CHIBIKURO2-PC\SQLEXPRESS;" & _
          "Initial Catalog=testdb;" & _
          "User ID=dbtest;" & _
          "Password=testpasswd;"

        'SQL文
        strSQL = "SELECT * FROM meigen ORDER BY sn"

        SQLDA = New SqlClient.SqlDataAdapter(strSQL, strConnectSQL)

        'データセットに格納
        SQLDA.Fill(SQLDS, "TEST")

        Me.DataGridView1.DataSource = SQLDS.Tables("TEST")

    End Sub

End Class

これで、

20140628_VB0.jpg

この画面の「データ取得」ボタン(Button1)をクリックすれば、

20140628_VB1.jpg

こんな風に testdb DB の meigen テーブルの中身がグリッド・コントロール(DataGridView1)に表示されると。

さて、これでテスト環境もしっかり出来たので、あれこれお勉強しましょう。
Visual Express Studio の SQL Server オブジェクト エクスプローラーで CHIBIKURO2-PC\SQLEXPRESS サーバに新規接続しようとしたら、エラーコード「18456」で「ユーザー 'dbtest' はログインできませんでした。」と接続を拒否された。

dbtest というのは新規に追加したユーザね。

これだけではなぜ拒否されたかわからないので、エラーログファイル
C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\Log\ERRORLOG
を確認すると、

2014-06-28 12:49:04.05 Logon       エラー: 18456、重大度: 14、状態: 58。
2014-06-28 12:49:04.05 Logon       Login failed for user 'dbtest'.理由: SQL 認証を使用したログインに失敗しました。サーバーは、Windows 認証専用に構成されています。 [クライアント: <local machine>]

というエラーが。
「サーバーは、Windows 認証専用に構成されています。」か(^^;

どうも最初にサーバを構成した時、俺は認証モードを「SQL Server 認証モードと Windows 認証モード」にしていたつもりだったが、「Windows 認証モード」になっていたようだな。

ということで、認証モードを変更する。

1.SQL Server Management Studio で、CHIBIKURO2-PC\SQLEXPRESS サーバの上で右メニューを開く。

2.一番下の「プロパティ」を選択。

3.サーバ認証を「SQL Server 認証モードと Windows 認証モード」に変更。

20140628_sql_setting1.jpg

4.「OK」を押したら「構成の変更の一部は、SQL Server を再起動するまで有効になりません。」と出てくるので更に「OK」を。

5.CHIBIKURO2-PC\SQLEXPRESS サーバの上で右メニューを開き、「再起動」を選択。

6.「CHIBIKURO2-PC の MSSQL$SQLEXPRESS サービスを再起動しますか?」と聞かれるので「はい」を押してサーバ再起動。

これで、ユーザでのログインが可能になる。

さて、プログラム書くか。
うーむ・・・(^^;
マジで、「なんだかなあ」な展開やなあ。

会社の Windows 7 Professional(64bit)で「SQL Server Data Tools の更新」に失敗したけど、翌日やり直したら上手くいった・・・という話を書いたが、「SQL Server オブジェクト エクスプローラー」の起動でも同じようなことがおきた。

Visual Studio Express 2013 の画面に、「表示」→「SQL Server オブジェクト エクスプローラー」で DB 管理用にオブジェクトエクスプローラーを表示しようと思ったんだけど・・・

20140626_vs_db_manege.jpg

なんか、エラー出ちゃったよ・・・(^^;

「'SqlStudio Profile Package'パッケージは正しく読み込まれませんでした。」・・・だって。

原因もすぐにはわからないのでオブジェクトエクスプローラーの表示は中断し、そのまま放ってたら、Visual Studio Express まで原因不明のエラーで落ちてしまった(^^;

なんなん、これ!??(^^;

結局この日は別の作業が忙しく、原因究明等は出来ず。

で、今日、Visual Studio Express を立ち上げ、原因調べようかなっと思って「SQL Server オブジェクト エクスプローラー」を開くと・・・

エラー起きんやん(^^;
DB にもちゃんと接続できたやん(^^;

なんなんもう(^^;

もしかして、あなたはエラーメッセージでググってここにたどりついた人?
もしそうなら、技術的にまったく参考にならんエントリーですまん、すまん(^^;

つまり、まあ、Windows で困ったことがおきたら、とりあえず再起動しろ・・・ってことだな(^^;

このアーカイブについて

このページには、過去に書かれたブログ記事のうちデータベースカテゴリに属しているものが含まれています。

前のカテゴリはWindowsです。

次のカテゴリはパソコンです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら