Windows7にSQL Server2008 Express

Windows7にSQL Server2008 Expressをインストールしようと思ったら、既知の問題があるのでインストールできないということで、SP1なら、インストールできました。
でも、SQL Server 2008 Management Studio Express がインストールできません。
今のところ、 SQL Server 2005 Express Edition SP3とSQL Server Management Studio Express Service Pack 3をインストールすれば、よさそうです。
Windows7に対応できていないのが、結構あって面倒です。
posted by VB.NET+MSDE+ActiveReports at 11:06 | Comment(0) | TrackBack(0) | SQL Server

sql server 2008でフルテキスト検索が使えない

そもそも、sql server 2008をインストールしたのは、フルテキスト検索を使うためです。
フルテキスト検索はデフォルトで有効になっていると言うことです。
意味がよくわかっていないのですが、まず、フルテキストカタログというものを作成します。
CREATE FULLTEXT CATALOG [カタログ名] ON FILEGROUP [ファイルグループ名]
とします。
そして、フルテキストインデックスを作成するそうです。
CREATE FULLTEXT INDEX
ON テーブル名(インデックスを作成する列名)
KEY INDEX テーブルの一意キー
ON カタログ名

フルテキストカタログの作成はできるようですが、フルテキストインデックスの作成が失敗します。

「'テーブルの一意キー' はフルテキスト検索キーを設定するのに有効なインデックスではありません。フルテキスト検索キーには、NULL 値が許可されない一意な単一列インデックスを指定する必要があります。そのインデックスはオフラインではなく、保存されない計算列での定義が不明確または不正確ではなく、フィルタもなく、最大サイズが 900 バイトである必要があります。フルテキスト キーに別のインデックスを選択してください。」
というエラーがでます。
テーブルの一意キーは、多分、主キーを割り当てればよいのだと思います。マニュアルを読むと、4バイトの数値がよいと言うようなことが書いてあります。
フルテキスト検索したいテーブルに、単独のプライマリキーを設定しておいて、それを上の、テーブルの一意キーとすればよいという意味だと勝手に解釈しています。

テーブルの中身が空でないとだめなのかと思って、試してみたら、今度は
「フルテキスト検索がインストールされていないか、フルテキスト コンポーネントを読み込めませんでした。」
というエラーがでます。

結局、今日のところはあきらめます。


posted by VB.NET+MSDE+ActiveReports at 22:09 | Comment(0) | TrackBack(0) | SQL Server
SQL Server 2008 Expressをインストールしました。
その後で、SQL Server Management Studioをインストールしようとしたら、うまくいかなかったので、sql server 2008 express with advanced servicesをダウンロードしてたけど、うまくいきませんでした。
アンインストールするときに、手順をどうすればよいのか調べると、プログラムの追加と削除を使えと書いてありますが、Native ClientとかBrowserとかいろいろあるので、どうすればよいのか悩んで、いろいろ試していたら、最初にMicrosoft SQL Server 2008を選択して、削除すればよいと言うことがわかりました。
そして、sql server 2008 express with toolsをインストールすれば、SQL Server Management Studioもインストールされます。
posted by VB.NET+MSDE+ActiveReports at 21:59 | Comment(0) | TrackBack(0) | SQL Server

トランザクションログが切り捨てられないようにする

MSDE2000ではデフォルトでトランザクションログが切り捨てられる設定になっています。
トランザクションログの中身を見るで、SQL Log Rescueによって、行われた処理の履歴を見ることができると紹介しましたが、ログがすぐに切り捨てられてしまって、確認できないということがあります。
その場合は、復旧モデルをFULLに変更します。
これが、デフォルトでは、SIMPLEになっています。

やり方は、

osql -S [コンピュータ名] -E -n という感じにコマンドプロンプトでログインして、
ALTER DATABASE [データベース名] SET RECOVERY FULL
GO

です。

現在の復旧モデルを確認するには、

SELECT CONVERT(nvarchar(50), DATABASEPROPERTYEX('[データベース名]', 'RECOVERY'))
GO

