C# 如何从SQLServerASP.Net读取VarBinary数据

C# 如何从SQLServerASP.Net读取VarBinary数据,c#,asp.net,sql,sql-server,binary,C#,Asp.net,Sql,Sql Server,Binary,我在SqlServer字段中有一个二进制数据(MyClass的对象),但我无法检索二进制值并将其转换为我的Class对象。 我已经使用以下代码写入数据库 conn = getConnection(); MemoryStream memStream = new MemoryStream(); StreamWriter sw = new StreamWriter(memStream); sw.Write(sql); Sq

我在SqlServer字段中有一个二进制数据(MyClass的对象),但我无法检索二进制值并将其转换为我的Class对象。 我已经使用以下代码写入数据库

        conn = getConnection();
        MemoryStream memStream = new MemoryStream();
        StreamWriter sw = new StreamWriter(memStream);
        sw.Write(sql);
        SqlCommand sqlCmd = new SqlCommand(@"INSERT INTO PExercise(P_Enroll_No,P_Exercises,P_Date) VALUES (@VarEnroll,@VarBinary,@Date)", conn);
        sqlCmd.Parameters.Add("@VarEnroll",System.Data.SqlDbType.NVarChar,Int32.MaxValue);
        sqlCmd.Parameters["@VarEnroll"].Value = sql.getEnrollNo();
        sqlCmd.Parameters.Add("@VarBinary", System.Data.SqlDbType.VarBinary, Int32.MaxValue);
        sqlCmd.Parameters["@VarBinary"].Value = memStream.GetBuffer();
        sqlCmd.Parameters.Add("@Date",System.Data.SqlDbType.NVarChar,Int32.MaxValue);
        sqlCmd.Parameters["@Date"].Value = date;

        int success = sqlCmd.ExecuteNonQuery();
        closeConnection();
此代码成功地将我的数据写入表中。我使用以下代码从数据库中读取它。 请帮我查一下密码

            conn = getConnection();
            SqlCommand sqlCmd = new SqlCommand(@"Select P_Exercises from PExercise where P_Enroll_No='" + enrollNo + "' AND P_Date='"+date+"'", conn);
            SqlDataReader dr = sqlCmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);

            byte[] bytes = new byte[1024];
            long i = dr.GetBytes(0,0,bytes,0,1024*1024*8);


            System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            MemoryStream ms = new MemoryStream(bytes);
            ms.Position = 0;
            mc = (List<ExerciseDetails>)bf.Deserialize(ms);
conn=getConnection();
SqlCommand sqlCmd=new SqlCommand(@“从PExercise中选择P_练习,其中P_Enroll_No='”+enrollNo+”,P_Date='“+Date+”,conn);
SqlDataReader dr=sqlCmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);
字节[]字节=新字节[1024];
长i=dr.GetBytes(0,0,字节,01024*1024*8);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf=new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
MemoryStream ms=新的MemoryStream(字节);
ms.Position=0;
mc=(列表)bf.反序列化(ms);
我找了很多,但还是没有运气。 上面的代码给了我异常“无效读取,没有数据存在”。
我还尝试了QueryManager来运行sql查询。而且它在那里工作得很好。

您可以执行如下操作,即执行一个安全的ExecuteScaler,将其转换为字节数组。顺便说一下,请确保使用using语句包装实现IDisposable的对象,以便正确关闭和释放它们

   using (var cn = _db.CreateConnection())
   using (var cm = cn.CreateTextCommand(sql))
   {
       cm.AddInParam("name", DbType.String, name);
       cn.Open();
       var data = cm.ExecuteScalar() as byte[];
       return data;
    }