日期:2014-05-20  浏览次数:20895 次

C#.NET使用SQLSERVER的IMAGE字段初探
本人使用VFP9编写有一套PDM文档管理系统,CS架构的,现在想往BS架构转移。SQL数据库中字符、数字类字段可以直接从WEB页中访问,2种架构共享了同一个数据库。但是,PDM文档都存放在了IMAGE和TEXT两种字段中,BS架构无法正确取出。

在VFP9中,提供有2个函数,StrToFile()和FileToStr(),实现字符与文件间的相互转换。在VFP中,为了将存储于SQLSERVER的文件下载到本地,要用FileToStr()将文件转换成字符,再保存到TEXT类型的字段中。

将文件直接读入IMAGE类型字段中,不需要用函数。可以用OLE的方式,直接在VFP中打开文件对象。

在C#.NET中,不能这样。
通过
  var cFileName = @"D:\CAXA.XLS";//D:\CAXA.EXB PICAD.DRF
  var cFieldName = "imgfield";//imgfield

  SqlConnection con = new SqlConnection(qjbl.gcConString);
  SqlDataAdapter da = new SqlDataAdapter("Select focusmyid,imgfield From focusmy where focusmyid=11", con);
  SqlCommandBuilder MyCB = new SqlCommandBuilder(da);//必须要
  DataSet ds = new DataSet("MyImages");

  da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
  FileStream fs = new FileStream(cFileName, FileMode.OpenOrCreate, FileAccess.Read);

  byte[] MyData = new byte[fs.Length];
  fs.Read(MyData, 0, System.Convert.ToInt32(fs.Length));

  fs.Close();

  da.Fill(ds, "MyImages");

  var row0 = ds.Tables["MyImages"].Rows[0];
  row0[cFieldName] = MyData;
  da.Update(ds, "MyImages");

  con.Close();
可以将文件上传到IMAGE类型的字段中。

通过
  var cFileName = @"D:\FFFF.XLS";//D:\FFFF.EXB DRF
  var cFieldName = "imgfield";

  SqlConnection con = new SqlConnection(qjbl.gcConString);
  SqlDataAdapter da = new SqlDataAdapter("Select * From focusmy where focusmyid=11", con);
  SqlCommandBuilder MyCB = new SqlCommandBuilder(da);
  DataSet ds = new DataSet("MyImages");

  byte[] MyData = new byte[0];

  da.Fill(ds, "MyImages");
  DataRow myRow;
  myRow = ds.Tables["MyImages"].Rows[0];

  MyData = (byte[])myRow[cFieldName];
  int ArraySize = new int();
  ArraySize = MyData.GetUpperBound(0);

  FileStream fs = new FileStream(cFileName, FileMode.OpenOrCreate, FileAccess.Write);
  fs.Write(MyData, 0, ArraySize);
  fs.Close();
可以下载文件到本地。


但是,下载程序只能保证 用C#上传的文件可以被下载后正确打开。
而用VFP上传的同一个字段,下载后,文件很大,且文件格式错误,不能打开。

对于TEXT字段,只能保存为文本文件。

所以,虽然同样是IMAGE字段,但是用不同语言编写的程序存入的内容是不一样的,不通用的。

各位高手如有类似需求且实现了不同架构语言间数据共享的功能,请不吝赐教。

------解决方案--------------------
随便回复一下,我要结贴啊