2013开发服务器端和客户端程序的开发环境搭配C# .NET

通过一段时间的学习,工作,对于C#开发人员来说,2013年比较好的开发环境搭配为:

开发客户端软件:VS2010 C# + .NET 2.0 + 桌面数据库

开发服务器端程序:VS2010 C# + .NET 4.0 + MSSQL2005

大型软件开发:VS2010 C# + .NET 4.0 + MSSQL2008

.NET 2.0对于开发本地客户端程序好处很多,我们知道通过VS的C#开发的.NET环境下的软件必须在客户端安装.NET框架,如果不安装程序是无法运行的,2.0其框架程序集只有22MB左右,打包后的程序很小,易于客户端安装和使用,安装过程比较省时,另外,工作中对于客户端为.NET3.5环境的WIN7系统的32位和64位也做了较全面的测试,通过.NET2.0开发的程序,基本上在3.5环境下运行无问题,只不过在开发过程中一些类的使用要注意兼容性问题,最终我们认为在VS2010环境下使用.NET2.0框架开发出来的客户端程序(应用软件)可以得到广泛的应用,对于XP SP1 SP2 SP3 VISIT 7 8系统的兼容性都是不错的,另外,根据调查,XP SP3和WIN7用户的占有率最高,其XP SP3用户已经安装了.NET2.0框架的占有率为70%以上,因此基本上开发出来的应用程序无论安装或运行,都很顺畅。

之前也开发了基于.NET 4.0的客户端程序,但其.NET框架有44MB左右大小,对于客户端计算机安装来说,比较麻烦,安装框架的时间也很长,但对于开发WEB服务器端程序来说,还是很不错的选择。现在市场上大部分的虚拟主机都支持.NET 4.0了,而且在VPS盛行的时代来说,在服务器端安装一个框架也不是什么大问题,并且.NET4.0框架对于WINDOWS SERVER 2003来说,其兼容性表现的也不错。

在数据库选择方面,客户端程序还是桌面数据库比较合适,维护,开发成本以及对于客户的用户体验也很好,而WEB服务器端程序还是选择MSSQL2005比较合适,我们知道,MSSQL是很吃内存的,现在大部分WEB主机都在使用2005版本,而我们发现2000版本的MSSQL也还是主流,当然,对于大型程序的应用开发还是支持MSSQL2008的,那么整个投资成本也会提高。

针对VS2012版本我们也做了测试,不全面,但感觉还是目前还是没有必要。 

DataSet和DataTable

每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(Column Name)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序 (DataView)信息组成。

DataView用来在观察数据时提供排序和过滤的功能。DataColumn用来对表中的数据值进行一定的规限。比如哪一列数据的默认值是什么、哪一列数据值的范围是什么、哪个是主键、数据值是否是只读等。

由于一个DataSet可能存在多张表,这些表可能存在关联关系,因此用parentRelations和childRelations来表述。 ParentRelations表是父表,childRelations是子表,子表是对父表的引用,这样就使得一个表中的某行与另一个表中的某一行甚至 整个表相关联。

1.DataTableCollection 类

表示 DataSet 的表的集合。

DataTableCollection dtc = ds.Tables;

DataTable customerTable = dtc["Product"];

2.DataTable进行动态的筛选和排序

调用DataTable.Select()方法,获取 DataRow 对象的数组。

(1)获取所有行。

DataRow[] rows = dt.Select();

(2)按主键顺序(如没有主键,则按照添加顺序)获取符合筛选条件的行。

DataRow[] rows = dt.Select("ID>52");

(3)获取符合筛选条件的行,并按指定的排序条件排序。

DataRow[] rows = dt.Select("ID>52","ID DESC");

(4)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。

string strExpr = "ID>52";

string strSort = "ID DESC";

DataRow[] foundRows = dt.Select(strExpr, strSort, DataViewRowState.OriginalRows);

3.DataTable进行数据统计

