将数据表存储和检索到 Varbinary 列中

出于某种原因,我不得不将 DataTable 变量存储在 SQL Server 表的 Varbinary 列中,但出现错误。

这是商店代码:

// Read DataTable to Byte array
DataTable dtgrd = new DataTable();
Dataaccess ds = new Dataaccess();
DataSet dst = new DataSet();
dst.Tables.Add(dtgrd);

string xmlString = dst.GetXml();
MemoryStream ms = new MemoryStream();
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlString);
xml.Save(ms);

byte[] xmlBytes = ms.ToArray();

// Store DataTable into database
SqlConnection CN = new SqlConnection(Global.cs);
string str = @"INSERT INTO...... ";

SqlCommand SqlCom = new SqlCommand(str,CN);
SqlCom.Parameters.Add(new SqlParameter("@FKDocInReqID",FKDocInReqID));
SqlCom.Parameters.Add(new SqlParameter("@value",(object)xmlBytes));
SqlCom.Parameters.Add(new SqlParameter("@Data",ReportTitle));
SqlCom.Parameters.Add(new SqlParameter("@DocUploadUser_secuserID",Global.S_UserID));

CN.Open();
decimal id =(decimal) SqlCom.ExecuteScalar();
CN.Close();

商店代码工作正常,并且在数据库中,列具有正确的字节。

但检索代码不起作用:

 string s = @"select * from .... where id={0} ";
 s = string.Format(s,id);

 DataTable dt = new DataTable();
 dt = ds.doSelect(s);

 using (System.IO.MemoryStream memStream1 = new System.IO.MemoryStream((byte[])dt.Rows[0]["Value"]))
 {
     dataGridView1.DataSource = FromBytes(memStream1.ToArray());
     dataGridView1.Refresh();
     dataGridView1.Show();
 }

static DataTable FromBytes(byte[] arr)
    {
        using (var ms = new MemoryStream(arr))
        {
            return (DataTable)new BinaryFormatter().Deserialize(ms);//**ERROR Raised Here**
        }
    }
static byte[] ToBytes(DataTable table)
    {
        using (var ms = new MemoryStream())
        {
            table.RemotingFormat = SerializationFormat.Binary;
            new BinaryFormatter().Serialize(ms,table);
            return ms.ToArray();
        }
    }

引发此错误:

error message

clOUdland619 回答:将数据表存储和检索到 Varbinary 列中

loc 使用 XmlTextReader

static DataTable FromBytes(Stream st)
{
    var ds = new DataSet();
    using (XmlTextReader xmlReader = new XmlTextReader(st))
    {  
        ds.ReadXml(xmlReader);
    }
    return ds.Tables[0];
}

我会让您思考将一张桌子放在另一张桌子中的明显设计缺陷。

,

我就是这样解决这个问题的,也许对其他人有帮助。 而不是将数据保存到 Varbinary 字段中,而是将其保存到 nvarchar(max) 中的 xml,然后检索它:

//Retrieve Process:
string s = @"select * from .... where id={0} ";
s = string.Format(s,ID);
DataTable dtlist = new DataTable();
DataAccess ds = new DataAccess();
dtlist = ds.doSelect(s);//doselect is function that run select sql command

XmlDocument xml = new XmlDocument();
xml.LoadXml(dtlist.Rows[0]["Data"].ToString());//data is column name that store xml in it
StringReader theReader = new StringReader(xml.InnerXml);
DataSet theDataSet = new DataSet();
theDataSet.ReadXml(theReader);

gridEX1.DataSource = theDataSet.Tables[0];
本文链接:https://www.f2er.com/43979.html

大家都在问