Hetter

2009年4月2日

甲骨文之二

傍晚时分,万籁俱寂之际,做在电脑旁,整理整理头绪,将甲骨文的逻辑组件反省一下,看完北大青鸟的学习资料之后,在加上我的浮想联翩下,我把我所看到的,搜到的,理解到的东西整理整理,以供后来翻阅翻阅。

在我看来,甲骨文的逻辑组件由大小来划分的话,我给他们排了一下队伍。有高----矮的顺序:表空间,段,区,数据块。

这里边还蕴藏玄机,表空间由一个段或多段组成,而段呢由多个区组成,区又有多个数据块组成。

我这样描述可能不清楚,在给你画个图看看:



 这下子一目了然了吧。

我们在插入数据的时候,它是如何插入到数据块了,一条记录到底用几个数据块来存储了,存储的时候是用连续的数据块来存储他了还是用散散列列的数据块来存储了,伴随着这些问题,通过搜索资料,然后在想了一下,原理我们在插入记录的时候,如过一个数据块无法容纳一条记录,那么系统就会用其他的数据块来存储的并且有可能是连续的或者是散列的;

据北大青鸟资料记载在创建表时,系统会将一定数目的数据块组成的初始数据区分配给表的数据段.也就是说我们虽没有创建任何行,但是已经为该表的行留出了与初始数据区对应的Oracle数据块.如果数据块满了,Oracle就会新增数据区,并且新增的大小跟初始分配的数据区一般大甚至会更大.因为数据区是按需分配的,所以段的数据区有可能是磁盘的相邻部分,也有可能不是.

今天就搞到这吧,明天整理一下数据类型吧

posted @ 2009-04-02 11:27 Hetter 阅读(417) 评论(0) 编辑

2009年4月1日

Oracle入门

最近刚来利方(到现在才知道其实该公司很垃圾),该公司主要是用Oracle数据库,自己之前对该数据库一点也不了解,不过由于对sql server比较了解,所以我想对Oracle的掌握应该还是比较快一点点的,呵呵.

我想利用最近一段比较轻松的时间来掌握一下Oracle数据库(主要面向数据库开发)

甲骨文学习一:

主要物理组件:

1,数据库文件或数据文件

当创建好数据库后,该数据库至少包含一个数据文件,之后我们可按照需要来添加数据文件.数据文件只能属于一个数据库,但是数据库至少包含一个数据文件.一个数据文件或多个数据文件形成了数据库的逻辑单位即表空间(我个人感觉oracle表空间有点像sqlserver的数据库)数据文件只能与一个表空间相关联.数据文件是以数据块为单位.

在创建完数据文件后,管理员可以改变数据文件的大小或可以动态设置他随表空间的对象增长而动态增长.

2,控制文件

创建完数据库后,还有一个控制文件(sqlserver里没有).他主要是用来存储数据库的物理结构,也就是与数据库相关的所有文件信息.比如说数据库的名称,数据文件和恢复日志文件的名称以及位置,时间戳等等.

数据库启动的时候,该文件查找和定位数据库组件;

为防止该文件出错,应存在多个处于镜像形式的控制文件;

3,恢复日志文件

创建完数据库后,还有恢复日志文件,甲骨文起的名字就是比微软的好听,加上了个恢复,就让人一看字面就知道该日志文件是用来做啥的.

该文件可不能破坏,为以防万一还是要预存俩个或多个镜像形式的文件.

数据库通常由两个或多个恢复日志文件组成,日志文件以循环的方式来工作.当第一个日志文件写满以后,然后就开始写第二个日志文件,当第二个日志文件写满以后,然后在写第一个日志文件,依次循环写日志文件.注意恢复日志文件创建完后,其大小就固定了.

日志文件的功能受数据库运行的模式控制.数据库运行模式为:不归档模式(默认)和归档模式.

其中不归档模式下日志文件不能完全记录数据库做的所有更改.而归档模式能够完全记录数据库做的所有修改;

在不归档模式下:恢复日志文件将被重写.即当日志切换发生时,当前日志文件将发生更改,此时当前日志文件将被重写;就在这个时候你对数据库所做的修改而日志文件将不能给你记录下来.

归档模式下:在日志切换发生前生成当前日志文件的物理副本即存档文件,你对数据库所做的所有修改都将记录在存档文件和恢复日志文件里.

今天就暂时学这些吧.慢慢来嘛,.

一步一个 脚印,踩的越深,记得越牢.

