xml地图|网站地图|网站标签 [设为首页] [加入收藏]
实现任何数据库类型的DbHelper帮助类,数据类型及
分类:编程

本文章为原创内容,如需转载,请注明作者及出处,谢谢!

一.数据类型

1 在主窗口中实例化子窗口

在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象。

Form2 f2 = new Form2();

    1. 值类型

2 通过按钮来显示主窗口

在按钮中需要实现的是窗口的显示

private void Config_Click(object sender, EventArgs e)
        {
            f2.Show();
        }

 

类型 描述 范围 默认值
bool 布尔值 True 或 False False
byte 8 位无符号整数 0 到 255 0
char 16 位 Unicode 字符 U +0000 到 U +ffff ''
decimal 128 位精确的十进制值,28-29 有效位数 (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 0.0M
double 64 位双精度浮点型 (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 0.0D
float 32 位单精度浮点型 -3.4 x 1038 到 + 3.4 x 1038 0.0F
int 32 位有符号整数类型 -2,147,483,648 到 2,147,483,647 0
long 64 位有符号整数类型 -923,372,036,854,775,808 到 9,223,372,036,854,775,807 0L
sbyte 8 位有符号整数类型 -128 到 127 0
short 16 位有符号整数类型 -32,768 到 32,767 0
uint 32 位无符号整数类型 0 到 4,294,967,295 0
ulong 64 位无符号整数类型 0 到 18,446,744,073,709,551,615 0
ushort 16 位无符号整数类型 0 到 65,535 0

3 关闭子窗口而不释放子窗口对象的方法

经查询和实证,修改子窗口中Dispose(在子窗口设计器中寻找修改)的方法是可行的。更改如下:

protected override void Dispose(bool disposing)
        {
            Hide();
            //if (disposing && (components != null))
            //{
            //    components.Dispose();
            //}
            //base.Dispose(disposing);
        }

一、在System.Data.Common命名空间下,存在这样的一个类:

    1. 引用类型
      1. 数组
      2. 类(自定义类)
      3. 字符串
      4. 接口
      5. Object
      6. 委托
    2. 指针类型

      1. 官方给出的说明

        1.   在指针类型中的 * 之前指定的类型被称为“referrent 类型”。 以下任一类型均可为 referrent 类型:

          • 任何整型类型:sbyte、byte、short、ushort、int、uint、long、ulong。
          • 任何浮点类型:浮点、双精度。
          • 字符。
          • 布尔型。
          • 小数。
          • 任何枚举类型。
          • 任何指针类型。 这允许如 void** 的表达式。
          • 任何仅包含非托管类型字段的用户定义的结构类型。

          指针类型不从对象继承,并且指针类型与 object 之间不存在转换。 此外,装箱和取消装箱不支持指针。但是,你可在不同的指针类型之间以及指针类型和整型之间进行转换。

          在同一个声明中声明多个指针时,星号 (*) 仅与基础类型一起写入;而不是用作每个指针名称的前缀。 例如:

          C# 复制

          int* p1, p2, p3;   // Ok
          int *p1, *p2, *p3;   // Invalid in C#
          

          指针不能指向引用或包含引用的结构,因为无法对对象引用进行垃圾回收,即使有指针指向它也是如此。垃圾回收器并不跟踪是否有任何类型的指针指向对象。

        2. 指针简单应用

          1.   

                //指针
                        unsafe
                        {
                            char* cptr = stackalloc char[26];//分配内存
                            //stringAppend();
                            for (int i = 0; i < 26; i++)
                            {
                                cptr[i] = (char)(i + 65);
                            }
                            for (int i = 0; i < 26; i++)
                            {
                                Console.WriteLine(string.Format("{0}:{1}",(int)&cptr[i],cptr[i]));
                            }
                        }
            

            定义一个char类型指针并分配26字节内存,for循环给指针赋值,输出int类型指针地址及它转化位string的值:

          2. 结果为:

          3. 图片 1

             

          4. 在内存中查看 :调试-》窗口-》内存-》内存1 ,我们把int类型指针值复制到地址栏,vs自动转化位十六进制, 右键-》带符号显示 ,得到结果为char对应的数字

             

4 在父窗口关闭时销毁子窗口对象

由于需要在父窗口关闭是销毁子窗口对象,因此,在父窗口的关闭动作FormClosed中添加调用子窗口f2的销毁函数。

 private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            f2.Close();
        }  

子窗口类中添加的关闭函数如下:

 public void Close()
        {

            this.Dispose();

        }

出处:


另外还有一种方式:

子窗体定义一个委托,父窗体实例化子窗体时注册子窗体的委托事件(具体功能是实现父窗口的控件变化),子窗体关闭时调用事件方法。

父窗体

public void ShowPopWindow()
        {
            TestA sub = new TestA();
            sub.CloseWindow += new Action(sub_CloseWindow);
            sub.show();
        }

        void sub_CloseWindow()
        {
            //改变父窗体控件内容
        }

子窗体

public class TestA
    {
        public event Action CloseWindow;

        protected virtual void OnCloseWindow()
        {
            Action handler = CloseWindow;
            if (handler != null) handler();
        }

      //子窗体关闭事件
        private void CloseSubWindow()
        {
            OnCloseWindow();
        }
    }

出处:


根据上面的说明,我们自己实现自己的功能,我的功能其实很简单,就一行代码,释放资源,

Form2 fui = null;

private void button1_Click(object sender, EventArgs e)
        {
            if (fui == null)
                fui = new userUserInfo();
            fui.MdiParent = this;
            fui.FormClosed += delegate(object obj, FormClosedEventArgs arg) { fui = null; };
            fui.Show();
            fui.Activate();
        }

但需要注意,在 fui.FormClosed += delegate(object obj, FormClosedEventArgs arg) { fui = null; };中使用的参数,不要和按钮事件中参数名相同,注意参数冲突。

出处:

    //
    // 摘要:
    //     表示一组方法,这些方法用于创建提供程序对数据源类的实现的实例。
    public abstract class DbProviderFactory
    {
        //
        // 摘要:
        //     初始化 System.Data.Common.DbProviderFactory 类的新实例。
        protected DbProviderFactory();

        //
        // 摘要:
        //     指定特定的 System.Data.Common.DbProviderFactory 是否支持 System.Data.Common.DbDataSourceEnumerator
        //     类。
        //
        // 返回结果:
        //     如果 System.Data.Common.DbProviderFactory 的实例支持 System.Data.Common.DbDataSourceEnumerator
        //     类,则为 true;否则为 false。
        public virtual bool CanCreateDataSourceEnumerator { get; }

        //
        // 摘要:
        //     返回实现 System.Data.Common.DbCommand 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbCommand 的新实例。
        public virtual DbCommand CreateCommand();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbCommandBuilder 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbCommandBuilder 的新实例。
        public virtual DbCommandBuilder CreateCommandBuilder();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbConnection 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbConnection 的新实例。
        public virtual DbConnection CreateConnection();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbConnectionStringBuilder 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbConnectionStringBuilder 的新实例。
        public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbDataAdapter 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbDataAdapter 的新实例。
        public virtual DbDataAdapter CreateDataAdapter();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbDataSourceEnumerator 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbDataSourceEnumerator 的新实例。
        public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbParameter 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbParameter 的新实例。
        public virtual DbParameter CreateParameter();
        //
        // 摘要:
        //     返回提供程序的类的新实例,该实例可实现提供程序的 System.Security.CodeAccessPermission 类的版本。
        //
        // 参数:
        //   state:
        //     System.Security.Permissions.PermissionState 值之一。
        //
        // 返回结果:
        //     指定 System.Security.Permissions.PermissionState 的 System.Security.CodeAccessPermission
        //     对象。
        public virtual CodeAccessPermission CreatePermission(PermissionState state);
    }

二. 基本类型主要差异

我们可以看到,在此类中,有很多用于创建数据库相关对象的类型,如DbConnection,DbCommand,DbDataAdapter等。

    1. 基本类型:值类型,引用类型
      1. 相同点:  
        1. 引用类型可以实现接口,值类型当中的结构体也可以实现接口;
        2. 引用类型和值类型都继承自System.Object类。

而且,实现诸如SqlConnection、SqlCommand、SqlDataAdapter(这里用的是SQL Server)的类型,都分别继承自DbConnection,DbCommand,DbDataAdapter,

          2.不同点

因此,我们可以使用DbProviderFactory来创建我们想要的、可实现任何数据库的DbHelper。

             1.值类型直接储存在内存栈中,引用类型在栈中储存它在堆中内存单位的地址。

二、实现基本的DbHelper帮助类

             2.值类型存取速度快,引用类型存取速度慢。

1、我们将DbHelper定义为抽象类,并在类中提供一个抽象可读属性,名称叫DbProviderFactory,返回类型为DbProviderFactory(注:名称与返回类型可以为一样,也可以不一样),

             3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用。

本文由澳门新葡亰手机版发布于编程,转载请注明出处:实现任何数据库类型的DbHelper帮助类,数据类型及

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文