none
SQLServer Express LocalDBにデータがINSERTされない RRS feed

  • 質問

  • お世話になっております。

    Visual Studio2017、SQLServer Express 2016 LocalDB

    表題の通り、データ入力してもLocalDBにINSERTされません。

    SQLServerから中身を見ても空っぽでした。

    しかし、データ入力するとDataGridViewには表示されます。

    いったいなぜなのでしょうか?

    よろしくお願いします。

    2018年9月22日 14:49

回答

  • > サーバーエクスプローラーにあるmdfファイルの接続文字列は
    > 「Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\bowling\Bowling.mdf;Integrated Security=True;Connect Timeout=30」です。

    > しかし、おそらく原因が見つかったと思います。
    > connectionString = (省略) AttachDbFilename=|DataDirectory|\mdfファイル
    > と記述しています。「|DataDirectory|」を絶対パスに変換したら削除・更新ができるようになりました。

    ここまで自力で調べてから、それを最初の質問に書いていただけていたらと思います。

    上記を書いてもらえていたら、よくある話の中から思いつくことがありますが、最初の質問では何もわからないということを認識ください。

    で、よくある話の中から思いつくことですが、Visual Studio のデータソース構成ウィザードを使ってアプリを作る際に、C:\bowling\Bowling.mdf を |DataDirectory| フォルダに自動的にコピーするような設定にしたからだと思います

     |DataDirectory| フォルダにコピーされた Bowling.mdf を見れば削除・更新結果が反映されているはずです。確認してください。

    なお、コードを変更してビルドし直すと、再度 C:\bowling\Bowling.mdf を |DataDirectory| フォルダにコピーするので、元に戻ってしまいます。

    ところで、先の質問者さんのスレッドで削除ができなかったのが解決されたはずですが、その時はどうしたのですか?
    • 編集済み SurferOnWww 2018年9月22日 23:43 訂正
    • 回答としてマーク Basil_09 2018年9月23日 5:43
    2018年9月22日 23:18
  • どうも話が通じないですけど、ちゃんとレスを読んでいただいているでしょうか?

    質問者さんが参考にしたというもう一つの記事(URL 下記)を見てください。

    https://qiita.com/akabei/items/3412ed032ca325c168a0

    最初にアプリを作った時(すなわち |DataDirectory| を書き換える前)、上の記事の「データセット作成」のセクションの上から 3 つめの画像のようにしたのでは?

    そうすると、それに書いてある通り&私が上のレスで言った通り、「C:\bowling\Bowling.mdf を |DataDirectory| フォルダに自動的にコピーするような設定」になります。

    アプリの接続文字列の AttachDbFilename には |DataDirectory| フォルダの Bowling.mdf が設定されているので、アプリを操作して削除・追加・変更などを行えば、当然 |DataDirectory| フォルダの .mdf ファイルに結果が反映されます。

    コピー元の C:\bowling\Bowling.mdf には何の影響もありません。質門者さんは、C:\bowling\Bowling.mdf を見て「SQLServer Express LocalDBにデータがINSERTされない」と言っていたと想像してますが、違いますか?

    AttachDbFilename に |DataDirectory| を使うのは、参考にした記事にも書いてある通り、「データベースがプロジェクトに組み込まれアプリケーションと一緒に配布されるようになります」というちゃんとした理由があります。

    |DataDirectory| フォルダがどこかと言うと、ググって調べればすぐわかるはずなのですか、上の記事の「アプリケーション配布」のセクションに書いてある通り、.exe ファイルのあるフォルダです。

    なので、記事にも書いてあるように「ソリューションの以下フォルダのファイルを実行したいPCへコピー」すれば .mdf を含め必要はファイルを配布できます。

    接続文字列の AttachDbFilename を |DataDirectory| のままにしておけば、配布先の PC でもそれは .exe ファイルのあるフォルダになるので、配布先の PC でもその接続文字列がそのまま使えます。

    なので、

    > しかし、配布する予定なのでこれでは配布先であるクライアントがアプリを使った場合、
    > 絶対パスのままでは必ずエラー・例外が出てきてしまうと思います。

    ・・・なんてことはしないで、最初の状態のまま(AttachDbFilename に |DataDirectory| を使う)にしておくべきです。

    以上、分かりやすく書き直したつもりですが、言ってることが分かりますか?

    • 回答としてマーク Basil_09 2018年9月23日 5:43
    2018年9月23日 5:18

