我在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查询。并在那里工作正常。
答案 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;
}