0

誰かがこれを理解するのを手伝ってくれるなら、私はそれを大いに感謝します. まず、次のようなクラスがあります。

public class Blob
{
    public int BlobID { get; set; }
    public string BlobName { get; set; }
    public string FileName { get; set; }
    public string FileMimeType { get; set; }
    public int FileSize { get; set; }
    public byte[] FileContent{ get; set; }
    public DateTime DateCreated { get; set; }
    public int CreatedByProfileID { get; set; }
}

かなり標準的で、まったく同じフィールド名を持つテーブルにマップされるオブジェクトです。SQL Server のテーブルは次のようになります。

ここに画像の説明を入力

私のコントローラーには、DB への読み取りと書き込みを行うためのアクションの追加と表示があります。以下のアクション コードを使用して、ファイルを正常に書き込むことができます。

[HttpPost]
public ActionResult Add(HttpPostedFileBase file)
{
    if (file != null && file.ContentLength > 0)
    {
        Database db = DatabaseFactory.CreateDatabase("dbconnstr");

        byte[] fileContent = new byte[file.ContentLength];
        file.InputStream.Read(fileContent, 0, file.ContentLength);

        object[] paramaters = 
        {
            file.FileName,
            file.FileName,
            file.ContentType,
            file.ContentLength,
            fileContent,
            DateTime.Now,
            12518
        };

        db.ExecuteNonQuery("sp_Blob_Insert", paramaters);
    }

    return RedirectToAction("Index");
}

しかし、以下の View アクション コードを使用してファイルをブラウザーに読み込むと、FileContent フィールドは常に null になります。

public ActionResult View(int id)
{
    Database db = DatabaseFactory.CreateDatabase("dbconnstr");

    Blob blob = db.ExecuteSprocAccessor<Blob>("sp_Blob_SelectByPkValue", id).Single();

    return File(blob.FileContent, blob.FileMimeType, blob.FileName);
}

ただし、フィールド名を具体的にマップすると、次のように機能します。

public ActionResult View(int id)
{
    Database db = DatabaseFactory.CreateDatabase("dbconnstr");

    IRowMapper<Blob> mapper = MapBuilder<Blob>.MapAllProperties().MapByName(x => x.FileContent).Build();

    Blob blob = db.ExecuteSprocAccessor<Blob>("sp_Blob_SelectByPkValue", mapper, id).Single();

    return File(blob.FileContent, blob.FileMimeType, blob.FileName);
}

これは ExecuteSprocAccessor() 関数のバグですか? 私は何か間違ったことをしていますか?

お時間をいただきありがとうございます。

4

2 に答える 2

0

私はこの方法で問題を解決しました:

ExecuteSprocAccessor を実行する前に、次のコードを追加します。

IRowMapper<FileEmail> rowMapper = MapBuilder<FileEmail>.MapAllProperties()
        .Map(x => x.MyFile)
        .WithFunc(ConvertVarBinaryToByteArray).Build();    

そして、Russ が上で言ったようにメソッドを作成します。

private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord)
    {
        return (byte[])dataRecord.GetValue(dataRecord.GetOrdinal("FileContent"));
    } 
于 2014-11-07T13:15:48.110 に答える
0

次のコードを使用できます。

.Map(x => x.FileContent).WithFunc(ConvertVarBinaryToByteArray); 

次に、次のような関数を作成します。

private static byte[] ConvertVarBinaryToByteArray(IDataRecord dataRecord) 
{ 
    return (byte[]) dataRecord.GetValue(dataRecord.GetOrdinal("FileContent")); 
} 
于 2014-10-09T12:15:19.733 に答える