C# 无效的文本、ntext或图像指针值

C# 无效的文本、ntext或图像指针值,c#,sql-server-2008,binary,webforms,C#,Sql Server 2008,Binary,Webforms,我正在尝试将文件上载到数据库(通过将二进制文件内容读入存储过程)。我将输入流传递给我的方法,如下所示: LoadFile(gAttachmentContentID, file.InputStream, trn); public static void LoadFile2(Guid gAttachmentContentID, Stream stm, IDbTransaction trn) { stm.Position = 0; byte[] binFILE_POINTER = n

我正在尝试将文件上载到数据库(通过将二进制文件内容读入存储过程)。我将输入流传递给我的方法,如下所示:

LoadFile(gAttachmentContentID, file.InputStream, trn);

public static void LoadFile2(Guid gAttachmentContentID, Stream stm, IDbTransaction trn)
{
    stm.Position = 0;
    byte[] binFILE_POINTER = new byte[32];

    // Now read s into a byte buffer. 
    byte[] bytes = new byte[stm.Length];
    int numBytesToRead = (int)stm.Length;
    int numBytesRead = 0;
    while (numBytesToRead > 0)
    {
        // Read may return anything from 0 to 10. 
        int n = stm.Read(bytes, numBytesRead, 10);
        // The end of the file is reached. 
        if (n == 0)
        {
            break;
        }
        numBytesRead += n;
        numBytesToRead -= n;
    }
    stm.Close();
    SqlProcs.spATTACHMENTS_CONTENT_WriteOffset(gAttachmentContentID, binFILE_POINTER, 0, bytes, trn);
    // numBytesToRead should be 0 now, and numBytesRead should 
    // equal 100.
    Console.WriteLine("number of bytes read: {0:d}", numBytesRead);
}
通过此程序:

public static void spATTACHMENTS_CONTENT_WriteOffset(Guid gID, byte[] binFILE_POINTER, Int32 nFILE_OFFSET, byte[] byBYTES, IDbTransaction trn)
{
    IDbConnection con = trn.Connection;
    using ( IDbCommand cmd = con.CreateCommand() )
    {
        cmd.Transaction = trn;
        cmd.CommandType = CommandType.StoredProcedure;
        if ( Sql.IsOracle(cmd) )
            cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOff";
        else
            cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOffset";
        IDbDataParameter parID               = Sql.AddParameter(cmd, "@ID"              , gID                );
        IDbDataParameter parFILE_POINTER     = Sql.AddParameter(cmd, "@FILE_POINTER"    , binFILE_POINTER    );
        IDbDataParameter parMODIFIED_USER_ID = Sql.AddParameter(cmd, "@MODIFIED_USER_ID",  Security.USER_ID  );
        IDbDataParameter parFILE_OFFSET      = Sql.AddParameter(cmd, "@FILE_OFFSET"     , nFILE_OFFSET       );
        IDbDataParameter parBYTES            = Sql.AddParameter(cmd, "@BYTES"           , byBYTES            );
        cmd.ExecuteNonQuery();
    }
}
Create Procedure dbo.spATTACHMENTS_CONTENT_WriteOffset
    ( @ID                   uniqueidentifier
    , @FILE_POINTER         binary(16)
    , @MODIFIED_USER_ID     uniqueidentifier
    , @FILE_OFFSET          int
    , @BYTES                image
    )
with encryption
as
  begin
    set nocount on

    -- 10/22/2005 Paul.  @ID is used in Oracle and MySQL. 
-- #if SQL_Server /*
    updatetext ATTACHMENTS_CONTENT.ATTACHMENT
               @FILE_POINTER
               @FILE_OFFSET
               null -- 0 deletes no data, null deletes all data from insertion point. 
               @BYTES;
但我得到了以下错误:

无效的文本、ntext或图像指针值0x00000000000000

错误发生在
cmd.ExecuteNonQuery()行

存储过程:

public static void spATTACHMENTS_CONTENT_WriteOffset(Guid gID, byte[] binFILE_POINTER, Int32 nFILE_OFFSET, byte[] byBYTES, IDbTransaction trn)
{
    IDbConnection con = trn.Connection;
    using ( IDbCommand cmd = con.CreateCommand() )
    {
        cmd.Transaction = trn;
        cmd.CommandType = CommandType.StoredProcedure;
        if ( Sql.IsOracle(cmd) )
            cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOff";
        else
            cmd.CommandText = "spATTACHMENTS_CONTENT_WriteOffset";
        IDbDataParameter parID               = Sql.AddParameter(cmd, "@ID"              , gID                );
        IDbDataParameter parFILE_POINTER     = Sql.AddParameter(cmd, "@FILE_POINTER"    , binFILE_POINTER    );
        IDbDataParameter parMODIFIED_USER_ID = Sql.AddParameter(cmd, "@MODIFIED_USER_ID",  Security.USER_ID  );
        IDbDataParameter parFILE_OFFSET      = Sql.AddParameter(cmd, "@FILE_OFFSET"     , nFILE_OFFSET       );
        IDbDataParameter parBYTES            = Sql.AddParameter(cmd, "@BYTES"           , byBYTES            );
        cmd.ExecuteNonQuery();
    }
}
Create Procedure dbo.spATTACHMENTS_CONTENT_WriteOffset
    ( @ID                   uniqueidentifier
    , @FILE_POINTER         binary(16)
    , @MODIFIED_USER_ID     uniqueidentifier
    , @FILE_OFFSET          int
    , @BYTES                image
    )
with encryption
as
  begin
    set nocount on

    -- 10/22/2005 Paul.  @ID is used in Oracle and MySQL. 
-- #if SQL_Server /*
    updatetext ATTACHMENTS_CONTENT.ATTACHMENT
               @FILE_POINTER
               @FILE_OFFSET
               null -- 0 deletes no data, null deletes all data from insertion point. 
               @BYTES;

谢谢。

由于您每行只上载一个文件,因此使用普通更新比不必要地摆弄指针和偏移要容易得多。该命令可以如此简单:

UPDATE ATTACHMENTS_CONTENT SET ATTACHMENT = @BYTES Where ID=@ID

我不确定您的ID字段是什么,所以我只写了一个ID,但我相信您可以用正确的ID替换它。

您还没有填写binFILE_POINTER[],所以它将充满零

我猜这就是:

*Invalid text, ntext, or image pointer value 0x00000000000000000000000000000000.*

来自…

我们可以看到存储过程的代码吗?当然可以,它已被更新。为什么只使用updatetext更新部分字段?为什么不把它换掉呢?好问题。这是前一个开发人员的过程。如果您有其他建议,请告知。但是,我不认为这是导致错误的原因。您建议我如何填写
binFILE\u POINTER[]
?谢谢,我使用了您答案的变体。@user1477388-很高兴能提供帮助:)