です。
nvarchar(50)で、50バイトで切っていますが、そうしないとコマンドプロンプトで表示できません。

復旧モードをFULLにすると、ログファイルのサイズが増え続けていくので、
なんらかの処置をする必要があります。
最大値の設定などができるのかもしれません。
私は、一時的にFULLにして、ログをとるといった使い方しかしていないので、その点については今のところわかっていません。

posted by VB.NET+MSDE+ActiveReports at 16:05 | Comment(0) | TrackBack(0) | SQL Server

MSDEのバージョンを確認する

MSDEのバージョンを確認したいときがあります。
例えば、意味不明なエラーが出るときは、最新バージョンにアップデートすれば、解決してしまったりします。
方法はいろいろあります。
タスクトレイのアイコンを右クリックして、バージョン情報を選択したり、
sqlservr.exeのプロパティのバージョン情報Tabでも確認できます。
sqlservr.exeは、MSSQL\Binnのフォルダ内にあります。

コマンドプロンプトでログインして、
1> select @@version
2> go
とすることでも、バージョン番号を確認可能です。
バージョン番号が表示されたら、該当するサービスパックがどれかということを調べます。

http://www.atmarkit.co.jp/fwin2k/win2ktips/610sqlver/sqlver.html
↑↑↑↑
こちらのページに詳しく載っています。
MSDE 2000 SP4にしておいたほうがよいです。
posted by VB.NET+MSDE+ActiveReports at 16:54 | Comment(0) | TrackBack(0) | SQL Server

MSDEがインストールできない

MSDEがインストールできないときがあります。
特にエラーメッセージが出るわけでもなく、プログレスバーが途中から戻っていってしまったりします。
最初は、インストールに成功したのかと思いました。
ファイルとプリンタの共有が向こうになっているとか、ローカルセキュリティポリシーを変更しないといけないとかいうことがあります。
しかし、Windows XP Home では、ローカルセキュリティポリシーの設定なんてできないし、他の設定も全て正しいのに、インストールに失敗することがあります。
こんなときは、意外とコンピュータを再起動するだけで出来るようになってしまうことがあります。
posted by VB.NET+MSDE+ActiveReports at 18:05 | Comment(0) | TrackBack(0) | SQL Server

EXCEPTION_ACCESS_VIOLATION

MSDE2000で、
SqlDumpExceptionHandler: プロセス 51 で重大な例外 c0000005 EXCEPTION_ACCESS_VIOLATION が発生しました。SQL Server はこのプロセスを終了しています。
というエラーが発生することがあります。

Microsoftによると、これを解決するためには、最新のサービスパックを適用する必要があるということです。
しかし、MSDE2000のSP4はたぶん最新ですが、このサービスパックを適用していても現象がおきることがあります。

EXCEPTION_ACCESS_VIOLATIONが発生する原因ですが、キャッシュにおかしなデータが残っているために、同じクエリを送信すると、毎回エラーが出てしまうということだそうです。
そのため、キャッシュをクリアすれば問題は解決するのですが、その方法がわかりません。
一番簡単なのはコンピュータを再起動することです。
経験上、頻繁に何度も同じエラーが出たということはないので、一度、再起動してしまえば解決してしまうと思います。
posted by VB.NET+MSDE+ActiveReports at 13:40 | Comment(0) | TrackBack(0) | SQL Server

アサーションエラー

データベースに対して、SELECTやUPDATE、DELETEなどのコマンドを使用すると、以下のようなエラーがでることがあります。

Error: System.Data.SqlClient.SqlError: Location: p:\sql\ntdbms\storeng\drs\include\record.inl:1447
Expression: m_SizeRec > 0 && m_SizeRec <= MAXDATAROW
SPID: 56
Process ID: 3980

意味はわかりませんが、アサーションエラーというそうです。
データベースに何らかの不整合が発生しているようです。
これは、MSDE2000の場合、SP4で改善されているそうです。
しかし、MSDEのアップデートをしたくない場合もあります。
一番簡単に解決するのは、こうなる前のデータと入れ替えることです。
または、データを消します。
DELETEだとエラーになりますが、TRUNCATEなら多分大丈夫です。

