您的当前位置:首页LINQ to SQL活学活用(2):躲起来别让我看见

LINQ to SQL活学活用(2):躲起来别让我看见

2023-11-09 来源:六九路网
Customer CreateCustomer(){ return new Customer();}

2.按CustomerId获取Customer对象

public Customer GetCustomerById(int customerId){ return (from p in DataContext.Customer where p.CustomerId == customerId select p).FirstOrDefault();}

3.获取Customer对象列表

public IList<Customer> GetCustomerList(){ return (from p in DataContext.Customer select p).ToList<Customer>();}

4.更新保存Customer对象

public void UpdateCustomer(Customer customer){ if (customer == null) { throw new ArgumentNullException("Customer", "对象为空"); } else { if (customer.CustomerId == 0) { DataContext.Customer.InsertOnSubmit(customer); } DataContext.SubmitChanges(); }}

这里为了演示,仅仅写出了4个方法,大家可以按照自己的需要添加一些操作。

单元测试层

可以测试上面我们修改的结果了,在单元测试层新建一CustomerFacadeFixture.cs类依然继承测试基类UnitTestBase。

Step1:实例化CustomerFacade

在这个测试类中,首先实例化CustomerFacade。

private CustomerFacade m_facade;public CustomerFacade Facade{ get { if (m_facade == null) { m_facade = new CustomerFacade(); } return m_facade; }}

Step2:编写保存更新方法

其次,编写一个创建并保存Customer的方法,因为我们每次测试前,数据库为空的,在测试前,我们需要输入一些原始数据。

private Customer CreateAndSaveNewCustomer(string firstName, string lastName){ Customer newCustomer = Facade.CreateCustomer(); newCustomer.FirstName = firstName; newCustomer.LastName = lastName; Facade.UpdateCustomer(newCustomer); return newCustomer;}

从这个方法,我们就直接使用Facade提供给客户端的Create()方法和Update()方法,我们完全不知道具体的实现细节。

Step3:测试UpdateCustomer()方法

调用上面的方法,向创建保存为YJingLee的Customer为测试初始数据,正好也是测试了保存数据方法。

[Test]public void UpdateCustomerTest(){ Customer newCustomer = CreateAndSaveNewCustomer("YJing", "Lee"); Assert.AreNotEqual(0, newCustomer.CustomerId); Assert.AreEqual("YJing", newCustomer.FirstName);}

看看结果吧:

技术分享

分析一下:首先验证数据库是否存在,这里存在,删除原有的数据库重新创建一个新的数据库架构,向数据库中插入一条YJingLee的数据并查询这条数据。

Step4:测试GetCustomerById()方法

再来测试GetCustomerById()方法,首先在数据库中插入一条YJingLee的数据,看看这句reloaded = Facade.GetCustomerById(tempCustomer.CustomerId)调用外观Facade中的GetCustomerById()方法按CustomerId获取Customer对象,体现了对外隐藏具体的实现细节,最后断言数据是否符合预料的结果。

[Test]public void GetCustomerByIdTest(){ Customer tempCustomer = CreateAndSaveNewCustomer("YJing", "Lee"); Assert.AreNotEqual(0, tempCustomer.CustomerId); Customer reloaded = Facade.GetCustomerById(tempCustomer.CustomerId); Assert.IsNotNull(reloaded); Assert.AreEqual(tempCustomer.CustomerId, reloaded.CustomerId); Assert.AreSame(tempCustomer, reloaded);}

这个测试就留给大家测试了!测试好了把结果告诉我哦。 

Step5:测试GetCustomerList()方法

首先初始化三条数据,然后调用外观Facade中的GetCustomerList()方法获取Customer列表,测试是否一致

[Test]public void GetListTest(){ List<Customer> tempCustomers = new List<Customer>(); tempCustomers.Add(CreateAndSaveNewCustomer("YJing", "Lee")); tempCustomers.Add(CreateAndSaveNewCustomer("li", "yongjing")); tempCustomers.Add(CreateAndSaveNewCustomer("cnblogs", "com")); var reloaded = Facade.GetCustomerList(); Assert.IsNotNull(reloaded); Assert.AreEqual(tempCustomers.Count, reloaded.Count);}
结语

这篇文章我们通过修改第一篇完全裸露的代码,运用一个外观Facade类对外提供较清晰的接口来隐藏具体的实现细节,客户使用只需和Facade对象接口交互,从这篇的改进也完美地体现了依赖倒转原则和迪米特法则的思想。

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