我们在使用SQL Server时,可以轻松地对数据进行Sum、Aver、Count等操作以获得统计结果,那么,在已经把数据检索出来的 DataSet(DataTable)中如何进行统计呢?特别是通过第三方接口Web Service获得了DataSet,这个时候,没有办法去执行Select语句来获取这些统计,怎么办呢?

办法总比问题多,其实在DataTable中也是可以进行数据统计的。

下面就通过几个简单的示例,介绍一下如何无须通过逐条记录进行计算就可以轻松地获得DataTable中的记录统计结果。这里调用的是功能强大的DataTable的函数Compute。

(1)函数说明:

public object Compute(string strExpression,string strFilter);

l strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。

l strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计。

(2)调用示例。

假设一个产品销售表P_Sell,描述商场中各销售人员的销售记录,如表5-2所示。

表5-2 产品销售表

 

序号

列名

数据类型

长度

主键

允许空

说明

1

ID

int

4

流水号

2

Name

varchar

50

姓名

3

Sex

smallint

2

性别:0为女,1为男

4

Birthday

datetime

8

生日

5

ProductId

varchar

20

销售产品代码

6

Num

int

4

销售的数量

7

Price

decimal

9

销售价格

l 统计所有性别为女的销售员的数量:

object n = table.Compute("count(ID)", "Sex = 0");

l 统计所有年龄大于20岁的销售员的数量:

int c=(int)table.Compute("count(ID)",

"Birthday<'" DateTime.Today.AddYears(-20) "'");

l 统计销售产品的平均价格:

decimal ap=(decimal)table.Compute("avg(Price)", "true");

l 统计产品代码为1的产品销售数量:

object m = table.Compute("sum(Num)", "ProductId='sj'");

l 统计所有产品的销售总金额:要统计销售总金额,table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如table.Compute("Sum(Quantity*Price)","true");。

这里有一个问题是,DataTable的统计功能没有SqlServer强大,这个写法是错误的! 因为Compute的统计不具备Sum(Quantity*Price)这样的数据的功能。那怎么办呢?

对于这样复杂数据的统计,我们可以通过在DataTable中创建一个新的DataColumn来完成,比如为“total”,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了。

DataColumn dc = new DataColumn("total", Type.GetType("System.Decimal"));

dc.Expression = "Num*Price";

table.Columns.Add(dc);

object s=table.Compute("sum(total)", "true");

当然,这个功能也可以通过 DataGrid增加一个模板列,在ItemDataBind事件里实现计算。

4.合并两个DataTable表的数据

DataTable dt1 = ds.Tables[0];

DataTable dt2 = ds.Tables[1];

dt1.Merge(dt2, true, MissingSchemaAction.AddWithKey);

5.DataView 类

(1)得到DataView。

DataView dv = ds.Tables[0].DefaultView;

//或

DataView dv = new DataView(ds.Tables["Product"], "ID > 52", "ID DESC",

DataViewRowState.CurrentRows);

(2)得到DataView的行数据。

foreach (DataRowView rowview in dv)

{

for (int i = 0; i < dv.Table.Columns.Count; i )

{

Response.Write(rowview[i] "<br>");

}

}

(3)对结果集过滤排序。

DataView dv = ds.Tables[0].DefaultView;

dv.RowFilter = "ID > 52";

dv.Sort = "ID DESC";

int c = dv.Count;

if (c > 51)

{

for (int n = 50; n < c; n )

{

dv.Delete(n);

}

}

this.DataGrid1.DataSource = dv;

DataSet 详细操作和统计数据

每一个DataSet都是一个或多个DataTable 对象的集合(DataTable相当于数据库中的表),这些对象由数据行(DataRow)、数据列(DataColumn)、字段名(Column Name)、数据格(Item),以及约束(Constraint)和有关DataTable对象中数据的关系(Relations)与数据显示排序(DataView)信息组成。

