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字段,但是用不同语言编写的程序存入的内容是不一样的,不通用的。
各位高手如有类似需求且实现了不同架构语言间数据共享的功能,请不吝赐教。
------解决方案--------------------随便回复一下,我要结贴啊