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

时间:2014-03-27 17:09:49

标签: c# asp.net sql sql-server binary

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

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

我搜索了很多但仍然没有运气。 上面的代码给出了例外情况&#34;无效读取,没有数据存在&#34;。 我也尝试过QueryManager来运行sql查询。并在那里工作正常。

1 个答案:

答案 0 :(得分:0)

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