Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Friday, May 1, 2015

利用htmlunit和webdriver读取网页数据

先说.net的,需要进入 using mshtml;

           System.Net.WebClient webClient = new System.Net.WebClient();
              IWebDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("http://course.xxx.edu/");
            String pageSource = driver.PageSource;
这种比较笨重,需要启动firefox读取


对java的,需要使用htmlunit包
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_31);
webClient.getOptions().setJavaScriptEnabled(true);
//webClient.getCookieManager().setCookiesEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setThrowExceptionOnScriptError(false);
   webClient.getOptions().setCssEnabled(false);

   HtmlPage page =
webClient.getPage("http://course.xxx.edu");
 
webClient.waitForBackgroundJavaScript(5000);


String text=page.asText();
/*String patternString = "Available Seats:";
Pattern pattern = Pattern.compile(patternString);

        Matcher matcher = pattern.matcher(text);*/
        int index=text.lastIndexOf("Available Seats");
        String seats=text.substring(index+17, index+19).trim();

int numOfSeats=Integer.parseInt(seats);
System.out.println(numOfSeats);


如何利用c#发送gmail
public static void SendMail(String s)
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
            mail.From = new MailAddress("sender@gmail.com");
            mail.To.Add("receiver@gmail.com");
           // mail.To.Add("m2@gmail.com");
            mail.Subject = "good news: "+s;
            mail.Body += " <html>";
            mail.Body += "<body>";
            mail.Body += "<table>";
            mail.Body += "<tr>";
            mail.Body += "<td>User Name : </td><td> HAi </td>";
            mail.Body += "</tr>";

            mail.Body += "<tr>";
            mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
            mail.Body += "</tr>";
            mail.Body += "</table>";
            mail.Body += "</body>";
            mail.Body += "</html>";
            mail.IsBodyHtml = true;
            SmtpServer.Port = 587;
            SmtpServer.Credentials = new System.Net.NetworkCredential("sender@gmail.com", "mypassword");
            SmtpServer.EnableSsl = true;
            SmtpServer.Send(mail);

        }

Sunday, March 8, 2015

创建WCF web服务并使用WPF调用

1. 新建WCF application
2. 删除系统生成的两个文件IService1.cs与Service1.svc(或者自己重命名,在系统生成的基础文件中进行编码,此处感觉重命名麻烦,于是选择删除–新建)
3. 添加自定义的WCF【服务文件】Test.svc, 此时vs会自动生成WCF接口文件ITest.cs
接口文件ITest.cs
namespace WCFServiceDemo
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“ITest”。
[ServiceContract]
public interface ITest
{
[OperationContract]
int Square(int num);
}
}  主类文件Test.svc.cs
namespace WCFServiceDemo
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Test”。
public class Test : ITest
{
public int Square(int num)
{
return num*num;
}
}
}
4. F5运行, 可得到服务地址 http://localhost:11471/Test.svc
不可退出,必须保持run的状态




5. 现在新建客户端程序,使用WPF,首先添加reference 就是上面的服务地址
http://localhost:11471/Test.svc?wsdl


6. 在wpf主界面添加一个文本框和按钮
按钮的点击代码如下:

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            WCFClient2.WCFService.TestClient tc = new WCFService.TestClient();
            int x=0;
            try {x = Convert.ToInt32(textbox1.Text); }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
                return;
            }
           int result = tc.Square(x);
            MessageBox.Show("result= "+result);
        }


结果如下:

注意:wcf服务的调用使用普通网页调用需要更多的设置,WCF的使用在网站服务用处很大,需要更多的学习,感觉asp.net在中小型服务中使用比java方便
另外,exception 后面不能使用e变量,改成了ex

Sunday, February 22, 2015

ASP.NET MVC+Entity Framework 4.1访问数据库

Entity Framework 4.1支持代码优先(code first)编程模式:即可以先创建模型类,然后通过配置在EF4.1下动态生成数据库。
下面演示两种情形:
1、代码优先模式下,asp.net mvc数据访问
2、传统模式,先创建数据库和表,配置连接字符串,再生成模型

第一种情况的步骤:
(1)使用空模板,创建ASP.NET MVC3.0(或4.0)项目,假定项目名:MVC_Student
注意:创建完项目后,项目会自动引用EF4.1
(2)在Model文件夹下,创建数据库上下文类:StuDBContext
public class StuDBContext:DbContext
    {
        public StuDBContext()
            : base("DataConn")
        {
        }
        public DbSet<StudentInfo> Students { get; set; }
    }
(3)创建域模型:StudentInfo
public class StudentInfo
    {
        public int ID { get; set; }
        public string StuNO { get; set; }
        public string StuName { get; set; }
        public string StuPhoto { get; set; }
        public DateTime StuBirthday { get; set; }
        public string StuAddress { get; set; }
    }