DataView用来在观察数据时提供排序和过滤的功能。DataColumn用来对表中的数据值进行一定的规限。比如哪一列数据的默认值是什么、哪一列数据值的范围是什么、哪个是主键、数据值是否是只读等。

由于一个DataSet可能存在多张表,这些表可能存在关联关系,因此用parentRelations和childRelations来表述。ParentRelations表是父表,childRelations是子表,子表是对父表的引用,这样就使得一个表中的某行与另一个表中的某一行甚至整个表相关联。

1.DataTableCollection 类

表示 DataSet 的表的集合。

DataTableCollection dtc = ds.Tables;

DataTable customerTable = dtc["Product"];

2.DataTable进行动态的筛选和排序

调用DataTable.Select()方法,获取 DataRow 对象的数组。

(1)获取所有行。

DataRow[] rows = dt.Select();

(2)按主键顺序(如没有主键,则按照添加顺序)获取符合筛选条件的行。

DataRow[] rows = dt.Select("ID>52");

(3)获取符合筛选条件的行,并按指定的排序条件排序。

DataRow[] rows = dt.Select("ID>52","ID DESC");

(4)获取符合筛选条件和指定状态的行,并按指定的排序条件排序。

string strExpr = "ID>52";

string strSort = "ID DESC";

DataRow[] foundRows = dt.Select(strExpr, strSort, DataViewRowState.OriginalRows);

3.DataTable进行数据统计

我们在使用SQL Server时,可以轻松地对数据进行Sum、Aver、Count等操作以获得统计结果,那么,在已经把数据检索出来的DataSet(DataTable)中如何进行统计呢?特别是通过第三方接口Web Service获得了DataSet,这个时候,没有办法去执行Select语句来获取这些统计,怎么办呢?

办法总比问题多,其实在DataTable中也是可以进行数据统计的。

下面就通过几个简单的示例,介绍一下如何无须通过逐条记录进行计算就可以轻松地获得DataTable中的记录统计结果。这里调用的是功能强大的DataTable的函数Compute。

(1)函数说明:

public object Compute(string strExpression,string strFilter);

l         strExpression:要计算的表达式字符串,基本上类似于Sql Server中的统计表达式。

l         strFilter:统计的过滤字符串,只有满足这个过滤条件的记录才会被统计。

(2)调用示例。

假设一个产品销售表P_Sell,描述商场中各销售人员的销售记录,如表5-2所示。

表5-2  产品销售表

序号

列名

数据类型

长度

主键

允许空

说明

1

ID

int

4

流水号

2

Name

varchar

50

姓名

3

Sex

smallint

2

性别:0为女,1为男

4

Birthday

datetime

8

生日

5

ProductId

varchar

20

销售产品代码

6

Num

int

4

销售的数量

7

Price

decimal

9

销售价格

l         统计所有性别为女的销售员的数量:

object n = table.Compute("count(ID)", "Sex = 0");

l         统计所有年龄大于20岁的销售员的数量:

int c=(int)table.Compute("count(ID)",

                  "Birthday<'" DateTime.Today.AddYears(-20) "'");

l         统计销售产品的平均价格:

decimal ap=(decimal)table.Compute("avg(Price)", "true");

l         统计产品代码为1的产品销售数量:

object m = table.Compute("sum(Num)", "ProductId='sj'");

l         统计所有产品的销售总金额:要统计销售总金额,table中不存在某项产品某个促销员销售的金额数据,但我们可以通过Quantity*Price来获得。比如table.Compute("Sum(Quantity*Price)","true");。

这里有一个问题是,DataTable的统计功能没有SqlServer强大,这个写法是错误的! 因为Compute的统计不具备Sum(Quantity*Price)这样的数据的功能。那怎么办呢?

对于这样复杂数据的统计,我们可以通过在DataTable中创建一个新的DataColumn来完成,比如为“total”,同时设置该字段的Expression为Quantity*Price,这样我们就可以使用统计功能了。

DataColumn dc = new DataColumn("total", Type.GetType("System.Decimal"));