データベースを修復することもできます。

osql -S [コンピュータ名] -E -n という感じにコマンドプロンプトでログインして、
DBCC CHECKDBコマンドを実行します。
3つのオプション、REPAIR_ALLOW_DATA_LOSS、REPAIR_FAST、EPAIR_REBUILDがありますが、
結局、REPAIR_ALLOW_DATA_LOSSじゃないと解決しないことが多いです。
ただ、データが消える可能性があるので注意してください。

DBCC CHECKDBコマンドはシングルユーザーモード以外では使用できません。

そのため、

シングルユーザーモードにする。
ALTER DATABASE [データベース名] SET SINGLE_USER
GO

データベースを修復
DBCC CHECKDB('[データベース名]',REPAIR_ALLOW_DATA_LOSS)
GO

マルチユーザーモードに戻す
ALTER DATABASE [データベース名] SET MULTI_USER
GO

という流れで修復します。

posted by VB.NET+MSDE+ActiveReports at 15:51 | Comment(0) | TrackBack(0) | SQL Server

SQL serverでOpen時にタイムアウト

SQL serverで接続をオープンするタイミングで、
「タイムアウトに達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。」というエラーが発生します。
英語だと
「The timeout period elapsed prior to completion of the operation or the server is not responding.」
このエラーがでたら、CommandTimeOutを設定するとよいという意見が多いですが、実際はタイムアウトではなく、サーバーが応答していないと思われるので、意味がない場合が多いです。
アプリケーションを終了させて、もう一度起動させると復帰するので、接続プールを専有してしまっていると思われます。
どこで、接続プールのリークが起きているのかわからないので、接続のオープン、クローズの回数を減らすと改善することがあります。
あまりに、頻繁に接続のオープン、クローズを繰り返していると、何かの拍子に、接続プールがたまりすぎて、新たな接続を確立することができなくなるようです。
プーリングプロパティをオフにしても、うまくいかなかったので、データの読み込みが連続する場合、一度、オープンさせてから、連続処理をしてクローズさせるという方法に変えました。
クローズを忘れると面倒なことになりますが、24時間稼動させるようなプログラムの場合は、たぶん改善します。
同じ条件でも、上のエラーが出る場合と、出ない場合があるので、メモリを増設してみると改善する場合があるかもしれません。
posted by VB.NET+MSDE+ActiveReports at 00:25 | Comment(1) | TrackBack(0) | SQL Server

WindowsXP SP3を適用するとMSDE、SQL Serverにネットワークアクセスできない。

WindowsXP SP3を適用するとMSDE、SQL Serverにネットワークアクセスできなくなることがあります。
Windows ファイアーウォールをONにしているときにLAN上のコンピュータから、MSDEやSQL Serverにアクセスできなくなることがあります。
ファイアーウォールでは、sqlservr.exeを許可しているのに、アクセスできなくなります。
1433のポートを空けてもだめです。
この場合、一度、接続文字列のサーバー名をNetBios名ではなく、IPアドレスにして接続できるのなら、ファイアーウォールの例外設定で、「ファイルとプリンタの共有」にチェックが入っていない可能性があります。
その場合、「ファイルとプリンタの共有」にチェックを入れると、NetBios名で接続できるようになります。
なぜかWindowsXPのSP3を適用すると、ここがOFFになるようです。
「ファイルとプリンタの共有」を選択して、編集ボタンを押すと、UDPで137番ポートが選ばれているのがわかります。
この137番ポートは、NETBIOS Name Serviceで使用されています。
そのため、これを開けておかないとNETBIOS名からコンピュータ名を特定することができません。
posted by VB.NET+MSDE+ActiveReports at 22:27 | Comment(0) | TrackBack(0) | SQL Server

MSDEのインストールログを見る