LINQ to SQL活学活用(2):躲起来别让我看见

标签:

小编还为您整理了以下内容,可能对您也有帮助:

C#中有没有类似于SQL中的%那种通配符, 怎么在C#中实现模糊搜索(不用数据库)

1.用一个List<string> listOnit存放初始化数据,用一个List<string> listNew存放输入key之后,返回的数据。

2.用上面的listOnit初始化ComboBox数据源进行绑定。

3.在TextUpdate方法内部,添加实现方法。

首先进入方法,先清除ComboBox的内容,然后将输入的内容去listOnit初始化的数据中比对,找出对应数据,然后放入listNew存放数据,最后将listNew数据重新赋值给ComboBox。

后台代码实现:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace TimerDemo

{

public partial class Form2 : Form

{

//初始化绑定默认关键词(此数据源可以从数据库取)

List<string> listOnit = new List<string>();

//输入key之后,返回的关键词

List<string> listNew = new List<string>();

public Form2()

{

InitializeComponent();

}

private void Form2_Load(object sender, EventArgs e)

{

//调用绑定

BindComboBox();

}

/// <summary>

/// 绑定ComboBox

/// </summary>

private void BindComboBox()

{

listOnit.Add("张三");

listOnit.Add("张思");

listOnit.Add("张五");

listOnit.Add("王五");

listOnit.Add("刘宇");

listOnit.Add("马六");

listOnit.Add("孙楠");

listOnit.Add("那英");

listOnit.Add("刘欢");

/*

* 1.注意用Item.Add(obj)或者Item.AddRange(obj)方式添加

* 2.如果用DataSource绑定,后面再进行绑定是不行的,即便是Add或者Clear也不行

*/

this.comboBox1.Items.AddRange(listOnit.ToArray());

}

private void comboBox1_TextChanged(object sender, EventArgs e)

{

/*

* 不能用TextChanged操作,当this.comboBox1.DroppedDown为True时,选择项上下键有冲突

*/

}

private void comboBox1_TextUpdate(object sender, EventArgs e)

{

//清空combobox

this.comboBox1.Items.Clear();

//清空listNew

listNew.Clear();

//遍历全部备查数据

foreach (var item in listOnit)

{

if (item.Contains(this.comboBox1.Text))

{

//符合,插入ListNew

listNew.Add(item);

}

}

//combobox添加已经查到的关键词

this.comboBox1.Items.AddRange(listNew.ToArray());

//设置光标位置,否则光标位置始终保持在第一列,造成输入关键词的倒序排列

this.comboBox1.SelectionStart = this.comboBox1.Text.Length;

//保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置。

Cursor = Cursors.Default;

//自动弹出下拉框

this.comboBox1.DroppedDown = true;

}

}

}

实现效果截图:

从左到右模糊查询:(例如输入:张)

可以得出正常模糊查询的结果。

从左到右模糊查询(例如输入:三)

实现过程中的问题:

1.绑定数据一开始用的DataSource方式,但是写到下面重新给ComboBox设置数据源的时候,报错:不能为已经设置DataSource的combobox赋值。

解决方式:将赋值方式改为:Item.Add(obj)或者Item.AddRange(obj)方式

2.下拉框的内容一直在增加

解决方式:当文本框文本改变时,清空下拉框的内容,然后再添加数据。

3.输入文本改变时,没有自动弹出下拉框显示已经查询好的数据。

解决方式:设置comboBox的DroppedDown 属性为True。

4.ComboBox文本框改变事件一开始选择用的是TextChanged事件,但是当在界面用 上 下键盘选择时,出现bug,不能进行选择。

解决方式:将文本框改变事件换为TextUpdate事件,然后添加实现方法。

5.当在ComboBox输入内容时,内容文本是倒序输出的,光标位置始终在最前面。

解决方式:设置光标的显示位置,this.comboBox1.SelectionStart = this.comboBox1.Text.Length;

6.输入内容改变时,用鼠标选择下拉列表项的时候,鼠标指针消失,被下拉框覆盖掉。

解决方式:设置鼠标状态为一开始的默认状态,Cursor = Cursors.Default;

高分!ASP.NET中如何把图片以二进制方式存入SQL Server数据库,并能读取出来

1、建所需数据库和表,语句如下:

--建立数据库

create database test

--使用该数据库

use test

--建立存放图片的表

create table piclist(

id int Identity primary key,

pic Image not null

)

