- - PR -
パラメタを使用しないバイナリ・データの登録
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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-12-16 23:12
バイナリデータは文字として認識されませんから
そのままでは無理ですよね。 0xで始まる16進文字列で渡してやるとうまくいくかもしれませんが 効率が悪いように思えます。 エンコードして登録するとかになるのかな? パラメタクエリを使用できない理由があるのでしょうか? | ||||||||||||
|
投稿日時: 2005-12-17 06:10
> strSQL += "添付Binary = " + arrByte + "\n" ;
これ、どんな「文字列」ができることを、期待していますか? 私は、不可視文字(例えば 0x00 ヌル)をどの様に「文字列」として表すのか、想像できませんでした。 | ||||||||||||
|
投稿日時: 2005-12-17 16:00
ジブさん・Jittaさん ありがとうございます。
パラメタクエリを使用できない理由というのはありません。 ただパラメタクエリがbyte[]を認識したとき、 どのようなSQL文を生成するのかが、知りたかったのです。 | ||||||||||||
|
投稿日時: 2005-12-17 17:29
どのようなSQLも(普通は)生成しません。クエリをクライアント側でパースしてパラメータを「文字列として置換して」なんてことはあまりしませんし、サーバー側に普通はほぼそのままわたされます。 どんなものが実行されるのかはSQL Serverならプロファイラってツールがあるんでそれでトレースを実行すれば実際に発行されるSQLが見れます。 ちなみに表題の件ですが、こういうときは普通にドキュメントにあたりましょう。Books Onlineの、リテラルの項目を見てみると
らしいので、0xとつけてhex文字列を並べればいいでしょう。 | ||||||||||||
|
投稿日時: 2005-12-17 22:34
この方法は、この辺参照→ http://blogs.wankuma.com/jitta/archive/2005/11/12/19254.aspx _________________ | ||||||||||||
|
投稿日時: 2005-12-19 21:08
SQLsever側がVARBINARYかIMAGEかで動きが違う可能性はありませんでしょうか?
もし文字で渡すということならBASE64とかでエンコードするほうが効率的に思えます。 サーバーサイドでバイナリをどう扱うのかという根本的な問題を考える必要があるのではないかなと。 ちょっと深読みしすぎかもしれません。 SQLserver2005だとまた事情は変わるのかもしれません。 |
1