明天搞一下逻辑组件.13:50:15

posted @ 2009-04-01 13:54 Hetter 阅读(448) 评论(0) 编辑

2009年3月31日

webservice 用户验证 加密

最近一直在自学webservice,并且通过学习之后做了一个案例,基于WebService的用户身份验证;但是做了很长时间老是出现一下问题:System.Web.Services.Protocols.SoapException: 服务器无法处理请求。

希望博客园里边的朋友帮忙解决一下,先谢谢啦,有机会请请.

代码如下:

/// <summary>

/// UserHeader 的摘要说明(封装了用户名和密码)

/// </summary>

public class UserHeader : SoapHeader

{

    public UserHeader()

    {

    }

    string name;

    string pwd;

    public string Name { get { return name; } set { name = value; } }

    public string Pwd { get { return pwd; } set { pwd = value; } }

}

WebService:

[WebService(Namespace = "http://tempuri.org/")]

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

public class VerifyUserService : WebService

{

    public UserHeader _userHeader;

    public UserHeader UserHeader

    {

        get { return _userHeader; }

        set { _userHeader = value; }

    }

    public VerifyUserService()

    {

    }

    [SoapHeader("_userHeader", Direction = SoapHeaderDirection.InOut)]

    [WebMethod]

    public string ReturnLoginUser()

    {

        string Msg = string.Empty;

        if (_userHeader == null)

            Msg = "未初始化Web客户端实例";

        else

        {

            string name = DataProtect.Decrypt(_userHeader.Name);//在服务器端进行解密

            string pwd = DataProtect.Decrypt(_userHeader.Pwd);//在服务器端进行解密

            string sql = "select count(*) from USERINFO where Name=:Name and PWD=:Pwd";

            OleDbParameter[] cmdParameters ={ new OleDbParameter(":Name", OleDbType.VarChar, 10), new OleDbParameter(":Pwd", OleDbType.VarChar, 10) };

            cmdParameters[0].Value = name;

            cmdParameters[1].Value = pwd;

            object result = OraDBHelper.ExecuteScalarSql(sql, cmdParameters);

            if (!string.IsNullOrEmpty(result.ToString()))

            {

                if (int.Parse(result.ToString()) > 0)

                    Msg = "login success";

                else

                    Msg = "login failed";

            }

        }

        return Msg;

    }

}


WebService客户端:

 class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("please input your name");

            string name = Console.ReadLine();

            Console.WriteLine("please input your password");

            string pwd = Console.ReadLine();

            UserHeader _uh = new UserHeader();          

            _uh.Name = DataProtect.Encrypt(name);//传输之前先加密

            _uh.Pwd = DataProtect.Encrypt(pwd);   //传输之前先加密         

            VerifyUserService vus = new VerifyUserService();

            vus.UserHeaderValue = _uh;

            string result = vus.ReturnLoginUser();//返回验证信息

            Console.WriteLine("your login msg:{0}", result);

            Console.ReadLine();

        } 

我的思路:将用户名和密码封装到SOAPHEADER,然后在传输之前对该SoapHeader进行加密,WebService服务器端进行解密,然后验证信息是否正确.

我的加密类:用的是对称加密.代码如下:

 public class DataProtect

    {

        public DataProtect()

        {

            //

            // TODO: 在此处添加构造函数逻辑

            //

        }

        private static string key;

        private static string iv;


        public static string Key

        { get { return key; } }


        public static string Iv

        {

            get { return iv; }


        }


        /// <summary>

        /// 随机生成密钥和初始化向量

        /// </summary>

        /// <returns></returns>

        private static string GetKeyOrIv()

        {

            StringBuilder sb = new StringBuilder();


            Random r = new Random();

            while (sb.ToString().Length < 8)

            {

                int number = r.Next(10);

                sb.Append(number);

            }


            return sb.ToString();

        }

        private static byte[] GetBytes(string str)

        {

            Encoding e = Encoding.Default;

            byte[] result = e.GetBytes(str);

            return result;

        }

        private static string GetString(byte[] b)

        {

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < b.Length; i++)

            {


                sb.Append(b[i].ToString("x2"));


            }

            return sb.ToString();


        }

        /// <summary>

        /// 加密数据(对称)

        /// </summary>

        /// <param name="txt">加密文本</param>

        /// <returns></returns>

        public static string Encrypt(string txt)

        {  key = "12345678";

            iv = "12345678";

            byte[] key1 = GetBytes(key);

            byte[] iv1 = GetBytes(iv);

            SymmetricAlgorithm sa = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream();

            CryptoStream cs = new CryptoStream(ms, sa.CreateEncryptor(key1, iv1), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cs);

            sw.WriteLine(txt);

            sw.Close();

            cs.Close();

            byte[] result = ms.ToArray();

            ms.Flush();

            ms.Close();

            return GetString(result);

        }


        /// <summary>

        /// 解密数据(对称)

        /// </summary>

        /// <param name="txt"></param>

        /// <returns></returns>

        public static string Decrypt(string txt)

        {

            key = "12345678";

            iv = "12345678";

            byte[] key1 = GetBytes(key);

            byte[] iv1 = GetBytes(iv);

            SymmetricAlgorithm sa = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream(GetBytes(txt));

            CryptoStream cs = new CryptoStream(ms, sa.CreateDecryptor(key1, iv1), CryptoStreamMode.Read);

            StreamReader sr = new StreamReader(cs);

            string result = sr.ReadLine();

            sr.Close();

            cs.Close();

            ms.Close();

            return result;

        }

    }