dc.Expression = "Num*Price";

table.Columns.Add(dc);           

object s=table.Compute("sum(total)", "true");

当然,这个功能也可以通过 DataGrid增加一个模板列,在ItemDataBind事件里实现计算。

4.合并两个DataTable表的数据

DataTable dt1 = ds.Tables[0];

DataTable dt2 = ds.Tables[1];

dt1.Merge(dt2, true, MissingSchemaAction.AddWithKey);

5.DataView 类

(1)得到DataView。

DataView dv = ds.Tables[0].DefaultView;

//或

DataView dv = new DataView(ds.Tables["Product"], "ID > 52", "ID DESC",

DataViewRowState.CurrentRows);

(2)得到DataView的行数据。

foreach (DataRowView rowview in dv)

{

    for (int i = 0; i < dv.Table.Columns.Count; i )

    {

        Response.Write(rowview[i] "<br>");

    }   

}

(3)对结果集过滤排序。

DataView dv = ds.Tables[0].DefaultView;

dv.RowFilter = "ID > 52";

dv.Sort = "ID DESC";

int c = dv.Count;

if (c > 51)

{

    for (int n = 50; n < c; n )

    {

        dv.Delete(n);

    }

}

this.DataGrid1.DataSource = dv;

c# combobox 绑定数据库 dataset 中多字段值

我们想将ComboBox中绑定数据库中多个字段的值,或者说多表关联的值,操作如下:

先写一个方法如下:这个方法是将数据库绑定ComboBox

public void getGoodsAdd()
        {
            string str = "select * from Mn_Goods";
            DataSet dsclass = new DataSet();
            database da = new database();
            string tableName = "Goods";
            dsclass = da.getlist(str, tableName);  //注意这个getlist方法是在数据访问层,至于如何把数据绑定到DataSet这里不做过多解释
            this.indexCbGoodsAdd.DataSource = dsclass.Tables[tableName]; //绑定DATASET到COMBOBOX控件上
        this.indexCbFatherAdd.ValueMember = "ID"; //ID号
        }

下面是操作ComboBox的Format事件:

private void indexCbGoodsAdd_Format(object sender, ListControlConvertEventArgs e)
        {
            DataRowView myDataRowView = (DataRowView)(e.ListItem);  
            if (myDataRowView != null) 
            { 
                e.Value = String.Format("{0} | {1} | {2}",myDataRowView["字段名1"],myDataRowView["字段名2"],myDataRowView["字段名3"]); 



                //e.Value =    String.Format("{0} - {1} - {2:yyyy/MM/dd} - {3:NT$#,##000}",    myDataRowView["姓名"],    myDataRowView["性别"],    myDataRowView["出生日期"],    myDataRowView["目前薪资"]); }  //这段代码和上面是重复的,放在这里说明一下日期和RMB货币的表现方法

            }
        }

另外还是有一种方法如下:

private void CH3_DemoForm029_Load(object sender, EventArgs e)
{ 
     this.culturesCB.ValueMember = "LCID"; 
     this.culturesCB.DataSource =   CultureInfo.GetCultures(CultureTypes.FrameworkCultures);
}
private void culturesCB_Format(object sender, ListControlConvertEventArgs e)
{  
     CultureInfo ci = (CultureInfo)(e.ListItem);  
     if (ci != null) 
     {  
          e.Value = String.Format("{0} : {1}", ci.IetfLanguageTag, ci.DisplayName); 
     }
}

c# openFileDialog打开图片文件 获取路径 在picturebox中显示图片

private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            //ofd.Title = "打开(Open)";
            //ofd.FileName = "";
            //ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
            //ofd.Filter = "XML文件(*.xml)|*.xml";
            //ofd.ValidateNames = true;     //文件有效性验证ValidateNames,验证用户输入是否是一个有效的Windows文件名
            //ofd.CheckFileExists = true;  //验证路径有效性
            //ofd.CheckPathExists = true; //验证文件有效性
            //ofd.ShowDialog();