MSDEのインストールに失敗した場合、
インストールに失敗しました。
セットアップログを参照してください。
というメッセージが出ることがあります。
しかし、セットアップログがどこにあるのかわかりません。
その場合は、本当にセットアップログは存在しません。
MSDEをインストールするときにセットアップログを残すためには、
コマンドラインで、setup.exeに/L*vオプションを付けて実行する必要があります。
コマンドプロンプトで、setup.exeのあるフォルダに移動して、

setup.exe /L*v [ログファイルのフルパス]

とします。
ログファイルのフルパスは自分で好きなように決めます。
すると、指定した場所にログが残り、エラーの発生原因を知ることが出来ます。
セットアップログファイルは、かなり内容が多いので、「Error」で検索すると、
該当場所を発見できると思います。

MSDE、SQL serverのインストールで、エラーがでる原因は、管理ツールのサービスを確認して、Serverサービスが実行されていなかったり、インストールされていなかったりする場合があります。
この場合は、Serverサービスを開始してから、インストールします。

また、再インストールで失敗する場合は、MSSQL\Dataのフォルダの中に、msdbdata.mdf、model.mdf、master.mdfなどが残っている場合です。
その場合は、それらのファイルを削除してから、インストールしなおすと成功します。
posted by VB.NET+MSDE+ActiveReports at 11:41 | Comment(0) | TrackBack(0) | SQL Server

トランザクションログの中身を見る

MSDEでデータベースアプリケーションを開発していますが、
さまざまなバグで問い合わせがあったときには、
たいていの場合、データを直接見れば、バグの原因がわかります。

しかし、データを直接見た場合、そのデータを採取した時点のものなので、
なぜ、そういうデータになったのか、わからないことがあります。

MSDEやSQL Serverのデータのファイルは、拡張子がmdfのものとldfのものがセットになっています。
mdfはモデルファイル、ldfはログファイルといって、
mdfには、実際のデータが入っていて、ldfにはトランザクションログが入っているそうです。
このトランザクションログとは、MSDEやSQL Serverに送られたコマンドの結果が時系列に入っているようです。
トランザクションログの話題になると、たいてい、バックアップした状態に戻すためのものであると説明されていますが、もし、この中身を見ることが出来たら、
バグの原因が、すっきりわかるに違いないと思いました。
Googleでいろいろ検索してみましたが、日本語のサイトには、
トランザクションログを見る方法は見つけることができず。
英語のサイトで見つけることができました。
しかも、無料のツールです。
SQL Log Rescueというソフトです。
リンク先で、Download your free copy now! をクリックして手に入れることが出来ます。
MSDEやSQL Serverを使用している人なら、使い方は見れば、すぐにわかります。

WinsowsXP Pro SP2、MSDEではOKでしたが、Windows Vista Business、SQL Server Express2005ではうまくいきませんでした。
SQL Server2000しかサポートしていないそうです。
posted by VB.NET+MSDE+ActiveReports at 17:27 | Comment(0) | TrackBack(0) | SQL Server

MSDE再起動後に DataReaderでエラー

VS.NET2002で、VB.NETで作ったプログラムから
MSDEを停止して、処理をしてからMSDEを開始し、
その後で、SQLDataReaderでデータを読み込みに行くと
エラーになることがあります。

これは、原因はよくわかりません。
MSDEを再開して、すぐにアクセスするのがダメなわけでもありません。
1分くらい待ってから、接続しても同じです。

いつもは、MSDEを停止して、処理をしてからMSDEを開始したら、
データベースにアクセスさせることなく、プログラムを終了させるので問題ないのですが、
MSDEを開始した後で、データベースにアクセスしたいこともあります。

こうなってしまった場合、何度かリトライすれば回復します。
SQLDataReaderで、何らかのデータを読み込み、
エラーが出てもスルーするようにしておけば問題ありません。
それで、回復したら、続きの処理を行うようにします。

たまにこういうことがあります。
以前は、VB.NETでWEBサーバーのファイルを、削除した後で、
他のファイルを削除することが出来ないということがありました。

posted by VB.NET+MSDE+ActiveReports at 15:35 | Comment(0) | TrackBack(0) | SQL Server

