可空数据的插入和读出(15)

第一步:设计数据库如下,Id自增,主键:

第二步:在页面上 拖动三个TextBox,命名为txtName,txtAge,txtHeight.一个按钮btnNull,并且为他添加Click事件。

第三步:在数据库中直接插入数据和在windows窗体插入数据两者的区别。如下:

(注意:NULL 和0,null和“”都是不一样的。null表示“不知道”)

最终按钮的Click事件代码为:

private void btninNull_Click(object sender, RoutedEventArgs e)
        {//若没有输入姓名,则姓名表达“不知道”。年龄没有输入也该显示“null”,不应该显示0
            //(注意:数据库中NULL 和0,null和“”都是不一样的。null表示“不知道”)
            string name=txtName.Text;
            string age=txtAge.Text;
            string height=txtHeight.Text;
            object objName;
            if (name.Length <= 0)
            {
                //name = null;
                objName = DBNull.Value;//DBNull.Value用来表示数据库中的NULL,但是DBNull.Value是一个类,
            }                      //无法转换成为string类型。所以需要修改下
            else
            {
                objName = name;
            }
            object objAge;
            if (age.Length <= 0)
            {
                // age = null;
                objAge = DBNull.Value;
            }
            else
            {
                objAge = age;
            }
            //在SqlParameter中如果值(第二个参数)为“null”则表示没有提供参数的值,会报错的。
            //SqlHelper.ExecuteNonQuery("insert into T_Person(Name,Age,Height) Values(@Name,@Age,@Height)", new SqlParameter("@Name", name),
             //  new SqlParameter("@Age", age), new SqlParameter("@Height", height));

            SqlHelper.ExecuteNonQuery("insert into T_Person(Name,Age,Height) Values(@Name,@Age,@Height)", new SqlParameter("@Name", objName),
             new SqlParameter("@Age", objAge), new SqlParameter("@Height", height));
        }
    }

第四步,拖一个按钮btnReadNull并添加Cilck事件,用于读取数据库中可空的数据,代码如下:

 private void btnReadNull_Click(object sender, RoutedEventArgs e)
        {
            DataTable table=SqlHelper.ExecuteDataTable("select * from T_Person where Id=1");
            DataRow row=table.Rows[0];
            //读取的值如果在数据库中是NULL则返回DBNull.Value
            //string name =(string)row["Name"];//id为1的在数据库中Name是null,在这样的代码会报错,则修改
            string name;
            if (row["Name"] == DBNull.Value)
            {
                name = null;
            }
            else
            {
                name = (string)row["Name"];
            }
            //int age=(int)row["Age"];
            int? age;//int age;不行,是因为int不可以是null
            if (row["Age"] == DBNull.Value)
            {
                age = null;
            }
            else
            {
                age = (int)row["Age"];
            }
            txtName.Text = name;
            //int height = (int)row["Height"];
        }
    }

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

string是引用类型;

string str = null 没有创建内存空间,str中存放的是空引用指针;

string str = "" 创建了内存空间,str中存放的是指向堆中的指针。

简单地说:

string str ="";

给你一张白纸;

string str = null;

连白纸也没有。

 string.Empty就相当于"" 

一般用于字符串的初始化 

比如: 

string a; 

Console.WriteLine(a);//这里会报错,因为没有初始化

 

而下面不会报错: 

string a=string.Empty; 

Console.WriteLine(a); 

 

或者用于比较: 

if(a=="") 

if(a==string.Empty) 

上面两句是一样的效果。

 string.Empty不分配存储空间

""分配一个长度为空的存储空间  

所以一般用string.Empty

为了以后跨平台,还是用string.empty

  C# 中,大多数情况下 "" string.Empty 可以互换使用。比如:

string s = "";

string s2 = string.Empty;

 if (s == string.Empty) {

 // 

if语句成立 

 判定为空字符串的几种写法,按照性能从高到低的顺序是:

s.Length == 0 优于 s == string.Empty 优于 s == "" 

 您关于String.EmptyNull的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。textBox1.Text的值为零长度字符串 ""

posted @ 2013-06-02 21:08  秋水惜朝  阅读(217)  评论(0编辑  收藏  举报