希望园子里的朋友帮忙解决一下,这个问题困扰了我好久,从网上查找资料也没有解决掉,在一次谢谢大家了

我的邮箱:slj1024@gmail.com

posted @ 2009-03-31 15:36 Hetter 阅读(1718) 评论(9) 编辑

2009年3月28日

加密狗

今天看了一下项目中涉及到的知识点,察觉到该项目中里边有许多知识以前从未接触过,顺便将其整理下来.

加密狗

主要是用来加密个人重要的数据.我们对其的操作主要就是读写加密狗里边的信息.

介绍一下赛孚耐信息技术有限公司的加密狗产品,该产品提供了.NET中非托管的类库,来完成加密狗的数据读写功能。

 ● DogWrite 函数(写如加密狗)

 [DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]

    public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);

将PdogData指向的数据块写入加密狗中,从idogAddr处开始,长度共长idogBytes.

参数说明如下。

l     idogAddr:对软件狗读写操作时用户区中的首地址。取值范围为0~99。

l     IdogBytes:对软件狗读写操作时的字节长度。读写时取值范围为1~100,并且与idogAddr之和不能超过100。

l     pdogData:指针型变量。指向读写操作或变换的数据缓冲区。

l     返回值:0表示操作成功,其他值是错误码。


● DogRead函数(读加密狗里边的信息)

该函数从加密狗中的idogAddr开始的存储区读出数据,存入pdogData指定的缓冲区,读出字节数为idogBytes。切记,缓冲区大小要足够长。

函数声明如下:

[DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]

    public static unsafe extern uint DogRead(uint idogBytes, uint idogAddr, byte* pdogData);

参数说明如下。

l     idogAddr:对软件狗读写操作时用户区中的首地址。取值范围为0~99。

l     idogBytes:对软件狗读写操作时的字节长度。读写时取值范围为1~100,并且与idogAddr之和不能超过100。

l     pdogData:指针型变量。指向读写操作或变换的数据缓冲区。

l     返回值:0表示操作成功,其他值是错误码。

 注意以下几点。

在使用这个函数之前,必须将随加密狗附带的安装程序安装完整,并将安装目录下的Win32dll.dll文件复制到系统目录下。例如:

在Windows 2003下将安装目录下的“\SafeNet China\SoftDog SDK V3.1\Win32\Win32dll\HighDll\ Win32dll.dll”文件复制到“C:\WINDOWS\system32\”文件夹中。

也不知道其他公司产品的加密狗的原理是不是也是这样的,不过我感觉加密狗的基本原理都是这样的,公司提供加密狗的API接口.只不过不同的公司所提供的API接口不一样罢了.

实例:

C#:


using System.Runtime.InteropServices ;

加密狗类:

public unsafe class Dog

{

    public uint DogBytes, DogAddr;  //设置加密狗字节长度和起始地址

    public byte[] DogData;  //设置数据的长度

    public uint Retcode;

    [DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]

    public static unsafe extern uint DogRead(uint idogBytes, uint idogAddr, byte* pdogData);

    [DllImport("Win32dll.dll", CharSet = CharSet.Ansi)]

    public static unsafe extern uint DogWrite(uint idogBytes, uint idogAddr, byte* pdogData);

    public unsafe Dog(ushort num)

    {

        DogBytes = num;

        DogData = new byte[DogBytes]; //设置数据的长度

    }

