BLOB-файлы в базе данных SQL как чанк - PullRequest
4 голосов
/ 09 февраля 2012

Я пытался изменить пример из: ссылка на пример , но я получаю сообщение об ошибке;
Unable to cast object of type 'System.DBNull' to type 'System.Byte[]'
Я полагаю, что возвращенный идентификатор (UniqueIdentifier) ​​неверен.

Мой код:

public static Guid AddRecord(string firstCol, DateTime SecCol, string photoFilePath)
{
    using (SqlConnection connection = new SqlConnection(
        "Data Source=(local);Integrated Security=true;Initial Catalog=Test;"))
    {
        SqlCommand addRec = new SqlCommand(
            "INSERT INTO myTable (firstCol,SecCol,Image) " +
            "VALUES (@firstCol,@SecCol,0x0)" +
            "SELECT @Identity = NEWID();" +
            "SELECT @Pointer = TEXTPTR(Image) FROM myTable WHERE ID = @Identity", connection);

        addRec.Parameters.Add("@firstCol", SqlDbType.VarChar, 25).Value = firstCol;
        addRec.Parameters.Add("@SecCol", SqlDbType.DateTime).Value = SecCol;

        SqlParameter idParm = addRec.Parameters.Add("@Identity", SqlDbType.UniqueIdentifier);
        idParm.Direction = ParameterDirection.Output;

        SqlParameter ptrParm = addRec.Parameters.Add("@Pointer", SqlDbType.Binary, 16);
        ptrParm.Direction = ParameterDirection.Output;

        connection.Open();

        addRec.ExecuteNonQuery();

        Guid newRecID = (Guid)idParm.Value;

        StorePhoto(photoFilePath, (byte[])ptrParm.Value, connection);

        return newRecID;
    }
}

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Как отмечено в другом ответе, пример устарел; Я бы не рекомендовал его использовать.

Если вы настроены на то, чтобы заставить его работать как упражнение, измените ваш SQL, чтобы вставить созданный вами идентификатор в myTable, следующим образом:

SqlCommand addRec = new SqlCommand(
            "SELECT @Identity = NEWID();" +
            "INSERT INTO myTable (ID,firstCol,SecCol,Image) " +
            "VALUES (@Identity,@firstCol,@SecCol,0x0)" +
            "SELECT @Pointer = TEXTPTR(Image) FROM myTable WHERE ID = @Identity", connection);
1 голос
/ 12 апреля 2012

Я нашел гораздо лучший способ здесь , это SQL Server 2005 + способ сделать это.

string sql = "UPDATE BinaryData SET Data.Write(@data, LEN(data), @length) WHERE fileName=@fileName";

        SqlParameter dataParam = cmd.Parameters.Add("@data", SqlDbType.VarBinary);
        SqlParameter lengthParam = cmd.Parameters.Add("@length", SqlDbType.Int);
        cmd.CommandText = sql;

        fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
        int readBytes = 0;
        while (cIndex < fileSize)
        {
            if (cIndex + BUFFER_SIZE > fileSize)
                readBytes = fileSize - cIndex;
            else
                readBytes = BUFFER_SIZE;
            fs.Read(buffer, 0, readBytes);

            dataParam.Value = buffer;
            dataParam.Size = readBytes;
            lengthParam.Value = readBytes;

            cmd.ExecuteNonQuery();
            cIndex += BUFFER_SIZE;
        }

BinaryData - это имя таблицы.

Data.Write - это вызов системной функции, где Data - это имя столбца

1 голос
/ 09 февраля 2012

Этот пример устарел. Использование TEXTPTR настоятельно не рекомендуется после SQL Server 2005 вместе с устаревшими типами TEXT, NTEXT и IMAGE. Правильный метод SQL Server 2005 и after для эффективного управления BLOB-объектами - это использование синтаксиса UPDATE .WRITE и типов данных MAX. Если вы хотите увидеть пример, посмотрите на Загрузка и выгрузка изображений с SQL Server через ASP.Net MVC

...