Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么bytes.length=0?_C#_Asp.net_Binary_Webforms - Fatal编程技术网

C# 为什么bytes.length=0?

C# 为什么bytes.length=0?,c#,asp.net,binary,webforms,C#,Asp.net,Binary,Webforms,我不知道如何调试这个。我试图将一个文件上传到我的数据库中(通过将二进制文件内容读入我的存储过程)。我将输入流传递给我的方法,如下所示: LoadFile(gAttachmentContentID, file.InputStream, trn); 这是我的方法: public static void LoadFile(Guid gAttachmentContentID, Stream stm, IDbTransaction trn) {

我不知道如何调试这个。我试图将一个文件上传到我的数据库中(通过将二进制文件内容读入我的存储过程)。我将输入流传递给我的方法,如下所示:

LoadFile(gAttachmentContentID, file.InputStream, trn);
这是我的方法:

    public static void LoadFile(Guid gAttachmentContentID, Stream stm, IDbTransaction trn)
            {
                const int BUFFER_LENGTH = 40 * 1024;
                byte[] binFILE_POINTER = new byte[32];
                //Testing check out check in
                // 01/20/2006 Paul.  Must include in transaction
                SqlProcs.spATTACHMENTS_CONTENT_InitPointer(gAttachmentContentID, ref binFILE_POINTER, trn);

                using (BinaryReader reader = new BinaryReader(stm))
                {
                    int nFILE_OFFSET = 0;
                    byte[] binBYTES = reader.ReadBytes(BUFFER_LENGTH);
                    Debug.Print("binBYTES=" + binBYTES.Length.ToString());
                    while (binBYTES.Length > 0)
                    {
                        // 08/14/2005 Paul.  gID is used by Oracle, binFILE_POINTER is used by SQL Server. 
                        // 01/20/2006 Paul.  Must include in transaction
                        SqlProcs.spATTACHMENTS_CONTENT_WriteOffset(gAttachmentContentID, binFILE_POINTER, nFILE_OFFSET, binBYTES, trn);
                        nFILE_OFFSET += binBYTES.Length;
                        binBYTES = reader.ReadBytes(BUFFER_LENGTH);
                    }
                }
            }
为什么
binBYTES.length=0
?如何调试这种类型的东西?

编辑:

我现在正在使用此功能:

    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();
            }
        }
但我得到了以下错误:

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

谢谢。

这表明你已经到达了终点。从:

从ReadBytes返回的字节数组长度为零时,将检测到正在读取的文件的结尾


就我个人而言,我根本不会在这里创建一个
BinaryReader
:我会创建一个可以重用的单字节数组,然后反复调用
Stream.Read
(并复制数据)直到返回0,表示已到达流的末尾。

表示已到达流的末尾。从:

从ReadBytes返回的字节数组长度为零时,将检测到正在读取的文件的结尾


就我个人而言,我根本不会在这里创建一个
BinaryReader
:我会创建一个可以重用的单字节数组,只需调用
Stream。反复读取(并复制数据),直到返回0表示它已到达流的末尾。

我添加了这段代码,现在可以正常工作了:

IDbConnection con=trn.连接; 使用(IDbCommand cmd=con.CreateCommand()) { cmd.Transaction=trn

            cmd.CommandText = "UPDATE ATTACHMENTS_CONTENT SET ATTACHMENT = @BYTES Where ID=@ID";

            // 2. define parameters used in command object
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@BYTES";
            param.Value = bytes;
            cmd.Parameters.Add(param);

            // 2. define parameters used in command object
            SqlParameter param2 = new SqlParameter();
            param2.ParameterName = "@ID";
            param2.Value = gAttachmentContentID;
            cmd.Parameters.Add(param2);

            cmd.ExecuteNonQuery();
        }

我添加了此代码,现在可以正常工作了:

IDbConnection con=trn.连接; 使用(IDbCommand cmd=con.CreateCommand()) { cmd.Transaction=trn

            cmd.CommandText = "UPDATE ATTACHMENTS_CONTENT SET ATTACHMENT = @BYTES Where ID=@ID";

            // 2. define parameters used in command object
            SqlParameter param = new SqlParameter();
            param.ParameterName = "@BYTES";
            param.Value = bytes;
            cmd.Parameters.Add(param);

            // 2. define parameters used in command object
            SqlParameter param2 = new SqlParameter();
            param2.ParameterName = "@ID";
            param2.Value = gAttachmentContentID;
            cmd.Parameters.Add(param2);

            cmd.ExecuteNonQuery();
        }

Jon,你能给我一个例子吗?我对C#中的文件有点陌生。谢谢。@user1477388:我建议你自己花点时间尝试一下,把代码编辑成问题。这样你会学到更多。(看Stream的文档。阅读作为起点。)Jon,我接受了你的建议,并尝试自己研究这个问题。但是,我得到了错误
无效文本、ntext或图像指针值0x00000000000000。
。我发布了我的全部代码,你认为你可能没有什么错吗?@user1477388:你只是在循环外调用你的
write
方法,所以你是los除了最后几个字节的数据外,所有的数据都将被复制。老实说,现在还不清楚你是如何编写的——如果你需要一次完成所有的工作,你可以先复制到
内存流
,然后在最后调用
到数组
。乔恩,我很困惑。如果你能给我一个例子,让我朝着正确的方向前进,我会很困惑这将非常有帮助。Jon,你能给我提供一个示例吗?我对C#中的文件有点陌生。谢谢。@user1477388:我建议你自己花点时间尝试一下,并将代码编辑到问题中。这样你会学到更多。(请看Stream的文档。阅读作为起点。)Jon,我接受了你的建议,并尝试自己研究这个问题。但是,我得到了错误
无效文本、ntext或图像指针值0x00000000000000。
。我发布了我的全部代码,你认为你可能没有什么错吗?@user1477388:你只是在循环外调用你的
write
方法,所以你是los除了最后几个字节的数据外,所有的数据都将被复制。老实说,现在还不清楚你是如何编写的——如果你需要一次完成所有的工作,你可以先复制到
内存流
,然后在最后调用
到数组
。乔恩,我很困惑。如果你能给我一个例子,让我朝着正确的方向前进,我会很困惑这将非常有帮助。