BLOB、SQLデータベースの挿入

私は修正できないというエラーがあります...なぜ私は本当に理由がわかりません。

私はこのコードを使って自分のデータベースにファイルをアップロードしています。今はBLOBを使いたいと思っています。

if (FileUpload1.HasFile)
                    try
                    {

                        //FileUpload1.SaveAs("C:\\inetpub\\wwwroot\\ClientPortalCs\\"
                        //+ GetTheCurrentDirectory(MyTreeView.SelectedNode)
                        //+ "\\" + FileUpload1.FileName);
                        //LabelFile.Text = "File name: " +
                        //FileUpload1.PostedFile.FileName + "
" + //FileUpload1.PostedFile.ContentLength + " kb
" + //"Content type: " + FileUpload1.PostedFile.ContentType; dbConnection.Open(); dynamic queryString = ("INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES ('" + FileUpload1.FileName + "','" + GetTheCurrentDirectory(MyTreeView.SelectedNode) + "','" + Request.Cookies["UserSettings"]["UserName"] + "','" + DateTime.Now + "','" + FileUpload1.FileBytes + "' );" + "SELECT CAST(scope_identity() AS int)"); SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection); int newFid = (Int32)theCommand1.ExecuteScalar(); dynamic queryStringFolder = ("INSERT INTO FILES_FOLDERS (Folder_Id,File_Id) VALUES ('" + MyTreeView.SelectedValue + "'," + "'" + newFid + "')"); theCommand1 = new SqlCommand(queryStringFolder, dbConnection); theCommand1.ExecuteNonQuery(); dbConnection.Close(); }

私のデータベースでは、テーブルファイルのDATAフィールドはvarbinary(max)です。 クエリのDATAフィールドのパラメータは、アップロードしようとしているファイルのバイト数です。

エラーが発生しました: "エラーデータ型varcharからvarbinary(max)への暗黙的な変換はできません。このクエリを実行するにはCONVERT関数を使用してください。

誰かが私に理由を教えてくれますか?

どうもありがとうございました 。

0
このようなコードは、 SQLインジェクション攻撃を求めています。パラメータ化されたクエリを使用してください。
追加された 著者 GvS,

1 答え

問題は、あなたが単一引用符で囲んでいるため、画像のバイト[]を文字列として渡していることです。

ここで一重引用符を削除してください:

'" + FileUpload1.FileBytes + "'"

もう1つの推奨事項:クエリにパラメータを使用します。あなたはSQLインジェクション攻撃から自分自身を救うでしょう。あなたのクエリはより速く実行され、将来この種の間違いがなくなります。

UPDATE - using parameters:

string queryString = "INSERT INTO Files (Name,Path,UserUpload,Date,Data) VALUES (@Name,@Path,@UserUpload,@Date,@Data)";
SqlCommand theCommand1 = new SqlCommand(queryString, dbConnection);
theCommand1.Parameters.AddWithValue("@Name",FileUpload1.FileName);
theCommand1.Parameters.AddWithValue("@Path",GetTheCurrentDirectory(MyTreeView.SelectedNode));
theCommand1.Parameters.AddWithValue("@UserUpload",Request.Cookies["UserSettings"]["UserName"]);
theCommand1.Parameters.AddWithValue("@Data",FileUpload1.FileBytes);
theCommand1.Parameters.AddWithValue("@Date",DateTime.Now);

int newFid = (Int32)theCommand1.ExecuteScalar();
2
追加された
うん!しかし、なぜこのエラーが出たのですか?エラーオブジェクトまたは列の名前がないか空です。 SELECT INTOステートメントの場合、各列に名前があることを確認します。他のステートメントの場合は、空のエイリアス名を探します。 ""または[]と定義された別名は使用できません。エイリアスを有効な名前に変更します。 ''の近くの構文が正しくありません。
追加された 著者 Kiwimoisi,
はい。INSERT INTOファイル(名前、パス、UserUpload、日付、データ)VALUES( 'WSB BOXE 20.jpg'、 'Projects//TEST /'、 'Admin'、 '10/28/2011 12:41:16 PM '、System.Byte []); SELECT CAST(scope_identity()AS int)それは良く見えません..
追加された 著者 Kiwimoisi,
System.Byte []の代わりに数字を見ることができるはずです。
追加された 著者 Kiwimoisi,
代わりにパラメータを使用すると、私は本当に何が変わるのか分かりません。
追加された 著者 Kiwimoisi,
うんいいね !それは本当に本当に役に立ちました。どうもありがとうございます 。
追加された 著者 Kiwimoisi,
私はすべてのmu関数を変更します。それは正常に動作しているが、私は何かについて考えている。なぜデータベースのファイルのデータフィールドがですか?この分野の数字は見ないと思っていますか?
追加された 著者 Kiwimoisi,
すべてがうまくいっています!そしてダウンロードも。
追加された 著者 Kiwimoisi,
@あなたは今、構文が間違っています。 SQL Serverに送信するSQL文を印刷し、それがどのように見えるかを確認します。
追加された 著者 Icarus,
@Emged私は参照してください...あなたはこのようなインラインSQLでバイト配列を渡します。代わりにパラメータを使用します。 5秒での例を提供します。
追加された 著者 Icarus,
@Emged私は今外出しなければならないが、パラメータ化されたSQLクエリを読む。
追加された 著者 Icarus,
@Emged、超クール:)
追加された 著者 Icarus,
@Emgedまた、他のすべてのページもパラメータ化されたクエリに変更します。
追加された 著者 GvS,
@Emged、それは今あなたが得るエラーです。しかし、現在SQLを作成するために使用している手法は安全ではありません。この方法でデータにアクセスし続けると、最も馬鹿げたハッカーでもサイトをハックすることは非常に(非常に)簡単です。そして、私は小塊についてだけではない。エンコードせずにSQLにクッキーを挿入することさえできます。ハッカーがユーザー名のCookieを Robert '、null、null)に変更するとどうなりますか?ドロップテーブルファイル。 -
追加された 著者 GvS,