2、制作上传图片的模块,代码如下:

前台html代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UpPhoto.aspx.cs" Inherits="Test_UpPhoto" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>无标题页</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<input id="UpPhoto" name="UpPhoto" runat="server" type="file" />

<asp:Button id="btnAdd" runat="server" Text="上传" OnClick="btnAdd_Click"></asp:Button>

</div>

</form>

</body>

</html>

后台代码:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.IO;

using System.Data.SqlClient;

public partial class Test_UpPhoto : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

protected void btnAdd_Click(object sender, EventArgs e)

{

//获得图象并把图象转换为byte[]

HttpPostedFile upPhoto = UpPhoto.PostedFile;

int upPhotoLength = upPhoto.ContentLength;

byte[] PhotoArray = new Byte[upPhotoLength];

Stream PhotoStream = upPhoto.InputStream;

PhotoStream.Read(PhotoArray, 0, upPhotoLength);

//连接数据库

string ConStr = "server=(local);user id=sa;pwd=sa;database=test";

SqlConnection conn = new SqlConnection(ConStr);

string strSql = "Insert into piclist(pic) values(@pic)";

SqlCommand cmd = new SqlCommand(strSql, conn);

cmd.Parameters.Add("@pic", SqlDbType.Image);

cmd.Parameters["@pic"].Value = PhotoArray;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

Response.Write("图片上传成功");

}

}

3、制作显示图片的模块(单独显示图片,即没用到datalist):

后台代码:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.IO;

public partial class Test_ShowPhoto : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if(!Page.IsPostBack)

{

//连接数据库

string ConnStr = "server=(local);user id=sa;pwd=sa;database=test";

string strSql = "select * from piclist";

SqlConnection conn = new SqlConnection(ConnStr);

conn.Open();

SqlCommand cmd=new SqlCommand(strSql,conn);

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

{

Response.ContentType = "application/octet-stream";

Response.BinaryWrite((Byte[])reader["pic"]);

Response.Write("successful");

}

reader.Close();

conn.Close();

Response.End();

}

}

}

补充步骤3,用datalist显示图片方法:

建立两个asp.net 页面,名称为piclist.aspx和StreamImg.aspx。

piclist.aspx前台代码为:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="piclist.aspx.cs" Inherits="Test_Test" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>无标题页</title>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:DataList ID="dlContent" runat="server" Width="554px">

<ItemTemplate>

<table cellpadding="0" cellspacing="0">

<tr>

<td style="width: 554px; text-align: left; background-image: url(Image/标头.jpg); height: 26px;">

    <img id='img1' src='StreamImg.aspx?id= <%# DataBinder.Eval(Container.DataItem,"id") %>'>

</a>

</a>

</td>

</tr>

</table>

</ItemTemplate>

</asp:DataList>

</div>

</form>

</body>

</html>

piclist.aspx后台代码为:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;

using System.IO;

public partial class Test_Test : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (!Page.IsPostBack)

{

//连接数据库

string ConnStr = "server=(local);user id=sa;pwd=sa;database=test";

SqlConnection sqlcon = new SqlConnection(ConnStr);

sqlcon.Open();

string sqlstr = "select id from piclist";

SqlDataAdapter MyAdapter = new SqlDataAdapter(sqlstr, sqlcon);

DataSet ds = new DataSet();

MyAdapter.Fill(ds, "tb_pic");

this.dlContent.DataSource = ds;

this.dlContent.DataBind();

sqlcon.Close();

}

}

}

StreamImg.aspx无前台代码,后台代码为:

using System;

using System.Collections;

using System.Configuration;

using System.Data;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Xml.Linq;

using System.Data.SqlClient;

using System.IO;

public partial class StreamImg : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

//string type = Request.QueryString["pt"];

int id = Convert.ToInt32(Request.QueryString["id"]);

ShowPic(id);

}

private void ShowPic(int id)

{

//连接数据库

string ConnStr = "server=(local);user id=sa;pwd=sa;database=test";

string strSql = "select * from piclist where id='"+ id +"'";

SqlConnection conn = new SqlConnection(ConnStr);

conn.Open();

SqlCommand cmd = new SqlCommand(strSql, conn);

SqlDataReader reader = cmd.ExecuteReader();

while (reader.Read())

{

Response.ContentType = "application/octet-stream";

Response.BinaryWrite((Byte[])reader["pic"]);

Response.Write("successful");

}

reader.Close();

conn.Close();

Response.End();

}

}

显示全文