1

我有以下代码写入 SQL Server 数据库:

private void InsertResult(Result results, string messageId)
{
   object chkresult = (results);

   MemoryStream memStream = new MemoryStream();
   StreamWriter sw = new StreamWriter(memStream);

   sw.Write(chkresult);

   SqlConnection conn = new SqlConnection(WebConfigurationManager.ConnectionStrings["Reporting"].ConnectionString);

   using (conn)
   {
      using (SqlCommand cmd = new SqlCommand())
      {
         conn.Open();

         cmd.CommandText = "Results_Ins";
         cmd.CommandType = CommandType.StoredProcedure;
         cmd.Parameters.Add("@Id", SqlDbType.VarChar, 50).Value = messageId;
         cmd.Parameters.Add("@result", SqlDbType.VarBinary, Int32.MaxValue);
         cmd.Parameters["@result"].Value = memStream.GetBuffer();
         cmd.Parameters.Add("@RowCount", SqlDbType.Int).Direction = ParameterDirection.Output;

         cmd.Connection = conn;

         try
         {
             cmd.ExecuteNonQuery();
         }
         catch (Exception err)
         {
             // handle the error
             //messageInsert = false;
         }
         finally
         { 
             conn.Close(); 
         }
      }
   }

   //return rowCount;
}

当我执行此代码时,我得到 0x 存储在Result列中。我不确定这是否正确,因此我需要一些帮助。

基本上,我需要将完整的对象存储到 SQL Server 数据库表中的单个列中。

4

1 回答 1

1

您需要调用Flush或导致sw成为Closed 或Disposed 以确保它已完成写入memStream.

此外,GetBuffer您应该使用ToArray. GetBuffer返回一个内部缓冲区,该缓冲区可能大于实际写入的字节数。


你还应该改变这个:

catch (Exception err)
{
   // handle the error
   //messageInsert = false;
}

只捕获您有策略处理它们的特定异常。


而且,即使是现在,我也不认为它会如你所愿(你还没有真正阐明)。你的sw.Write电话所做的就是

通过调用该对象的ToString方法,将对象的文本表示形式写入文本字符串或流。

如果您希望发生实际的序列化,您将需要编写导致它发生的代码 - 在选择您想要执行二进制序列化还是xml序列化之后。

于 2013-07-04T13:53:51.980 回答