----------------------以上是一个代码片段 和下面部分无关------------------------------

            //实例化一个OpenFileDialog对象
            System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();
            //打开的文件类型
            openFileDialog.Filter = "JPG files (*.JPG)|*.JPG|BMP files (*.BMP)|*.BMP";
            //默认打开第一种文件类型
            openFileDialog.FilterIndex = 1;

            string strFile = ""; //获取到的文件名称(绝对路径)
            string strDiy = ""; //获取到的文件所在目录路径(绝对路径)

        //如果确认打开文件后发生的事件
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                strFile = openFileDialog.FileName.ToString();
                string fullNameNotExtName = System.IO.Path.GetFileNameWithoutExtension(strFile);

                strDiy = System.IO.Path.GetDirectoryName(strFile);
                //FileInfo fi = new FileInfo(strFile);

                System.Drawing.Image image = Image.FromFile(strFile);
                this.pictureBox1.Image = image;

                MemoryStream ms = new MemoryStream();
                image.Save(ms, image.RawFormat);
                byte[] serializedObject = ms.GetBuffer();

                Imgname = this.comboBox1.Text = fullNameNotExtName.Trim();
                Imgpath = strFile.Trim();
                Imgcode = serializedObject;

                ms.Close();

                this.comboBox1.Enabled = false;


                openFileDialog.OpenFile().Close();
                openFileDialog.OpenFile().Flush();
            }

        }