すべての返信

  • あまりに情報不足でさっぱり分かりません。

    例えていうなら「メールが送信できません、どうしてでしょう?」と聞かれているような感じです。質問者さんがそう聞かれて返事できますか?

    原因は、

    (1) ネットに接続されてない
    (2) SMTP サーバアドレス指定の間違い
    (3) メールアカウント、パスワードの間違い
    (4) ポートの間違い
    (5) OP25B
    (6) アクセス禁止(例:社内 LAN → 社外メールサーバ)
    (7) セキュリティ関係のソフト(ファイアウォール含む)によるブロック
    (7) プログラムの書き方の間違い

    ・・・等々いろいろあるでしょうが、それを一つ一つ聞いて行って解決するのは気が遠くなる話だと思うのですが。

    #前のスレッドの主キーの話は対応済み&解決済みと理解。

    • 編集済み SurferOnWww 2018年9月22日 15:27 追記
    2018年9月22日 15:22
  • 主キー等は理解しました。アイデンティティキーを使用しています。


    データを入力→DataGridViewにデータが表示→アプリケーション終了→再度アプリケーションを起動

    →DataGridViewにデータが表示されない→SQLServer内を見ても中身は空っぽ

    という状態です。

    mdfファイルはC:\直下とソリューションファイルがあるフォルダに入れてあります。

    https://qiita.com/akabei/items/3412ed032ca325c168a0

    https://blog.clock-up.jp/entry/2016/07/27/vs-sqlserver-localdb

    を参考にしてみました。

    サーバーエクスプローラーにあるmdfファイルの接続文字列は

    「Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\bowling\Bowling.mdf;Integrated Security=True;Connect Timeout=30」です。

    再度よろしくお願いします。


    • 編集済み Basil_09 2018年9月22日 16:54
    2018年9月22日 16:52
  • 一切のエラー・例外が発生していないのでしょうか? 発生していても無理やりcatchして無視していれば何もなかったことになってしまい、空っぽという結果もあり得ません。まずはエラー・例外を探すべきです。
    2018年9月22日 21:29
  • ご回答ありがとうございます。

    try catchで探してみましたがエラー・例外ともにありません。

    しかし、おそらく原因が見つかったと思います。

    connectionString = (省略) AttachDbFilename=|DataDirectory|\mdfファイル

    と記述しています。「|DataDirectory|」を絶対パスに変換したら削除・更新ができるようになりました。

    しかし、このプログラムは配布予定です。絶対パスを記述しては必ずエラー・例外を吐くでしょう。

    そこで省略可能な「|DataDirectory|」を見つけたのですが、どうやら空文字扱いされているようです。

    どうしたら絶対パスを使用せず、DBを使用することができるでしょうか?

    よろしくお願いします。

    2018年9月22日 21:43
  • > サーバーエクスプローラーにあるmdfファイルの接続文字列は
    > 「Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\bowling\Bowling.mdf;Integrated Security=True;Connect Timeout=30」です。

    > しかし、おそらく原因が見つかったと思います。
    > connectionString = (省略) AttachDbFilename=|DataDirectory|\mdfファイル
    > と記述しています。「|DataDirectory|」を絶対パスに変換したら削除・更新ができるようになりました。

    ここまで自力で調べてから、それを最初の質問に書いていただけていたらと思います。

    上記を書いてもらえていたら、よくある話の中から思いつくことがありますが、最初の質問では何もわからないということを認識ください。

    で、よくある話の中から思いつくことですが、Visual Studio のデータソース構成ウィザードを使ってアプリを作る際に、C:\bowling\Bowling.mdf を |DataDirectory| フォルダに自動的にコピーするような設定にしたからだと思います

     |DataDirectory| フォルダにコピーされた Bowling.mdf を見れば削除・更新結果が反映されているはずです。確認してください。

    なお、コードを変更してビルドし直すと、再度 C:\bowling\Bowling.mdf を |DataDirectory| フォルダにコピーするので、元に戻ってしまいます。

    ところで、先の質問者さんのスレッドで削除ができなかったのが解決されたはずですが、その時はどうしたのですか?
    • 編集済み SurferOnWww 2018年9月22日 23:43 訂正
    • 回答としてマーク Basil_09 2018年9月23日 5:43
    2018年9月22日 23:18
  • ご回答ありがとうございます。遅くなり申し訳ありません。

    前スレッドでやった方法ですが、

    https://garafu.blogspot.com/2016/05/how-to-connect-sqlserver-wcs.html

    ここを参考にしてApp.Configを使用しDB接続を行いました。

    しかし、今回上記のURLの通りApp.Configを使用してDB接続を試みたのですが、

    追加も反映もなにもできない状態が続く一方なので今回のやり方に変えた現状です。

     |DataDirectory| フォルダにコピーされた Bowling.mdf を見れば削除・更新結果が反映されているはずです。確認してください。

    絶対パスで試してみるということでよろしいでしょうか?

    絶対パスで試した結果、反映・追加・削除できるようになりました。

    しかし、配布する予定なのでこれでは配布先であるクライアントがアプリを使った場合、

    絶対パスのままでは必ずエラー・例外が出てきてしまうと思います。

    よろしくお願いします。

    【追記】

    すみません、おそらく勘違いしていたと思います。

    Bowling.mdfとBowlingDataSet.xsdの出力ディレクトリプロパティを「新しい場合はコピーする」に変更し、

    テストとしてDebugフォルダとReleseフォルダに.mdfと.ldfを入れて比べてみたところ、

    無事に削除・更新処理ができるようになりました。

    こういうことでよかったでしょうか?


    • 編集済み Basil_09 2018年9月23日 5:02
    2018年9月23日 4:19
  • どうも話が通じないですけど、ちゃんとレスを読んでいただいているでしょうか?

    質問者さんが参考にしたというもう一つの記事(URL 下記)を見てください。

    https://qiita.com/akabei/items/3412ed032ca325c168a0

    最初にアプリを作った時(すなわち |DataDirectory| を書き換える前)、上の記事の「データセット作成」のセクションの上から 3 つめの画像のようにしたのでは?

    そうすると、それに書いてある通り&私が上のレスで言った通り、「C:\bowling\Bowling.mdf を |DataDirectory| フォルダに自動的にコピーするような設定」になります。

    アプリの接続文字列の AttachDbFilename には |DataDirectory| フォルダの Bowling.mdf が設定されているので、アプリを操作して削除・追加・変更などを行えば、当然 |DataDirectory| フォルダの .mdf ファイルに結果が反映されます。

    コピー元の C:\bowling\Bowling.mdf には何の影響もありません。質門者さんは、C:\bowling\Bowling.mdf を見て「SQLServer Express LocalDBにデータがINSERTされない」と言っていたと想像してますが、違いますか?

    AttachDbFilename に |DataDirectory| を使うのは、参考にした記事にも書いてある通り、「データベースがプロジェクトに組み込まれアプリケーションと一緒に配布されるようになります」というちゃんとした理由があります。

    |DataDirectory| フォルダがどこかと言うと、ググって調べればすぐわかるはずなのですか、上の記事の「アプリケーション配布」のセクションに書いてある通り、.exe ファイルのあるフォルダです。

    なので、記事にも書いてあるように「ソリューションの以下フォルダのファイルを実行したいPCへコピー」すれば .mdf を含め必要はファイルを配布できます。

    接続文字列の AttachDbFilename を |DataDirectory| のままにしておけば、配布先の PC でもそれは .exe ファイルのあるフォルダになるので、配布先の PC でもその接続文字列がそのまま使えます。

    なので、

    > しかし、配布する予定なのでこれでは配布先であるクライアントがアプリを使った場合、
    > 絶対パスのままでは必ずエラー・例外が出てきてしまうと思います。

    ・・・なんてことはしないで、最初の状態のまま(AttachDbFilename に |DataDirectory| を使う)にしておくべきです。

    以上、分かりやすく書き直したつもりですが、言ってることが分かりますか?

    • 回答としてマーク Basil_09 2018年9月23日 5:43
    2018年9月23日 5:18
  • いちいち棘のある言い方はやめた方がいいですよ、誰も得しないですから。

    それと、私もですけど最初から分かりやすく言っていただけるとお互い助かると思います。

    お互い気をつけましょう。

    コピー元の C:\bowling\Bowling.mdf には何の影響もありません。質門者さんは、C:\bowling\Bowling.mdf を見て「SQLServer Express LocalDBにデータがINSERTされない」と言っていたと想像してますが、違いますか?

    いえ違います。説明不足で申し訳ありません。

    そこはパスを見てコピー先であるBowling.mdfを参照しました。

    はい、非常に分かりやすい解説で助かりました。

    おかげさまで無事アプリを作成することができました。

    他の古いPCでアプリをダウンロードし実際確かめたところ、

    DBにもアクセスでき、更新処理もできるようになりました。

    更新処理されない原因はやはり、追記にも書いた通り

    owling.mdfとBowlingDataSet.xsdの出力ディレクトリプロパティを「新しい場合はコピーする」に変更

    することにより解消できました。

    長々とありがとうございました。

    2018年9月23日 5:42
  • > いちいち棘のある言い方はやめた方がいいですよ、誰も得しないですから。
    > それと、私もですけど最初から分かりやすく言っていただけるとお互い助かると思います。

    質問の不備・情報不足があって、それを指摘されているのにそういうことを言うのですか。
    では、今後はあなたには関わらないことにします。


    2018年9月23日 7:35