c#操作数据库(winform如何修改数据库设置)

鉴于很多童鞋们对数据库操作不是很熟悉,这里对数据库操作的相关知识做个介绍。首先介绍ADO.NET中的几个常用的对象,介绍的很简单。1.SqlConnection 这是数据库连接对象,通过对其进行实例化来创建针对数据库的连接,其参数为数据库连接字符串。如下:S

大家好,又见面了,我是你们的朋友全栈君。鉴于很多童鞋们对数据库操作不是很熟悉,这里对数据库操作的相关知识做个介绍。

首先介绍ADO.NET中的几个常用的对象,介绍的很简单。
1.SqlConnection  这是数据库连接对象,通过对其进行实例化来创建针对数据库的连接,其参数为数据库连接字符串。如下:

SqlConnection conn = new SqlConnection(strConnection)

上面strConnection代表连接字符串

      上面建立了连接,这个连接的名称为conn,这就相当于建立了一天从程序连接到数据库的水管,水管拉好了,但是要想从数据库中取出数据,还得拧开水龙头才可以,所以使用下面的语句打开水龙头(打开连接)
conn.Open();

        OK.,连接打开了,下面就可以取数据了,也就是可以接水了。但是需要注意的是水接完后,还得把水龙头关掉,这就需要下面的语句来执行
conn.close();
    2.   SqlCommand  当然上面关掉水龙头的的动作应该放在程序的最后,也就是我们取完需要的数据之后。再执行了conn.open()之后,我们就可以对数据库进行操作了。对数据的操作包括插入,更改,删除和查询操作,这是最基本的几个操作。针对这些操作ADO.NET提供了不同的对象来方便大家使用。我们首先来说增加,更改和删除操作。

         这些操作离不开SqlCommand对象,顾名思义,这个对象时用来执行命令的,什么命令呢?当然是数据库操作命令了,也就是增加,删除,更改,查询这些命令,更具体的说也就是执行上面几种操作的sql语句。OK,既然如此,我们首先就要创建这个对象,怎么创建呢?先说两种方法。
•使用上面创建的数据库连接对象conn来创建,语法如下:SqlCommand cmd = conn.CreateCommand()

•直接实例化SqlCommand对象,然后将数据库连接对象赋给SqlCommand对象的Connection属性。如下•

SqlCommand cmd = new SqlCommand();cmd.Connection = conn;

大家会发现,无论哪种方法都是将数据库连接对象conn和SqlCommand对象进行关联,这是为什么呢?正如上面所说的,SqlCommand对象时用来执行sql语句的,也就是对数据库的增加,更改,删除,查询操作,但是我们是针对哪个数据库进行操作呢?关键就在这里,大家回想一下数据库连接字符串,里面指定了数据库所在的服务器,以及数据库的名称。这就很明白了,我们将特定的数据库连接对象和SqlCommand对象关联起来,就指明了我们操作的是哪个数据库。比如我们在创建了conn对象之后,在创建一个conn1对象,把其连接字符串改一改,例如将服务器的名称改了,这样可能就是连接另一台计算机上的数据库了。OK,事情就是这样你可以在程序中创建多个数据库连接对象,可以为SqlCommand对象随意指定一个数据库连接对象。

      好了,上面已经创建了SqlCommand对象,并且将其和数据库连接对象关联起来,这就解决了对哪个数据进行操作的问题。下面要解决的问题是对数据库执行什么操作。如果是增加数据,我们就编写insert语句,如果是更改,就编写Update语句,如果是删除,就是用delete语句,如果是查询,就使用selsect语句。这里假设我们要向数据库中的某张表增加一条数据,其sql语句是

string sqlstr="insert into Users(username,password,email) values(@username,@password,@email)"

    这里我们并没有使用字符串拼接的方式为字段赋值,而是使用了@username,@password,这种方式,我们可以将其看做占位符,在后面的代码中将会使用实际的值将其替换,微软说这种方式有效解决了sql注入的问题,至于其内部到底怎么实现的,就搞不清楚了,总之这是微软推荐的一种方式,我们以后也要使用这种方式。

      然后将这条语句赋给SqlCommand对象的CommdText属性,这样SqlCommand对象就知道要执行什么操作了,如下所示:

cmd.CommandText = sqlstr;

      OK,现在给@username,@password,@email这三个占位符赋值,赋值的方法很多,下面采用的方式是比较普遍的一种:
                  

                    SqlParameter username = new SqlParameter("@username", this.txt_username.Text);
                    SqlParameter password = new SqlParameter("@password", this.txt_username.Text);
                    SqlParameter email = new SqlParameter("@email", this.txt_username.Text);
                    cmd.Parameters.Add(username);  
                    cmd.Parameters.Add(password);
                    cmd.Parameters.Add(email);

SqlParameter 类,顾名思义,这是一个用来操作sql语句中的参数(@username,@password,@email就是这里所指的参数)的类,它的作用就是将sql语句中的参数和其实际值产生一个映射关系,我们举个例子来说,页面上我们使用三个控件来供用户输入用户名,密码,邮箱信息,假设其ID分别为txt_username,txt_password,txt_email。OK,我们要做的工作就是使用txt_username控件的值替代上面sql语句中的@username,使用txt_password替代@password,使用txt_email替代@email。好了,目的就是这样。那么如何达成目标呢?就是使用上面的语句

SqlParameter username = new SqlParameter("@username", this.txt_username.Text);

这行代码就是告诉程序,将来在执行这条sql语句时,要使用this.txt_username.Text替换@username。

OK 映射关系已经建立起来了,大家已经发现了,每一个SqlParameter对象存储了一对映射关系,然后我们要做的就是将这几对映射关系添加到SqlCommand对象,也就是使用上面的语句:

cmd.Parameters.Add(username);

这句话的作用就是告诉程序cmd在执行sql语句时,要使用这些映射关系替换sql语句中的参数(占位符)。

OK,现在我们知道了要操作哪个数据库,要进行什么操作,下面的问题就是如何操作了。增加,更改和删除三种操作不需要返回数据,只需要返回一个操作状态就行了,这个状态就是一个整形数字。1代表操作成功。所以我们可以使用
cmd.ExecuteNonQuery()
方法来执行这条语句,ExecuteNonQuery()方法就是执行一条插入语句或者一条更改语句或者一条删除语句,其返回的是受影响的行数,只要其返回值>1,就表明执行成功。至于其为什么不能执行查询语句呢?因为查询语句要返回的是数据,而不是查询出了几行,所以不能使用这个方法。所以我们可以这样使用此方法:

                   if (cmd.ExecuteNonQuery() >0)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('注册成功,请登录')</script>", false);
                        Response.Redirect("Login.aspx");
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('注册失败')</script>", false);
                    }
 

                        

        

OK,上面讲了插入,更改和删除的用法都是一样的,所需更改的只有sql语句。

下面我们说下从数据库中查询数据。

前面都一样,所需要更改的只是sql语句,我们更改前面的

string sqlstr="select * from Users where username=@username";

现在我们要获取的是实实在在的数据,而不是影响的行数,所以不能使用ExecuteNonQuery。

最常用的有三种查询数据的方式,我们先介绍SqlCommand对象的ExecuteReader方法,此方法的返回值为SqlDataReader对象,这个对象也是ADO,NET中一个非常重要的对象,这个对象在程序和数据库之间建立了一个流,也可以理解为在程序和数据库之间划了一条线,这条线最开始指向数据库中查询出来的结果集的第1行的上面(当然身为程序员,我们可以给其一个更形象化的名字–指针),如下图所示:

c#操作数据库(winform如何修改数据库设置)

c#操作数据库(winform如何修改数据库设置)c#操作数据库(winform如何修改数据库设置)

红色箭头就是执行玩ExecuteReader方法后指针的初始位置—-在第一条记录的前面。