(1)复制该文件到image (C# 把文件拷贝到指定文件夹 )

if(!System.IO.Directory.Exists(@"d:\你程序\imgage"))  
{  
// 目录不存在,建立目录  
System.IO.Directory.CreateDirectory(@"d:\你程序\imgage");  
}

String sourcePath = "e:\\源文件目录\\图片文件";

String targetPath = "d:\你程序\imgage";

bool isrewrite=true; // true=覆盖已存在的同名文件,false则反之

System.IO.File.Copy(sourcePath, targetPath, isrewrite);

(2)得到本地路径文件

string fullNameNotExtName = System.Windows.Forms.Application.StartupPath.ToString() + "\\images" + 图片名称;

c# 获取当前路径

Winform获取应用程序的当前路径的方法集合,具体如下,值得收藏

//获取当前进程的完整路径,包含文件名(进程名)。
string str = this.GetType().Assembly.Location;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取新的Process 组件并将其与当前活动的进程关联的主模块的完整路径,包含文件名(进程名)。
string str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。
string str = System.Environment.CurrentDirectory;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取当前 Thread 的当前应用程序域的基目录,它由程序集冲突解决程序用来探测程序集。
string str = System.AppDomain.CurrentDomain.BaseDirectory;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

//获取和设置包含该应用程序的目录的名称。
string str = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
result: X:\xxx\xxx\ (.exe文件所在的目录+"\")

//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str = System.Windows.Forms.Application.StartupPath;
result: X:\xxx\xxx (.exe文件所在的目录)

//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str = System.Windows.Forms.Application.ExecutablePath;
result: X:\xxx\xxx\xxx.exe (.exe文件所在的目录+.exe文件名)

//获取应用程序的当前工作目录(不可靠)。
string str = System.IO.Directory.GetCurrentDirectory();
result: X:\xxx\xxx (.exe文件所在的目录)

一、获取当前文件的路径

1.   System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

     获取模块的完整路径,包括文件名。

2.   System.Environment.CurrentDirectory

     获取和设置当前目录(该进程从中启动的目录)的完全限定目录。

3.   System.IO.Directory.GetCurrentDirectory()

     获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:\www里,这个函数有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有时不一定返回什么东东,这是任何应用程序最后一次操作过的目录,比如你用Word打开了E:\doc\my.doc这个文件,此时执行这个方法就返回了E:\doc了。

4. System.AppDomain.CurrentDomain.BaseDirectory

     获取程序的基目录。

5. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase

     获取和设置包括该应用程序的目录的名称。

6. System.Windows.Forms.Application.StartupPath

     获取启动了应用程序的可执行文件的路径。效果和2、5一样。只是5返回的字符串后面多了一个"\"而已

7. System.Windows.Forms.Application.ExecutablePath

     获取启动了应用程序的可执行文件的路径及文件名,效果和1一样。

二、操作环境变量

利用System.Environment.GetEnvironmentVariable()方法可以很方便地取得系统环境变量,如:

System.Environment.GetEnvironmentVariable("windir")就可以取得windows系统目录的路径。

以下是一些常用的环境变量取值:

System.Environment.GetEnvironmentVariable("windir");

System.Environment.GetEnvironmentVariable("INCLUDE");

System.Environment.GetEnvironmentVariable("TMP");

System.Environment.GetEnvironmentVariable("TEMP");

System.Environment.GetEnvironmentVariable("Path");

最后贴出我进行上面操作获得的变量值,事先说明,本人是编写了一个WinForm程序,项目文件存放于D:\Visual Studio Projects\MyApplication\LifeAssistant,编译后的文件位于D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug,最后的结果如下:

1、 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\LifeAssistant.exe

2、System.Environment.CurrentDirectory=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug

3、System.IO.Directory.GetCurrentDirectory()=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug

4、System.AppDomain.CurrentDomain.BaseDirectory=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\

5、 System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\

6、System.Windows.Forms.Application.StartupPath=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug

7、System.Windows.Forms.Application.ExecutablePath=D:\Visual Studio Projects\MyApplication\LifeAssistant\bin\Debug\LifeAssistant.exe

System.Environment.GetEnvironmentVariable("windir")=C:\WINDOWS

System.Environment.GetEnvironmentVariable("INCLUDE")=C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\include\

System.Environment.GetEnvironmentVariable("TMP")=C:\DOCUME~1\zhoufoxcn\LOCALS~1\Temp

System.Environment.GetEnvironmentVariable("TEMP")=C:\DOCUME~1\zhoufoxcn\LOCALS~1\Temp

System.Environment.GetEnvironmentVariable("Path")=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\jdk1.5.0\bin;C:\MySQLServer5.0\bin;C:\Program Files\Symantec\pcAnywhere\;C:\Program Files\Microsoft SQL Server\80\Tools\BINN

c# winform读取access数据库中的二进制图片

private void ReadImage()
        {
            System.Data.OleDb.OleDbConnection dbConnection = new System.Data.OleDb.OleDbConnection();
            dbConnection.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + "\\DB.mdb;Persist Security Info=True";
            dbConnection.Open();
            System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand("select * from tb_images",dbConnection);
            System.Data.OleDb.OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            if (reader.Read())
            {
                System.IO.MemoryStream ms = new System.IO.MemoryStream((byte[])reader[1]);
                this.BackgroundImage = Image.FromStream(ms);
            }
            reader.Close();
            dbConnection.Close();
        }

c# winform下sql图片二进制存储/读取/显示/写入XML/读取XML

//存储

        private void MemoryImage()
        {
            string sql = "";
            //string conn = "Provider=SQLNCLI;Data Source=192.168.0.9,1433;Database=WebDown;UID=sa;PWD=111122;";

            Stream ms;
            byte[] picbyte;
            OpenFileDialog fdSelectPic = new OpenFileDialog();
            if (ofdSelectPic.ShowDialog() == DialogResult.OK)
            {
                if ((ms = ofdSelectPic.OpenFile()) != null)
                {
                    picbyte = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(picbyte, 0, Convert.ToInt32(ms.Length));

                    //连接数据库
                    SqlConnection conn = new SqlConnection();
                    conn.ConnectionString = "Data Source=192.168.0.9,1433;Database=WebDown;UID=sa;PWD=111122;";

                    sql = "Insert into LibraryCover(Cover) values(@UpdateImage)";
                    SqlCommand cmd = new SqlCommand(sql, conn);

                    cmd.Parameters.Add("@UpdateImage", SqlDbType.VarBinary);
                    cmd.Parameters["@UpdateImage"].Value = picbyte;

                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();

                    ms.Close();
                }
            }

            MessageBox.Show("完成!");
        }
        //读取


        private void ShowImage()
        {
            string sql = "";
            sql = "select Cover from LibraryCover where LibID=1";
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = "Data Source=192.168.0.9,1433;Database=WebDown;UID=sa;PWD=111122;";
            SqlCommand cmd = new SqlCommand(sql,conn);
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            reader.Read();
            MemoryStream ms = new MemoryStream((byte[])reader["Cover"]);
            Image image = Image.FromStream(ms, true);

            reader.Close();
            conn.Close();
            pictureBox1.Image = image;
        }

        //批量存储


        private void button12_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog FBD = new FolderBrowserDialog();
            FBD.ShowDialog();
            DBImages(FBD.SelectedPath);
        }
        /// <summary>
        /// 图片二进制存SQL库
        /// </summary>
        /// <param name="path">图片所在文件夹</param>
        private void DBImages(string path)
        {
            Stream ms;
            string sql = "";
            byte[] picbyte;
            string FolderName = "";
            string[] Folders;
            string connStr = "Data Source=192.168.0.9,1433;Database=WebDown;UID=sa;PWD=111122;";
            SqlConnection conn = new SqlConnection(connStr);
            Folders = Directory.GetFiles(path);
            foreach (string folder in Folders)
            {
                if ((ms = File.OpenRead(folder))!= null)
                {
                    picbyte = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(picbyte, 0, Convert.ToInt32(ms.Length));

                    sql = "insert into LibraryCover(ImageName,Cover) values(@ImageName,@Cover)";
                    SqlCommand cmd = new SqlCommand(sql, conn);

                    cmd.CommandType = CommandType.Text;
                    FolderName = Path.GetFileNameWithoutExtension(folder);
                    cmd.Parameters.Add("@ImageName", SqlDbType.VarChar, 255).Value = FolderName;
                    cmd.Parameters.Add("@Cover", SqlDbType.VarBinary).Value = picbyte;

                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    ms.Close();
                }
            }
            MessageBox.Show("存储完成!");
        }

        //批量读取

        private void button13_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog FBD = new FolderBrowserDialog();
            FBD.ShowDialog();
            getImageShow(FBD.SelectedPath);
        }
        /// <summary>
        /// sql库二进制图片显示在存储器上
        /// </summary>
        /// <param name="path">要存储图片的位置</param>
        private void getImageShow(string path)
        {
            string sql = "";
            string conn = "Data Source=192.168.0.9,1433;Database=WebDown;UID=sa;PWD=111122;";
            sql = "select ImageName,Cover from LibraryCover order by LibID";
            SqlDataReader sdr = GetList(conn,sql);
            while (sdr.Read())
            {
                byte[] bytes = (byte[])sdr["Cover"];
                FileStream fs = new FileStream(path+@"\" + sdr["ImageName"] + ".jpg", FileMode.Create, FileAccess.Write);
                fs.Write(bytes, 0, bytes.Length);
                fs.Flush();
                fs.Close();
            }
            MessageBox.Show("完成!");
        }
        public SqlDataReader GetList(string conn, string Sql)
        {
            SqlConnection myConnection = new SqlConnection(conn);
            SqlCommand myCommand = new SqlCommand(Sql, myConnection);

            myConnection.Open();
            SqlDataReader result = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
            return result;
        }


        private void getImage()
        {
            int num = 0;
            string path = @"D:\bookpic";
            Stream ms;
            string sql = "";
            byte[] picbyte;
            FileInfo[] Folders;
            string[] files;
            string FilePath = "";
            string connStr = "Data Source=192.168.0.200,1433;Database=MISTemp;UID=sa;PWD=111122;";
            SqlConnection conn = new SqlConnection(connStr);
            DirectoryInfo DI = new DirectoryInfo(path);
            Folders = DI.GetFiles("*.*",SearchOption.AllDirectories);
            foreach (FileInfo file in Folders)
            {
                num++;
                txt_num.Text = num.ToString();
                FilePath = file.FullName.Replace(@"D:\", "").Replace(@"\","/");
                if ((ms = File.OpenRead(file.FullName)) != null)
                {
                    picbyte = new byte[ms.Length];
                    ms.Position = 0;
                    ms.Read(picbyte, 0, Convert.ToInt32(ms.Length));

                    sql = "update shop_books set Cover=@Cover where bookpic='" + modsql(FilePath) + "'";
                    SqlCommand cmd = new SqlCommand(sql, conn);

                    cmd.CommandType = CommandType.Text;
                    cmd.CommandTimeout = 10000;
                    cmd.Parameters.Add("@Cover", SqlDbType.VarBinary).Value = picbyte;

                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    ms.Close();
                }
            }
           
            MessageBox.Show("存储完成!");
        }
        public string modsql(string sql)
        {
            return sql.Replace("'", "''");
        }

//Image写入XML
using System.IO;
using System.Runtime.Serialization.Formatters.Soap;


        string MyFile = @"D:\数据处理\image.xml";
        string imageFile = @"G:\zengwei.jpg";
        Stream MyStream;
        SoapFormatter MyFormatter =new SoapFormatter();
        

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                MyStream = new FileStream(MyFile, FileMode.Create, FileAccess.Write, FileShare.None);
                MyFormatter.Serialize(MyStream, pictureBox1.Image);
                MyStream.Close();
                MessageBox.Show("完成!");
            }
            catch (Exception ex)
            {
               
            }
        }
