2011-02-07 37 views
1

我在mysql数据库(在我的桌面)有一些照片(不大,只有8kb)。字段类型是blob。实际上我想将表格导出为xml文件,然后将其上传到我的数据库网站。但失败了。我尝试通过将表导出到xml文件然后将其导回到另一个表来模仿它(表的结构相同)。我可以做到,但我没有得到相同的照片(只有一些编码文本)。下面是一些代码片段:将mysql blob导出到xml,然后导入回不在d中得到相同的结果#

导出表为xml:

FileStream fs = new FileStream(filename,FileMode.Create,FileAccess.Write,FileShare.None); 
StreamWriter sw = new StreamWriter(fs,Encoding.ASCII); 
ds.WriteXml(sw); //write the xml from the dataset ds 

导入XML到数据集:

FileStream fs = new FileStream(filename,FileMode.Open); 
DataSet ds = new DataSet(); 
ds.ReadXml(fs); 

写入数据集到另一个表:

... 
    int count = ds.Tables[0].Rows.Count; 
    for(int i=0;i<count;i++) 
    { 
     DataRow myDR = ds.Tables[0].Rows[i]; 
     ... 
     byte[] myphoto = null; 
     if(myDR["myphoto"].ToString().Length > 0) 
     { 
      myphoto = Encoding.ASCII.GetBytes(myDR["myphoto"].ToString().ToCharArray()); 
     } 
     //insert the data to the mysql table 
     ... 
    } 
    ... 

为什么我不能在这张另一张桌子上看到相同的照片?
对不起我的英文不好。

回答

1

看着这样的:

myphoto = Encoding.ASCII.GetBytes(myDR["myphoto"].ToString().ToCharArray()); 

你是治疗任意的二进制数据作为编码文本;即不能工作。 Encoding旨在将文本数据转换为二进制(具有给定的文本格式,即编码),并将二进制(具有给定的文本格式)变成文本;它不能作为文本对待任意的二进制文件(即不是预期的格式)。作为一个简单的例子,A​​SCII只使用每个八位字节的7位;任何MSB设置的八位字节在这个周期的某个时刻保证会被破坏。

如果你想表示二进制数据作为字符串,基数为64:

string s = Convert.ToBase64String(blob); 

转换回:

byte[] blob = Convert.FromBase64String(s); 
+0

嗨马克,感谢您的回答。但我从数据集中直接写入xml。如何应用转换器? – satria 2011-02-07 06:59:49