SQL Server2005 Expressのインストールに失敗する。

Windows Vista BusinessにSQL Server2005 Expressを
インストールするときに、
マネージオブジェクト形式(MOF)のファイルC:\Program Files\Microsoft SQL Server\90\Shard\sqlmgmproviderxpsp2up.mof をコンパイルできませんでした。と出て、
インストールに失敗するようになってしまいました。
一度目はインストールできていたのに、SQL Server構成マネージャが
起動しなくなってしまったので、SQL Server2005 Expressをアンインストールしてから、
もう一度インストールしようとしたら、できなくなってしまいました。

WMIサービスコントロールユーティリティ(winmgmt.exe)というものを使い、
WMIレポジトリを再構築すれば、良いそうです。

コマンドプロンプトで、winmgmt /verifyrepositoryと入力し、Enterを押します。
WMI データベースに矛盾があります と出た場合のみ、この方法が有効です。

WMIレポジトリを再構築するには、
winmgmt /salvagerepositoryと入力し、Enterです。
一度目は、
WMI データベースの回収に失敗しました
エラー コード: 0x8007041B
機能: Win32
説明: 別の実行中のサービスが依存しているサービスにストップ コントロールが送信 されました。
とでますが、もう一度やれば、
WMI データベースが回収されました
となり、成功します。
数分程度、時間がかかります。

SQL Server2005 ExpressをWindows Vistaにインストールする場合は、
ダブルクリックではなくて、右クリックをして、
管理者として実行、としたほうが無難です。
posted by VB.NET+MSDE+ActiveReports at 08:37 | Comment(0) | TrackBack(0) | SQL Server

SQL Server2005 Expressを完全にアンインストールする

SQL Server2005 Expressをアンインストールするには、
XPの場合は、プログラムの追加と削除
VISTAの場合は、プログラムのアンインストール
を開きます。

いろいろあって、どれをアンインストールしたらよいか
わからなくなりますが、まずは、Microsoft SQL Server 2005を
アンインストールします。
コンポーネントの選択ページで、SQL Server 2005 インスタンスのコンポーネントを削除するというチェック ボックスがオンになっているので、削除するインスタンスにチェックをいれて、さらに、ワークステーション コンポーネントを削除するには、ワークステーション コンポーネンをオンにします。
そして、完了をおして、Microsoft SQL Server 2005削除し、
次に、Microsoft SQL Native Clientも削除します。
msdnには、ここまでですが、もう一度インストールしようとしてもうまくいかない場合は、
さらに、Microsoft SQL Server セットアップサポートファイルを削除して、
SQL Server2005 Expressがインストールされているフォルダを丸ごと削除します。
それでもだめなら、レジストリエディタで、
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Serverも丸ごと削除します。
たいてい、ここまでやればうまくいきますが、自己責任で行ってください。
posted by VB.NET+MSDE+ActiveReports at 18:12 | Comment(0) | TrackBack(9) | SQL Server

VB.NETでデータベース圧縮する方法


VB.NETでデータベース圧縮する方法です。
MSDEやSQL Serverでは、テーブルの中身などを削除しても、
データベースのファイルのサイズは小さくなりません。
そこで、VB.NETでデータベースを圧縮する方法を紹介します。
shrinkdatabaseというコマンドを使えば良いのです。

まずは、データベース圧縮コマンドを送りっぱなしで、
出力を受け取らなくて良い場合です。

Shell("cmd.exe /C osql -S コンピュータ名 -E -n -Q ""dbcc shrinkdatabase( 'データベース名' )""", AppWinStyle.Hide)