//读取XML显示IMAGE
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                MyStream = new FileStream(MyFile, FileMode.Open, FileAccess.Read, FileShare.None);
                pictureBox1.Image = (Bitmap)MyFormatter.Deserialize(MyStream);
                MyStream.Close();
            }
            catch (Exception ex)
            { }
        }
        private void button3_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = Image.FromFile(imageFile);
        }




///////////////////////////////////////////////////////////

.net教程:winform直接显示二进制数据中的图片

//读取DataSet中以二进制(Image)形式保存的图片
            byte[] byteImage = (byte[])dataSet11.tBGPicture.Rows[2]["PicContent"];

            //转成MemoryStream类型
            System.IO.MemoryStream stream = new System.IO.MemoryStream(byteImage, true);
            //stream.Write(byteImage, 0, byteImage.Length); 

            //显示图片
            pictureBox1.Image = Image.FromStream(stream);   
            
            //关闭stream
            stream.Close();

c# 将图片保存到access数据库中

                string fullpath = E:\电脑图标\BMP图例\BestBMP48X48\2.bmp;//文件路径
                FileStream fs = new FileStream(fullpath, FileMode.Open, FileAccess.Read);
                byte[] imagebytes = new byte[fs.Length];
                BinaryReader br = new BinaryReader(fs);
                imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
                fs.Close();
                //打开数所
                OleDbConnection con1 = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath+@"\经费分析数据库.mdb" + ";Persist Security Info=False");
                con1.Open();
                OleDbCommand cmd = con1.CreateCommand();
                OleDbTransaction trans = con1.BeginTransaction();
                cmd.Connection = con1;
                cmd.Transaction = trans;
                
                string strcomm = "insert into [单位人员信息]([照片])";
                strcomm += "values('" + imagebytes + "')";
                cmd.CommandText = strcomm;

                int intFalg = cmd.ExecuteNonQuery();
                trans.Commit();
                if (intFalg == 1)
                {
                    MessageBox.Show("保存图片成功");
                    pictureBox1.Image = null;
                }
                else
                {
                    MessageBox.Show("保存图片失败");
                    pictureBox1.Image = null;
                }
                con1.Close();