2

HttpPostedFileBaseを使用してRazorビューからアップロードされたファイルを取得するASPMVCアプリケーションがあります。これらはモデル内のリストに収集され、エンティティフレームワーク(v4.0.30319)に渡されます。このフレームワークでは、ファイルをデータベースに保存するためにストアドプロシージャを呼び出しています。

(これを行うにはもっと良い方法があると確信していますが、私は既存のシステムを扱っています。)

私が持っているモデルでは:

public List<Attachment> Attachments { get; set; }

添付ファイルオブジェクトは次のようになります。

public class Attachment
{
    public System.IO.Stream InputStream { get; set; }
    public String FileName { get; set; }
    public String ContentType { get; set; }
    public Int32 ContentLength { get; set; }
}

添付ファイルを保存するとき、リストをループし、ストアドプロシージャを呼び出して入力ストリームを保存しようとします。

foreach(var file in ticket.Attachments)
    {
    if (file != null)
        {
        try
            {
            //create a byte array from the input file stream
            byte[] myData = new byte[file.ContentLength];
            file.InputStream.Read(myData, 0, file.ContentLength);

            ...

            var uploadResult = Database.ExecuteSqlCommand("EXEC mySP @file = {0}...", myData);

問題は、ストアドプロシージャがテキストの一部を予期していることであるように見えます

ALTER PROCEDURE [dbo].[mySP] 
    @file           AS TEXT,
    @tcFileExtension    VARCHAR(50),
    ...

エラーの原因は次のとおりです。

Operand type clash: varbinary is incompatible with text

ストアドプロシージャを介して保存できるように、バイト配列(またはInputStream)を変換する最良の方法は何ですか?

アップロードされるファイルは、xls、xlsx、pdf、tiff、docなど、何でもかまいません。

乾杯。

4

2 に答える 2

0

データがテキストであることが確実な場合は、Encoding.GetStringを使用してすべてのテキストを文字列に読み取り、それをストアド プロシージャに渡すだけです。

var uploadResult = Database.ExecuteSqlCommand("EXEC mySP @file = {0}...", Encoding.GetString(myData);

于 2012-05-29T15:31:24.817 に答える
0

あなたの場合、プロシージャの @file パラメータのタイプはimagetext ではなく である必要があると思います。

于 2012-05-29T16:02:00.197 に答える