这时候我们可以使用Read()方法将指针移动到下一条记录。Read()方法的作用有2个,首先返回一个bool值,这个值表示当前记录是否有下一条记录,然后将指针移动下一条记录。ExecuteReader()方法先说到这里,后面会有详细的例子,大家一看就明白了。

也许大家已经注意到了,我们上面的sql语句

string sqlstr="select * from Users where username=@username";

查询的是所有列,事实上在登录验证的时候,只查询密码列就可以了,所以这行代码可以改成

string sqlstr="select password from users where username=@username";

在实际应用中,数据库中存储的用户名肯定是唯一的,所以上面语句查询出来的结果应该是1行(假设用户输入的用户名存在),而且这1行只有1列—密码列(password),也就是说查询出来的结果是一个值,这个值存储在结果集的第1行,第1列。对于这种情况的查询,我们可以是也弄个ExecuteScalar()方法,此方法返回的是一个Object类型的对象,所以我们在使用时还需要类型转换,下面有例子,一看就会明白。

下面介绍第三种查询数据的方式,这涉及到另外3个对象SqlDataAdapter和DataSet或者DataTable.

3.    SqlDataAdapter和DataSet,DataTable

       首先说一下DataTable对象,大家都知道HTML中的Table标签,其是由行和列组成的一个表格,同样DataTable也是有行和列组成的一个表格,每个单元格中存储的都是数据。

       然后是DataSet对象,此对象就是一个DataTable的集合,可以通过下标来访问其中特定的DataTable。

       重点是SqlDataAdapter对象,此对象的作用是从数据库中查询出数据,然后填充到DataTable或者DataSet中(填充DataSet,其实还是填充到DataTable中,我们以后就直接使用DataTable,而不再重复DataSet)。

        大家留意数据库中查询出得结果集的样式,如下图所示:

c#操作数据库(winform如何修改数据库设置)

   

它是以表格的形式来显示的,而DataTable 也是以这种形式来存储查询到的结果集的。大家记住这张图,这对于后面对DataTale的操作很有帮助

下面我们要讨论的就是SqlDataAdapter如何使用了。这个对象的使用方法很多,为了大家易于理解,我这里只说一种,其余的大家可以自己去尝试。步骤如下:

  • 声明数据库连接对象,这在前面已经实现
  • 声明SqlCommand对象,这在前面已经实现
  • 将SqlDataAdapter对象和SqlCommand对象产生关联。语法入选:
      SqlDataAdapter adapter=new SqlDataAdapter(cmd);
  • 使用SqlDataAdapter对象的Fill方法来填充DataTable,语法如下:
      DataTable dt=new DataTable();
      adapter.Fill(dt);

第3个步骤是和SqlCommand对象相关联,获取此对象的CommandText属性,也就是获取我们要执行的sql语句。

第4个步骤中的Fill方法至少执行了三个工作

  • 打开连接,相当于conn,open(),所以我们使用SqlDataAdapter对象时,不用写这句代码了,连接会自动打开的。
  • 执行CommandText属性所对应的sql语句
  • 将查询的结果填充到DataTable中

OK,现在我们已经完成了从数据中查询数据的工作吗,接下来就是如何操作这些数据了。下面会给出例子,会用注释说明。 不多说了,上例子。

4      实例说明

实现简单的注册,登录功能

首先是注册页面,布局如下:

c#操作数据库(winform如何修改数据库设置)

DataTable dt=new DataTable();
                    adapter.Fill(dt);

后台代码如下所示:

string strConnection = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
            //实例化数据库连接对象
            using (SqlConnection conn = new SqlConnection(strConnection))
            {
                //实例化命令对象
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "insert into Users(username,password,email) values(@username,@password,@email)";
                    //实例化SqlParameter对象,为@username等建立映射关系
                    SqlParameter username = new SqlParameter("@username", this.txt_username.Text);
                    SqlParameter password = new SqlParameter("@password", this.txt_username.Text);
                    SqlParameter email = new SqlParameter("@email", this.txt_username.Text);
                    //将映射关系添加到cmd中
                    cmd.Parameters.Add(username);
                    cmd.Parameters.Add(password);
                    cmd.Parameters.Add(email);
                    //打开数据连接
                    conn.Open();
                    //执行插入操作
                    if (cmd.ExecuteNonQuery() >0)
                    {                        
                        Response.Redirect("Login.aspx");
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('注册失败')</script>", false);
                    }
                }
            }

然后是登录页面,布局如下:

c#操作数据库(winform如何修改数据库设置)

后台代码如下:

 //连接字符串
            string strConnection = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
            //实例化数据库连接对象
            using (SqlConnection conn = new SqlConnection(strConnection))
            {
                //实例化命令对象
                using (SqlCommand cmd = conn.CreateCommand())
                {                    
                    cmd.CommandText = "select password from users where username=@username";
                    //实例化SqlParameter对象,为@username等建立映射关系
                    SqlParameter username = new SqlParameter("@username", this.txt_username.Text);
                    //将映射关系添加到cmd中
                    cmd.Parameters.Add(username);
                    //打开数据连接
                    conn.Open();
                    object obj = cmd.ExecuteScalar();
                    if (obj == null)
                    {
                        ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('用户名不存在')</script>", false);
                    }
                    else
                    {
                        string password = Convert.ToString(obj);
                        //比较从数据库获取的密码和用户输入的密码是否一致
                        if (password != this.txt_password.Text)
                        {
                            ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('密码不正确')</script>", false);
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('登陆成功')</script>", false);
                        }
                    }
                }
            }

上面使用的是cmd.ExecuteScalar()方法来获取查询结果。下面我们改成使用SqlDataReader对象来操作数据

//连接字符串
            string strConnection = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
            //实例化数据库连接对象
            using (SqlConnection conn = new SqlConnection(strConnection))
            {
                //实例化命令对象
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select password from users where username=@username";
                    //实例化SqlParameter对象,为@username等建立映射关系
                    SqlParameter username = new SqlParameter("@username", this.txt_username.Text);
                    //将映射关系添加到cmd中
                    cmd.Parameters.Add(username);
                    //打开数据连接
                    conn.Open();
                    SqlDataReader reader = cmd.ExecuteReader();
                    //判断是否有查询结果
                    if (reader.HasRows)
                    {
                        //读取下一行
                        while (reader.Read())
                        {
                            string password =Convert.ToString(reader.GetSqlString(reader.GetOrdinal("password")));
                            if (string.IsNullOrEmpty(password))
                            {
                                ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('用户名不存在')</script>", false);
                            }
                            else
                            {                                
                                //比较从数据库获取的密码和用户输入的密码是否一致
                                if (password != this.txt_password.Text)
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('密码不正确')</script>", false);
                                }
                                else
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('登陆成功')</script>", false);
                                }
                            }

                        }
                    }
                    
                }
            }

下面解释一下红色的那句代码。可以将其拆解开来。

reader.GetOrdinal(“password”):获取指定列的序号,也就是说SqlDataReader对象每次只读取1行,这个方法获取的是“password”这一列在这1行的序号,也就是索引

reader.GetSqlString(reader.GetOrdinal(“password”)):GetSqlString方法根据列的序号获取列的值

最后将返回值转换成string类型

最后使用第三种方式,代码如下:

//连接字符串
            string strConnection = "user id=sa;password=sa;initial catalog=MyTest;Server=YHB;Connect Timeout=30";
            //实例化数据库连接对象
            using (SqlConnection conn = new SqlConnection(strConnection))
            {
                //实例化命令对象
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = "select password from users where username=@username";
                    //实例化SqlParameter对象,为@username等建立映射关系
                    SqlParameter username = new SqlParameter("@username", this.txt_username.Text);
                    //将映射关系添加到cmd中
                    cmd.Parameters.Add(username);
                    //声明SqlDataAdapter对象

                    SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    //判断是否有查询结果
                    if (dt.Rows.Count>0)
                    {

                        //因为最多只返回一行数据(因为用户名是唯一的),所以可以直接使用dt.Rows[0]标示第1行,使用dt.Rows[0]["password"]来获取第1行中列名称为"password"的字段的值。
                            string password = Convert.ToString(dt.Rows[0]["password"]);
                            if (string.IsNullOrEmpty(password))
                            {
                                ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('用户名不存在')</script>", false);
                            }
                            else
                            {
                                //比较从数据库获取的密码和用户输入的密码是否一致
                                if (password != this.txt_password.Text)
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('密码不正确')</script>", false);
                                }
                                else
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "提示", "<script>alert('登陆成功')</script>", false);
                                }
                            }

                        }
                }
            }

好了,今天的内容就基本这些,大家获取还是不太明白,比如什么时候使用SqlDataReader,什么时候使用SqlDataAdapter,这些我会再用一篇博客的篇幅来讲。

到现在为止我想大家滴数据库操作的流程应该是基本清楚了,如果还不明白,就随时问我

我相信,离100步不远了!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129319.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SqlServer 函数Declare通过传变量查询超慢解决办法

    SqlServer 函数Declare通过传变量查询超慢解决办法from参考:1,Declare传参查询速度慢,直接放入参数执行sql却快,求大牛给原因2,OPTION(RECOMPILE)提高带参数执行SQL语句的索引效率 遇到的问题:通过参数执行sql函数查询速度超慢示例示例代码:class=”lang:tsqldecode:true”>declare@prefixnvarchar(10)=’095-0021-‘;…

  • AC自己主动机 总结

    AC自己主动机 总结

  • 图像识别与卷积神经网络

    图像识别与卷积神经网络卷积神经网络是除了全连接神经网络以外另一个常用的网络结果,其在图像识别方面表现十分突出。本文结合Tensorflow:实战Google深度学习框架,讲述卷积神经网络常用数据集,介绍卷积网络的结构思想,以及通过TensorFlow实现其设计。1图像识别数据集MNIST手写体识别数据集解决是一个相对简单的问题,而对于更加复杂的类别,可以用到CIFAR数据集。比如CIFAR10数据集收集了来自10…

  • python解释器找不到_python解释器路径

    python解释器找不到_python解释器路径Pycharm“nothingtoshow”ininterpreters(解决Pycharm无法找到编译器的问题)问题描述解决方案问题原因解决过程问题描述暑假放假两周,两周没写代码,打开PyCharm发现编译器找不到了(PythonInterpreterNothingtoshow),程序自然也无法运行,如图:解决方案解决方案来自StackOverflow,原出处:link.(https://stackoverflow.com/questions/67297284/pycharm

  • git 重置用户名 密码信息

    gitclone时,权限不够。如fatal:unabletoaccess:TherequestedURLreturnederror:403可能原因是,你之前在本电脑使用过git.但是以前和现在又不是同一个账户。所以当你现在使用gitcloneurl时,默认使用以前的账户信息。所以出现没有权限的状况。解决方法:重置本机保留的gitconfig信息。…

  • 《人工神经网络原理》读书笔记(六)-Boltzmann机[通俗易懂]

    《人工神经网络原理》读书笔记(六)-Boltzmann机[通俗易懂]全部笔记的汇总贴:《人工神经网络原理》-读书笔记汇总一、随机型神经网络的提出BP和Hopfield网络陷入局部最小点的原因网络误差或能量函数构成了含有多个极小点的非线性超曲面;网络误差或能量函数只能按照梯度下降方向单调变化,而不能有任何上升趋势。随机型神经网络的基本思想不但能够让网络误差或能量函数按照梯度下降方向变化,也能够让它们按照某种方式向梯度上升方向变化,这样才有可能使网络跳出局部极小点而向全局极小点收敛。随机型神经网络的特点神经元的输出状态有概率决定;网络连接权值的调整

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号