Silverlight学习笔记[4] - 在Silverlight中通过WCF连接ORACLE DB数据库(译)

http://hi.baidu.com/%C7%A7%C0%EF%BA%AE%C9%AB/blog/item/f18b7cc46cfe29dc38db4945.html

这不是我的原创,我也是上网学习的~

How to get data from Oracle DB in silverlight via WCF ?

查看原文可以搜索以上文章名。

这个只是给入门和遇到问题的朋友——毕竟真的有很多小细节没有说明!

而且英文的确看着不舒服。中国进步,还要靠大家的付出啊!!!

-----------------------------------------------------------------------------------------------------------

第一步:新建Silverlight应用程序;

第二步:在.web类型项目上右键,添加“新建项”。选择Silverlight——启用了Silverlight的WCF服务;

然后就多了这个东西:

(图MB)

第三步:在解决方案上右键,添加“新项目”。选择Window——类库;

              此类库为调用查询的数据表的属性集合,因此要写上数据表中需要用到字段以及GET、SET方法。

              注意此处要在CS文件中添加using System.Runtime.Serialization引用,在类库的引用中添加System.Runtime.Serialization.dll!

              这个类库个人理解为一个数据结构,用来存储返回数据表的数据。

第四步:改写第二步中生成的.svc文件下的.svc.cs文件——在.Web类型项目下的(图MB所示)

              将:

        public void DoWork()
        {
            // 在此处添加操作实现
            return;
        }
               改写为:
        public List<Class1> GetDatabyName(Int32 pInParam)
        {
            String oracleSql;
            List<Class1> returnlist = new List<Class1>();
            //用LIST来获取DATASET
            //创建ORACLE连接
            String oracleConnString = "Data Source=testDB;User Id=TEST;Password=test;";
            OracleConnection cnn = new OracleConnection(oracleConnString);
            cnn.Open();
            oracleSql = "SELECT * FROM TBL_TEST WHERE MYID=" + pInParam; 
            OracleCommand cmd = new OracleCommand(oracleSql, cnn);
            OracleDataAdapter da = new OracleDataAdapter(cmd);
 
            DataSet ds = new DataSet();
            da.Fill(ds, "TBL_TEST");
            foreach (DataRow dr in ds.Tables["TBL_TEST"].Rows)
            {
                returnlist.Add(new Class1
                {
                    MYID = Convert.ToInt32(dr["MYID"]),
                    MYRECORD = dr["MYRECORD"].ToString()
                });
            }
           //以LIST形式返回DATASET
            return returnlist;
        }

注意了,要添加引用:

using System.Collections.Generic;//用来说明List
using ClassLibrary1;
using System.Data.OracleClient;
using System.Data;//用来说明DATASET

在.web下的引用添加System.Data.OracleClient.dll——用来解释ORACLE语句;还有你的类库也要添加!在引用中的项目里添加——用来解释List<>中的数据类型!

----------------------------------最终代码---------------------------------------

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
 
using System.Collections.Generic;
using ClassLibrary1;
using System.Data.OracleClient;
using System.Data;
 
namespace SilverlightApplication7.Web
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Service1
    {
        [OperationContract]
        public List<Class1> GetDatabyName(Int32 pInParam)
        {
            String oracleSql;
            List<Class1> returnlist = new List<Class1>();
            //Get your Customer Data from Oracle DB, if you use DataSet, get the DataSet,
            //Create Customer Object for each row in your DataTable
            String oracleConnString = "Data Source=testDB;User Id=TEST;Password=test;";
            OracleConnection cnn = new OracleConnection(oracleConnString);
            cnn.Open();
            //pass your SQL filter paramenter here
            oracleSql = "SELECT * FROM TBL_TEST WHERE MYID=" + pInParam;
            //oracleSql = "SELECT * FROM TBL_TEST";
 
            OracleCommand cmd = new OracleCommand(oracleSql, cnn);
            OracleDataAdapter da = new OracleDataAdapter(cmd);
 
            DataSet ds = new DataSet();
            da.Fill(ds, "TBL_TEST");
            foreach (DataRow dr in ds.Tables["TBL_TEST"].Rows)
            {
                returnlist.Add(new Class1
                {
                    MYID = Convert.ToInt32(dr["MYID"]),
                    MYRECORD = dr["MYRECORD"].ToString()
                });
            }
            return returnlist;
        }
 
        // 在此处添加更多操作并使用 [OperationContract] 标记它们
    }
}

第五步:快成功了!在C#文件(就是除了.web还有类库以外的那个文件头那里,右键,添加“服务引用”);

按发现;不行对吧?

很好,因为你要先按F5编译一次程序。再来!

行了!(不行的同学留言吧~为你们默哀)

第六步:在MainPage.xaml中做一点点修改,首先加一个BUTTON,名为myButton,再加一个TextBox,名为myText。

在MainPage.xaml.cs添加引用using System.Collections.ObjectModel;using SilverlightApplication7.ServiceReference1;

 

最后MainPage.xaml.cs完整代码为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
 
using System.Collections.ObjectModel;
using SilverlightApplication7.ServiceReference1;
namespace SilverlightApplication7
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }
        private void myButton_Click(object sender, RoutedEventArgs e)
        {
            SilverlightApplication7.ServiceReference1.Service1Client client = new SilverlightApplication7.ServiceReference1.Service1Client();
            //Pass your parameter , pass id 4 will return string "Ray"
            client.GetDatabyNameAsync(Convert.ToInt32(myText.Text.ToString()));
            client.GetDatabyNameCompleted += new EventHandler<GetDatabyNameCompletedEventArgs>(client_GetDatabyNameCompleted);
            //Close the connection, when you get the error connection timeout , acctually, the connections limited to 10 for each client.
            client.CloseAsync();
        }
        private void client_GetDatabyNameCompleted(object sender, GetDatabyNameCompletedEventArgs e)
        {
            //We need a collection object to receive the return list form WCF
            //We can only use the class defined in Web Service to create client instance
            System.Collections.ObjectModel.ObservableCollection<ServiceReference1.Class1> temp =
                new ObservableCollection<ServiceReference1.Class1>();
 
            temp = e.Result;
            for (int i = 0; i < temp.Count; i++)
            {
                MessageBox.Show(temp[i].MYID.ToString() + " and " + temp[i].MYRECORD.ToString());
            }
        }
    }
}

最后总观~

-------------------------------------------------------

对了,你还要有一个ORACLE数据库,我这个例子是:数据库名:testDB;用户名:TEST;密码:test;所以对应语句为Data Source=testDB;User Id=TEST;Password=test;

然后生成一个表——在ORACLE的SQL PLUS中或者什么的,自己解决:

CREATE TABLE TBL_TEST
(
MYID NUMBER(20),
MYRECORD VARCHAR2(50 BYTE)
)
Insert into TBL_TEST(MYID, MYRECORD)Values(1, 'Hello');
Insert into TBL_TEST(MYID, MYRECORD)Values(2, 'I');
Insert into TBL_TEST(MYID, MYRECORD)Values(3, 'am');
Insert into TBL_TEST(MYID, MYRECORD)Values(4, 'Ray');

表名为TBL_TEST

--------------------------------------------

最后最后再提醒,记得在MainPage.xaml中的Butto语句中添加Click事件——如最后所示!

<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="205,216,0,0" Name="myButton" VerticalAlignment="Top" Width="75" Click="myButton_Click" />

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值