(4)在web.config中配置连接字符串(也可以不配置,EF自动检查并使用SQL SERVER EXPRESS,此处我们指定服务器和数据库)
<connectionStrings>
  <!--<add name="StuDBContext" connectionString="server=(local);database=MyStudent;uid=(登录账户);pwd=(登录密码)" providerName="System.Data.SqlClient"/>-->
  <add name="DataConn" connectionString="server=(local);database=MyStudent;uid=(登录账户);pwd=(登录密码)" providerName="System.Data.SqlClient"/>
 </connectionStrings>
(5)生成项目,为第(6)步服务
(6)右击“Controllers"文件夹,选择”添加控制器“,如图:
单击确定后,会在Controllers文件夹下生成一个StudentController类,而且在Views文件夹下生成Student子文件夹,其中包含5个.cshtml文件,如图:
(7)修改Global.asax.cs的默认路由:
routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Student", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );
(8)最后,单击”调试“菜单,选择”启动调试“,或直接按F5.会看到如下效果:
(9)可以单击”Create New"超链接,向数据库添加一条记录
(10)此时可以打开数据库服务器,会发现自动创建了MyStudent的数据库(对应连接字符串中的数据库)和StudentInfoes表(是模型类名称的复数形式,表中的各字段分别对应模型类中的属性,此处要特别注意:ID属性会自动对应表中的自增长主键列。

以上方法需要注意的地方:
(1)web.config中连接字符串,providerName要提供,否则报错。
(2)模型的ID属性是固定的, 要不就要用元数据声明,EF4.1会自动将之映射为表的主键(自增长)。
(3)数据库实体上下文名称一般与连接字符串name属性的值相同,但本文中不同(数据库实体上下文是StuDBContext,连接字符串名称:DataConn),如果相同,那么实体上下文类可以不提供构造函数。如果不相同,如本例中,可以为实体上下文添加构造函数,并调用父类构造函数,在base()中传递与实体上下文类名不同的连接字符串名称(本例中时DataConn,如步骤(2)红色标注)
 ________________________________________________________________________________________________________________________________________
下面演示第2种情形:先创建数据库模式,然后生成模型
(1)在SQL SERVER 2005/2008服务器上创建数据库MyStudent,并添加一张表StudentInfoes(也可以在VS中服务器资源管理器中操作)
表的结构如下;
(2)创建ASP.NET MVC3/4项目(使用空模板)
(3)在Models文件夹中添加实体上下文类:StuDBContext
public class StuDBContext:DbContext
    {
        public StuDBContext()
            : base("DataConn")
        {
        }
        public DbSet<StudentInfo> Students { get; set; }
    }
(4)在Models文件夹中添加实体类:StudentInfo
public class StudentInfo
    {
        public int ID { get; set; }
        public string StuNO { get; set; }
        public string StuName { get; set; }
        public string StuPhoto { get; set; }
        public DateTime StuBirthday { get; set; }
        public string StuAddress { get; set; }
    }
(5)在web.config中配置连接字符串:
<connectionStrings>
  <!--<add name="StuDBContext" connectionString="server=(local);database=MyStudent;uid=(登录账户);pwd=(登录密码)" providerName="System.Data.SqlClient"/>-->
  <add name="DataConn" connectionString="server=(local);database=MyStudent;uid=(登录账户);pwd=(登录密码)" providerName="System.Data.SqlClient"/>
 </connectionStrings>
(6)生成项目解决方案,为第(7)步服务
(7)在Controllers文件夹下添加StudentController类,如图:
单击添加后,会创建与第一种情形同样的项目文件结构。如上面所示。
(8)修改路由:
routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Student", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );
(9)启动调试,预览效果如下:


对比两种方式,有如下区别:自动生成数据库表的字段类型可能与自定义的不一致。

无论是通过代码生成数据库,还是先创建数据库,再创建模型,都需要了解他们之间的映射关系(即EF作为ORM框架的作用),你会发现EF4.1作为ORM框架,遵循很多约定(Convention),而ASP.NET MVC推崇的很重要的一条原则就是:约定先于配置,可谓不谋而合。

WPF 实现sql server连接

首先创建一个新的wpf项目
在reference 下点击manage nuget package
安装entity framework

然后在项目下添加一个item,ado.net entity data model,连接到你的sqlserver服务
然后在界面下添加一个datagrid,一个query的button

在主界面程序文件下先实例化数据服务,
AdventureWorks2012Entities data = new AdventureWorks2012Entities();
AdventureWorks2012是微软自带sample database
再建立button的点击方法

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            var query =
           from person in data.Person
           where person.FirstName == textbox1.Text && person.LastName == textbox2.Text
           orderby person.LastName
           select new { person.FirstName, person.LastName, person.PersonType, person.Title };

            datagrid1.ItemsSource = query.ToList();
        }