如何从SqlServer ASP.Net中读取VarBinary数据

本文关键字:读取 VarBinary 数据 Net ASP SqlServer | 更新日期: 2023-09-27 17:54:00

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

        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);

我已经找了很多,但仍然没有运气。上面的代码给我异常"无效读取,没有数据存在"。我还尝试了QueryManager来运行sql查询。

如何从SqlServer ASP.Net中读取VarBinary数据

您可以执行以下操作,将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;
    }