- PR -

パラメタを使用しないバイナリ・データの登録

1
投稿者投稿内容
ベル
会議室デビュー日: 2002/12/01
投稿数: 18
投稿日時: 2005-12-15 23:40
お世話になっております。
バイナリ・データをパラメタクエリを使用せず、
SQL文に直接バイト配列の指定をしたいと考えています。

下記の様にパラメタ設定を削除し、@の指定すると
「空のオブジェクトまたは列名は使用できません。少なくともスペースを 1 つ指定してください」となってしまいます。
byte[]をSQL文中に指定するには、どの様にすればよいのでしょうか?。
ご教授いただけると幸いです。

===============================================================

byte[] arrByte = new byte[File1.PostedFile.ContentLength];
File1.PostedFile.InputStream.Read(arrByte,0,File1.PostedFile.ContentLength);

strSQL = "UPDATE Test \n";
//---strSQL += "Set 添付 = @type, \n" ;
//---strSQL += "添付Binary = @upload \n" ;
strSQL += "Set 添付 = '" + File1.PostedFile.ContentType + ", \n" ;
strSQL += "添付Binary = " + arrByte + "\n" ; <======================= @
strSQL += "Where ID = 1";

string strConn = "接続文字列";
SqlConnection sqlConn = new SqlConnection(strConn);
sqlConn.Open();
SqlCommand sqlCmd = new SqlCommand(strSQL,sqlConn,sqlTran);
//---sqlCmd.Parameters.Add("@upload",arrByte);
//---sqlCmd.Parameters.Add("@type",File1.PostedFile.ContentType);
sqlCmd.ExecuteNonQuery();
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-12-16 23:12
バイナリデータは文字として認識されませんから
そのままでは無理ですよね。

0xで始まる16進文字列で渡してやるとうまくいくかもしれませんが
効率が悪いように思えます。
エンコードして登録するとかになるのかな?

パラメタクエリを使用できない理由があるのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-17 06:10
> strSQL += "添付Binary = " + arrByte + "\n" ;
これ、どんな「文字列」ができることを、期待していますか?
私は、不可視文字(例えば 0x00 ヌル)をどの様に「文字列」として表すのか、想像できませんでした。
ベル
会議室デビュー日: 2002/12/01
投稿数: 18
投稿日時: 2005-12-17 16:00
ジブさん・Jittaさん ありがとうございます。

パラメタクエリを使用できない理由というのはありません。
ただパラメタクエリがbyte[]を認識したとき、
どのようなSQL文を生成するのかが、知りたかったのです。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-12-17 17:29
引用:


どのようなSQL文を生成するのか



どのようなSQLも(普通は)生成しません。クエリをクライアント側でパースしてパラメータを「文字列として置換して」なんてことはあまりしませんし、サーバー側に普通はほぼそのままわたされます。
どんなものが実行されるのかはSQL Serverならプロファイラってツールがあるんでそれでトレースを実行すれば実際に発行されるSQLが見れます。

ちなみに表題の件ですが、こういうときは普通にドキュメントにあたりましょう。Books Onlineの、リテラルの項目を見てみると

引用:


binary 型定数は 16 進数の文字列であり、0x というサフィックスが付きます。引用符では囲みません。」



らしいので、0xとつけてhex文字列を並べればいいでしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-12-17 22:34
引用:

yaさんの書き込み (2005-12-17 17:29) より:
引用:


binary 型定数は 16 進数の文字列であり、0x というサフィックスが付きます。引用符では囲みません。」



らしいので、0xとつけてhex文字列を並べればいいでしょう。


この方法は、この辺参照→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx
_________________
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-12-19 21:08
引用:

yaさんの書き込み (2005-12-17 17:29) より:
引用:

どのようなSQL文を生成するのか


どのようなSQLも(普通は)生成しません。クエリをクライアント側でパースしてパラメータを「文字列として置換して」なんてことはあまりしませんし、サーバー側に普通はほぼそのままわたされます。


SQLsever側がVARBINARYかIMAGEかで動きが違う可能性はありませんでしょうか?

引用:

0xとつけてhex文字列を並べればいいでしょう。



もし文字で渡すということならBASE64とかでエンコードするほうが効率的に思えます。

サーバーサイドでバイナリをどう扱うのかという根本的な問題を考える必要があるのではないかなと。

ちょっと深読みしすぎかもしれません。

SQLserver2005だとまた事情は変わるのかもしれません。
1

スキルアップ/キャリアアップ(JOB@IT)