X



ADO.NETの質問・雑談スレ2
0402NAME IS NULL垢版2020/01/26(日) 02:26:51.45ID:BP0mZu6W
バイナリ型のデータの取得で質問があります
データベースでアクセスでフィールド型OLE オブジェクト型があり
そこにバイナリデータがあります。
具体的にはEXCELのファイルのバイナリが登録されています(これは直接登録)
そこからADO.NETでそのバイナリを読み出し
クライアントにダウンロードして開けたいと思っています。
プログラム
・・・・・・前半省略
while (reader.Read())//アクセスからデータをバイナリデータを読み込む
{
ExcelBinary = (Byte[])reader.GetValue(0);//EXCELのバイナリデータ(あらかじめ登録されている)
Response.AddHeader("Content-Disposition", "attachment;filename=" + "data.xlsx"); //ヘッダー
Response.ContentType = "application/msexcel";// MIMEコンテンツタイプを指定
Response.BinaryWrite(PhotoData);// HTTP出力ストリームにバイナリ文字の文字列を書き込む
Response.Flush();
Response.End();

これでいけるとおもうのですが確かにダウンロードしてEXCELがたちあがるのですが
ファイルが壊れているか拡張子が違うとメッセージが出て開けません
疑問点は何か足りない部分があるのでしょうか?
ちなみにアクセスでなくファイルのバスにEXCELデータを直接置いた場合はファイルがダウンロードされて
開けます。
さらにFsstreamで書き出して直接開けても同じこのがおこります。
EXCELやPDFはアクセスに登録してダウンロードして開けることはできないのでしょうか?
ご教授していただければ幸いです
0403NAME IS NULL垢版2020/01/26(日) 02:26:56.38ID:BP0mZu6W
バイナリ型のデータの取得で質問があります
データベースでアクセスでフィールド型OLE オブジェクト型があり
そこにバイナリデータがあります。
具体的にはEXCELのファイルのバイナリが登録されています(これは直接登録)
そこからADO.NETでそのバイナリを読み出し
クライアントにダウンロードして開けたいと思っています。
プログラム
・・・・・・前半省略
while (reader.Read())//アクセスからデータをバイナリデータを読み込む
{
ExcelBinary = (Byte[])reader.GetValue(0);//EXCELのバイナリデータ(あらかじめ登録されている)
Response.AddHeader("Content-Disposition", "attachment;filename=" + "data.xlsx"); //ヘッダー
Response.ContentType = "application/msexcel";// MIMEコンテンツタイプを指定
Response.BinaryWrite(PhotoData);// HTTP出力ストリームにバイナリ文字の文字列を書き込む
Response.Flush();
Response.End();

これでいけるとおもうのですが確かにダウンロードしてEXCELがたちあがるのですが
ファイルが壊れているか拡張子が違うとメッセージが出て開けません
疑問点は何か足りない部分があるのでしょうか?
ちなみにアクセスでなくファイルのバスにEXCELデータを直接置いた場合はファイルがダウンロードされて
開けます。
さらにFsstreamで書き出して直接開けても同じこのがおこります。
EXCELやPDFはアクセスに登録してダウンロードして開けることはできないのでしょうか?
ご教授していただければ幸いです
0404NAME IS NULL垢版2020/01/26(日) 13:40:04.90ID:???
MIME登録されてないだけだろ
IISで設定しろ
0405NAME IS NULL垢版2020/01/26(日) 18:02:42.11ID:BP0mZu6W
そうなんですか?
IISの設定なんているのですか?
Response.ContentType = "application/msexcel";// MIMEコンテンツタイプを指定
ではだめなんですか?
0406NAME IS NULL垢版2020/01/26(日) 18:30:42.28ID:BP0mZu6W
しかし、ダウンロードはできるのです。
そのファイルが開けないのです。(サポートされていない形式ですのエラーメッセージ)
サーバにファイルがある場合は普通にダウンロードできて開けるのです
アクセス、SQLServerにバイナリデータとして登録されている場合が
開けないのです。
0407NAME IS NULL垢版2020/01/26(日) 20:18:34.75ID:8nfufEbl
・バイナリデータの格納
・バイナリデータの読み込み
・データをダウンロードさせる
・(クライアントが)ファイルを開く
のうち、どこまで成功してるんだ?

そもそも、そのデータは「ファイルの中身」なのか?
0408NAME IS NULL垢版2020/01/26(日) 20:39:21.04ID:BP0mZu6W
バイナリはあらかじめ格納できているのです
それをサーバー側からダウンロードしてアプリを自動的に立ち上げ
(要はWebから自動的にPDFを開ける)のと同じようにしたいのです
PDF,EXCEL,WORDなどがバイナリとしてアクセスまたはSQLServerでダウンロード
して中身を見たいのです
Server.MapPath(string.Format(@"./File/{0}", "Test.bmp"));
のようにあらかじめファイルをディレクトリにおいたときは
Respnse.writeBainaryでうまくいきます
問題はSQLServer アクセスにバイナリとして格納したときはできないのかな?と
やっぱり、ディレクトリの位置だけでDBの登録してServer.MapPath
でダウンロードしかないのかなと。
0409NAME IS NULL垢版2020/01/28(火) 23:10:28.36ID:???
OLEオブジェクト型はバイナリ型じゃないからな
OLEヘッダ付きで格納されてるから、OLEヘッダ落とす必要があったはず
0410NAME IS NULL垢版2020/02/03(月) 12:35:43.47ID:???
そうなんだ。ヘッダー落すのは先頭からバイトを削る事何ですか。わ
0411NAME IS NULL垢版2020/02/03(月) 21:24:17.58ID:???
409
確かにマイクロソフトのaspnetの分厚い本にコードの書き方書いてありましたね
少し試して見ます。thanks
0412NAME IS NULL垢版2020/02/03(月) 22:04:09.51ID:01WTNDQb
自分の使い方が間違っているだけなのに文句を言うなよ。
0413NAME IS NULL垢版2020/10/29(木) 19:13:13.83ID:???
質問すみません。

環境:
- OS: Windows 10 (バージョン 2004, ビルド 19041.572)
- Visual Studio: Visual Studio 2019 Community (Version 16.7.6)
- ターゲット Framework: .NET Framework 4.0/4.7.2
- Driver: Microsoft Access Driver (*.mdb, *.accdb) 16.00.4999.1000 (Access 2016 Redist)

コード概要:
デーモンとして待ち受け、要求に応じてDB(主に Access accdb データベース)のデータを返すプログラムです。

現象:
ADODB.Connection をインスタンス化した connection を Open するとき、実行開始後初回〜数回は正常に値を取得できますが、数分時間をおいた後、再度 connection を Open すると、AccessViolationException が発生します:

```
ハンドルされていない例外: System.AccessViolationException: '保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。'
```

現状:
- デーモンのコンソールには、正常時には、結果が表示されますが、異常時(今回の現象)では「致命的なエラーです。」と表示されます:

```
致命的なエラーです。

ハンドルされていない例外: System.AccessViolationException: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
場所 ADODB.ConnectionClass.Open(String ConnectionString, String UserID, String Password, Int32 Options)
場所 Project1.Class1.Get(String[] fields, NameValueCollection nameValueCollection) 場所 C:\Users\mona\source\repos\Project1\Project1\Class1.cs:行 196
```

- "AccessViolation|fatal ado.net|adodb connection open" 等で Google 検索すると、Close 漏れだとかの指摘がありますが、Close は必ずしています。(finally 節で connection.Close() しています) <https://okwave.jp/qa/q3428421.html>;
- netsh winsock reset で改善したという事例 <https://social.msdn.microsoft.com/Forums/vstudio/en-US/9e41e16b-27b2-40e3-8b6c-83930103e7b8/attempted-to-read-or-write-protected-memory-on-any-sql-connection-open-after-installing-net?forum=netfxbcl>; がありましたので試しましたが改善しません。
- Provider=Microsoft.ACE.OLEDB.16.0;Data Source=C:\Users\mona\Documents\db.accdb;Persist Security Info=False; のような接続文字列の代わりにODBCデータソースでシステムDSNを定義し、DSN=db を指定しても改善しません。
- Visual Studio を管理者権限で実行しても改善しません。
- 試しにコネクションを毎回新規作成していますが改善しません。

英語サイト等も見ましたが先行事例がなかなか見つからず苦慮しています。せめてヒントでもありましたらご教示いただければ幸いです。よろしくお願いいたします。
0414413垢版2020/10/29(木) 19:35:47.21ID:???
書き忘れました、データ量(レコード数)ですが、データは複数のテーブルに分かれており(特に JOIN などはしていません)、多いもので 3000件弱、少ないもので数十件です。
データ件数に関係なく発生します。
0415NAME IS NULL垢版2020/10/29(木) 21:15:01.75ID:???
ACCESSは、というかOFFICE全般で、サーバサイドでの実行はサポートされない
ACE.OLEDBはサービスで動作させる設計にはなってないらしいぞ
0416413垢版2020/10/30(金) 19:40:47.64ID:???
>>415
ありがとうございます。そもそもの使い方として想定されていなくて、せいぜい ASP.NET と組み合わせるのが関の山、といったところでしょうか。
SQLite の利用も検討します。

ちなみに、コードを精査したところ、読み出したいテーブルとは別のDB(別ファイル)にレコード追加をする時にコケているようです。
別DBへの接続を止めたらアクセス違反はなくなりました。
ただ、コード上は、それぞれ別の接続を使用していますし、デバッガでステップ実行する際も、コケない時とコケる時があるので、タイミングの問題なのかと考えています。
取り急ぎは、同じDBへの書き込みで回避できるか検討したいと思います。
0417NAME IS NULL垢版2020/11/02(月) 03:29:23.50ID:???
いや、ASP.NETでの動作もサポートされてないから
0418413垢版2020/11/03(火) 18:11:33.38ID:???
>>417
ありがとうございます。
サポート対象外とのこと、SQLiteなりSQL Server Express なりにDBを変えてみたいと思います。
本件クローズとします。
0419NAME IS NULL垢版2020/12/13(日) 21:51:38.83ID:???
tps://
youtube.com/watch?v=TTDVrOLz6MI
0421NAME IS NULL垢版2023/02/02(木) 13:02:55.86ID:???
(  )y-~~ ( T)y-~~( T-)y-~~(T-T)y-~~
レスを投稿する


ニューススポーツなんでも実況