4

例を次のように変更しようとしました:例へのリンクですが、エラーが発生します。
Unable to cast object of type 'System.DBNull' to type 'System.Byte[]'
返されたID(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;
    }
}
4

3 に答える 3

2

他の回答で述べたように、この例は時代遅れです。私はそれを使用することはお勧めしません。

演習として機能させることに設定されている場合は、次のように SQL を変更して、作成した ID を に挿入し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);
于 2012-02-08T20:19:30.427 に答える
1

ここでもっと良い方法を見つけました。これは 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が列名であるシステム関数呼び出しです。

于 2012-04-12T10:30:17.230 に答える
1

その例は時代遅れです。TEXTPTR非推奨の TEXT、NTEXT、および IMAGE 型と同様に、SQL Server 2005 以降では を使用しないことを強くお勧めします。SQL Server 2005 以降で BLOB を効率的に操作する正しい方法は、UPDATE .WRITE構文と MAX データ型を使用することです。例を見たい場合は、ASP.Net MVC を介して SQL Server からイメージをダウンロードおよびアップロードします。

于 2012-02-08T20:20:17.580 に答える