データベース圧縮コマンドを送った後で、出力を受け取りたい場合は、

        Dim strRtn As String
        Dim objePsi As New System.Diagnostics.ProcessStartInfo()
        Dim objeProcess As Process
        'コマンド
        Dim strCommand As String
        'コマンド作成
        strCommand = "/c osql -S " & "コンピュータ名" & " "
        strCommand &= "-E -n "
        strCommand &= "-Q ""dbcc shrinkdatabase( '" & "データベース名" & "' )"""
        objePsi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
        objePsi.RedirectStandardInput = False
        objePsi.RedirectStandardOutput = True
        objePsi.UseShellExecute = False
        'ウィンドウを表示しない場合
        objePsi.CreateNoWindow = True
        objePsi.Arguments = strCommand
        '実行
        objeProcess = Process.Start(objePsi)
        '出力
        strRtn = objeProcess.StandardOutput.ReadToEnd
        objeProcess.WaitForExit()

SQL server2005の場合は、osqlをsqlcmdに変えます。

posted by VB.NET+MSDE+ActiveReports at 11:34 | Comment(0) | TrackBack(0) | SQL Server

SQL Expressのインストール

SQL Expressのインストール
SQL Server 2005 Express Edition のインストール後、
他のPCからLAN経由で接続したい場合は、

SQL Server 構成マネージャを起動して、
まず、SQL Server 2005のサービスを選択し、
SQL Server Browser を有効にします。
次に、SQL Server 2005 ネットワークの構成
SQLEXPRESSのプロトコルで、TCP/IPを有効にします。

SQLServer Express では、デフォルトのインスタンス名が
SQLExpressになっています。


SQLServer Express をアンインストールするのに
失敗すると、再度インストールしようとしても
うまくいかなくなります。

こ場合はレジストリから、 HKEY_LOCAL_MACHINE\Software\Microsoft SQL Server
というキーを丸ごと削除して、さらにプログラムのフォルダも
削除したらうまくいきました。
これは確実な情報ではありません。
参考程度にしてください。
私が困って、いろいろ調べても見つけることができなかったので
自分がうまくいった方法を書きました。

posted by VB.NET+MSDE+ActiveReports at 11:26 | Comment(0) | TrackBack(0) | SQL Server

WindowsファイアーウォールでMDSEを通過させる

MSDEやSQL Server をネットワーク経由で参照する場合の
Windowsファイアーウォールの設定

スタート
↓↓↓
コントロールパネル
↓↓↓
Windowsファイアーウォール
↓↓↓
例外タブ
↓↓↓
プログラムの追加
↓↓↓
sqlserver.exeを選択
↓↓↓
OK

以上で、ファイアーウォールが有効なLAN内のMSDE SQL Server に
アクセスできるようになります。
posted by VB.NET+MSDE+ActiveReports at 23:06 | Comment(0) | TrackBack(0) | SQL Server

SQLのクエリ実行を早くする方法

あまりに当たり前ですが気づいていませんでした。

私のように気づいていない方のためにメモしておきます。

SQLのクエリを実行する場合。
私は愚かなことに、いちいち

コネクションオープン

SQLのクエリを実行

コネクションクローズとしていました。


ちょっと考えればわかることですが、
実行したいSQL文が3つある場合は

コネクションオープン

SQLのクエリを実行

SQLのクエリを実行

SQLのクエリを実行

コネクションクローズ

とできます。

しかも、処理速度はかなり速くなります。

こんなことに気づかないなんて、先入観は恐ろしいです。

posted by VB.NET+MSDE+ActiveReports at 10:20 | Comment(0) | TrackBack(0) | SQL Server

MSDE SQL Server 2005 SQLExpress の開始、停止

MSDE SQL Server 2005 SQLExpress

VB.Netでコマンドプロンプトを利用して
開始、停止をする方法

MSDE SQL Server 2005
            Shell("cmd.exe /C ""NET START " & "MSSQLSERVER" & """", AppWinStyle.Hide)

SQLExpress
            Shell("cmd.exe /C ""NET START MSSQL$SQLExpress", AppWinStyle.Hide)

SQLExpressの場合、インスタンス名 SQLExpress が必要です。

MSDE SQL、 Server 2005でもインスタンス名を変えている場合は
MSSQL$インスタンス名とする必要があります。

posted by VB.NET+MSDE+ActiveReports at 14:49 | Comment(0) | TrackBack(0) | SQL Server