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

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 で困ったことがおきたら、とりあえず再起動しろ・・・ってことだな(^^;
SQL Server もたまにしか使わないので、すっかり忘れてて二度手間になってもうた。

とあるサーバで動いている SQL Server の DB データを丸ごとバックアップして、他のサーバで動いている SQL Server に上書きでリストアする・・・という作業。

バックアップの種類で「完全」を選び、バックアップする DB を指定し、バックアップセットの名前とか有効期限とか設定して、バックアップ!

で、このバックアップセットを別のサーバに持って行ってリストアすると・・・

サーバ'hoge'の復元に失敗しました。(Microsoft.SqlServer.Express.Smo)
追加情報:
System.Data.SqlClient.SqlError: メディアセットには 2 メディアファミリが含まれていますが、1 だけが指定されています。すべてのメンバを指定してください。(Microsoft.SqlServer.Express.Smo)

20140325_sqlserver.JPG
ってエラー。

はいはい。
丸ごと完全バックアップのつもりだったのに、差分バックアップになってました(^^;

この時点で、古い SQL Server マシンは撤去してたのに、組み立てて再度電源オン(^^;
今度は、バックアップ時にオプションでしっかり「既存のメディアセットにバックアップする」の「既存のすべてのバックアップセットを上書きする」を指定して、無事リストア出来たのでした。

ついつい忘れちゃうので、ここにメモっとこ(^^;

あのエントリーに書いたように、他の Windows 7 Professional 機(DELL と IBM の OS プリインストール機)からは接続できているので、例えば富士通独自の設定とかプリインストールソフトとかが邪魔してるんじゃね?という可能性もあり、もう、パソコンを売った業者がどうにかする問題だと思うんだけど、何かその業者が逆ギレして大変という話だったので(^^;、「ほんじゃもう XP Mode の上で動かしたら?」・・・と提案した。

で、試しに、うちの事務所の XP Mode 環境にインストールしてみたら、エラーが出るんで焦っちゃった(^^;

SQL State: '08001'
SQL Server エラー: 53
[Microsoft][SQL Native Client]名前付きパイプのプロバイダ : SQL Server への接続を開けませんでした [53].
接続できませんでした。:

だって。

まあ、これは何となくポートが開いてないだけの問題のような気がしたので、Windows ファイアウォールを無効にしたら問題解決。
でも、まるっきり無効にしてしまうのもアレなので、SQL Server 関係のポートだけ開けておいた。

やり方は、

Windows ファイアウォール(firewall.cpl)を実行して、[詳細設定]タブで「ネットワーク接続設定」の「設定」ボタンを押して、「追加」を。
下記の2つのポートを例外で登録する。

<サービス設定1>
サービスの説明:SQL Server
IP アドレス:SQL Server の IP アドレス
外部ポート番号:1433
内部ポート番号:1433
プロトコル:TCP

<サービス設定2>
サービスの説明:SQL Server Browser Service
IP アドレス:SQL Server の IP アドレス
外部ポート番号:1434
内部ポート番号:1434
プロトコル:UDP

これだけ。

これで、XP Mode からも問題なく SQL Server へ接続できた。
XP Mode のサポートも 4月で終わるけど、ある特定の1つのアプリを動かすだけなので、これで良いんじゃないかと思うけどね。
ややこしい設定変更で Windows 7 Professional で動くようにしても、あの業者ではメンテできんだろうし。

<追記>
すみません。このエントリーに書いていることは間違っています
実際の設定方法は別の「XP Mode で SQL Server に接続する時の F/W の設定」というエントリーに書いています。
色々反省の意味も込めて、このエントリーも残していますので、ググってたどり着いた人はご注意あれ(笑)
SQL Server 2008 R2 がちゃんとインストールされたのかどうか調べるために、sqlcmd で SQL Server に接続し、新規データベースと、その中に新規テーブルを作成してみた。

コマンド(Transact-SQL)は、色々ググってみて適当に(^^;
(だって、SQL Server さわるの初めてなんだもの。おかしなところがあったらコメントで指摘よろしく!:-))

つーことで、コマンドプロンプトから、

C:\Users\shinoda>sqlcmd -E -S user-pc\nandf
1> USE master
2> GO
データベース コンテキストが 'master' に変更されました。
1> CREATE DATABASE test_db
2> ON PRIMARY ( NAME = test_db_dat,
3> FILENAME='C:\usr\local\data\test_db.mdf',
4> SIZE = 10MB)
5> LOG ON ( NAME = test_db_log,
6> FILENAME='C:\usr\local\data\test_db.ldf',
7> SIZE = 10MB)
8> GO
1> CREATE LOGIN testlogin
2> WITH PASSWORD = 'testpassword',
3> DEFAULT_DATABASE=test_db,
4> DEFAULT_LANGUAGE=JAPANESE
5> GO
1> USE test_db
2> GO
データベース コンテキストが 'test_db' に変更されました。
1> CREATE USER testuser
2> FOR LOGIN testlogin
3> WITH DEFAULT_SCHEMA=dbo
4> GO
1> sp_addrolemember 'db_owner','testuser'
2> GO
1> USE test_db
2> GO
データベース コンテキストが 'test_db' に変更されました。
1> CREATE TABLE test (
2> NO    int NOT NULL PRIMARY KEY,
3> NAME  varchar(60),
4> ADDR  varchar(60),
5> TEL   varchar(30),
6> CDATE datetime NOT NULL DEFAULT (getdate())
7> )
8> GO
1> SELECT * FROM test
2> GO
NO          NAME                                                         ADDR
                                                     TEL
    CDATE
----------- ------------------------------------------------------------ -------
----------------------------------------------------- --------------------------
---- -----------------------

(0 行処理されました)
1> INSERT INTO test (NO, NAME, ADDR, TEL) VALUES(1, '男川 美多男', '広島市中区
橋本町2-17', '082-221-7555')
2> GO

(1 行処理されました)
1> SELECT * FROM test
2> GO
NO          NAME                                                         ADDR
                                                     TEL
    CDATE
----------- ------------------------------------------------------------ -------
----------------------------------------------------- --------------------------
---- -----------------------
         1 男川 美多男
広島市中区橋本町2-17                                                 082-221-755
5                   2012-04-29 20:09:07.880

(1 行処理されました)
1> exit

C:\Users\shinoda>

まあ、こんな感じでちゃんと SQL Server が使えることは検証できた。

しかし、Transact-SQL よくわからんなあ。
つーか、LOGIN の作成ってなんだよ(^^;
ああ、SQL Server ログイン、Windows ログイン等々、色々なログインの形があるので、それらのログイン情報を設定する必要があるの?

なんかよくわからんので、一冊書籍を買っておくかな。

<追記>
Oracle のロールのようなもんなんすね。LOGIN で権限情報を作っておいてユーザに付加するような。

090425_204308.JPG嫁の実家の近くなのに、なかなか食べに行けなかった「陽気」のラーメンをやっと食べることが出来ました。

・・・すんません。カップ麺で・・・す・・・(^^;

今日は、かつての同僚Nさんに事務所に監禁され、一日中(つーか、朝からさっきまで(^^;)サーバ障害の復旧作業の手伝いをさせられた。

で、晩飯がこれだ。

「陽気」のカップ麺と、おにぎり。そしてバナナ(笑)

「陽気」と言えば、広島を代表するラーメン屋で、広島の美味いラーメン屋BEST10とかすると、かならず上位3位以内に入るような実力者だ。でも、醤油ラーメンだと聞いてたんで、俺はちょっと食指が動かなかったんだよなあ。俺はやっぱ豚骨ベースのラーメンでないと・・・(笑)

でも、カップ麺はなかなか美味かったよ。
チャーシューなんかは無茶苦茶薄くて一昔前のカップ麺って感じだったけど、麺とスープはなかなかイケてる気がした。

つーか、実際のところ、本物とカップ麺の味というのはどの程度乖離するものなのか興味があるので、カップ麺の味を忘れんうちに「陽気」に行きたいなあ。

このアーカイブについて

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

前のカテゴリはWindowsです。

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

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

月別 アーカイブ

電気ウナギ的○○ mobile ver.

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