    public unsafe void ReadDog()

    {

        fixed (byte* pDogData = &DogData[0])

        {

            Retcode = DogRead(DogBytes, DogAddr, pDogData);  //将数据读出加密狗

        }

    }

    public unsafe void WriteDog()

    {

        fixed (byte* pDogData = &DogData[0])

        {

            Retcode = DogWrite(DogBytes, DogAddr, pDogData); //将数据写入加密狗

        }

    }

}

向加密狗里边写入数据:Dog d=new Dog(10);d.DogAddr=0;for(int i=0;i<d.DogData.length;i++)d.DogData[i]=i;d.WriteDog();

读取加密狗里边的数据:Dog d=new Dog(10);byte[] b;d.ReadDog();b=new byte[d.DogData.length];

for (int i=0;i<d.DogData.lengh;i++)b[i]=d.DogData[i];

extern:表明我们用到的该方法是在外部声明的,即该方法是在win32dll.dll程序集里边;

unsafe:表明该加密狗类是不安全的.


 

 

 

 

posted @ 2009-03-28 15:03 Hetter 阅读(2288) 评论(5) 编辑

2009年3月20日

报表学习(一) activereport

发我们可以从www.datadynamics.com下载相应版本的报表控件.

1,ActiveReport,VS2003

在web下使用ActiveReports(成绩报表)

1)安装完控件之后,在visual studio 2003新建项目ActiveStudy

1)右击ActiveStudy ,新建选择Active Reports File(图标),命名score.rpx,打开之后我们就可以设计报表了

2)报表分为PageHeader,Detail,PageFooter三部分.

PageHeader:拖入一个Label控件 lblTitle   Text="学生成绩";

Detail:从工具箱拖入三个文本框分别设置它们的id和datafield为txtName,Name;txtCourseName,CourseName;txtScore,Score;

3)新建一个窗体score.aspx;在该窗体上拖入一个webview控件如下所示:

 <ActiveReportsWeb:WebViewer id="wvScore" runat="server" height="100%" width="100%" ViewType="ActiveXViewer"></ActiveReportsWeb:WebViewer>

其中要注意ViewType属性;该属性有四个值:ActiveXViewr 含义:以ActiveX控件呈现该报表的内容

                     HtmlViewr  含义:以htmlviewer形式呈现报表内容

                     RawHtml   含义:以html格式呈现报表内容

                     AcrobatReader含义:以阅览器的形式呈现该报表的内容

呆会分别给出效果图

4)设置该控件的数据源

代码如下所示:

 

private void Page_Load(object sender, System.EventArgs e)
{
score scoreRpx=new score ();
this.wvScore.Report =scoreRpx ;
DataSet ds=GetDataSource ();
//数据绑定
if(ds.Tables[0].Rows.Count >0)
{
  wvScore.Report.DataSource=ds.Tables[0];
wvScore.DataBind ();
}
}
public DataSet GetDataSource()

     {//

      integrated security=true windows认证 false:混合认证

string strCon="Server=(local);database=Study;Integrated Security=false;uid=sa;pwd=123";
SqlConnection con=new SqlConnection (strCon);
SqlCommand cmd=new SqlCommand();
cmd.Connection=con;
cmd.CommandType=CommandType.Text ;
cmd.CommandText=@"select s.Name,c.Name as 'CourseName',sc.Score from Student s inner join StudentCourse sc on s.ID=sc.StudentID inner join Course c on sc.CourseID=c.ID";
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=cmd;
DataSet ds=new DataSet ();
try
{
sda.Fill (ds);
}
catch(Exception e)
{
  throw e;
}
return ds;


设置完数据源后然后绑定如pageload事件里所示.

datasourse=ds会产生异常,要换成绑定的是哪个表或着在加上一个属性datamember绑定表

5)效果图

ViewType="ActiveXViewer"时

这图片怎么能插上啊,希望博客园的兄弟姐妹能告诉一声,我插了半天没插上

6)总结

这是我刚学报表,从这个例子可以看出设置报表无非就是一下几个步骤

@1:设置报表的每一个部分如本例中的PageHeader,Detail,Footer;(包括各个部分里边的各个控件的设置和位置)

@2:设置报表的数据来源

另外从网上下的控件时候随身带着文档,里边包括了该报表的类库.

17:28:43



 

posted @ 2009-03-20 17:29 Hetter 阅读(210) 评论(0) 编辑

仅列出标题  

导航

统计

公告