数据库SQL Server 2008&Visual Studio建立管理系统

仓库管理数据库综合实验

某供应部门管理多个仓库,仓库主要管理物资的入库、出库、库存和采购等事项。

1.ADO.NET

ADO.NET是一组向 .NET Framework程序员公开数据访问服务的类。提供对诸如 SQL Server XML这样的数据源以及通过 OLE DB ODBC公开的数据源的一致访问。

.NET Framework数据提供程序

l Connection对象提供到数据源的连接。

l Command对象可以访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。

l DataReader可从数据源提供高性能的数据流。

l DataAdapter DataSet对象和数据源之间起到桥梁作用。 

l DataAdapter使用 Command对象在数据源中执行 SQL命令以向 DataSet中加载数据,并将对 DataSet中数据的更改协调回数据源。


2.数据库连接

要与数据库打交道,首先必须建立与数据库服务器的连接。ADO.NET使用SqlConnection对象与SQL Server进行连接。在SqlConnection对象中,需要指定一个连接字符串。然后通过连接字符串创建SqlConnection对象。同时添加对命名空间的引用。

using System.Data.SqlClient; //命名空间引用
string str = @"Data Source=(local);Initial Catalog = warehouse ;Integrated Security = SSPI " ; //连接字符串
SqlConnection conn = new SqlConnection(str); //创建对象
conn.Open();  //打开连接

3.登陆界面

  登录模块可以分为仓库管理员登陆、部门人员登陆和采购员登陆。用户要进行登陆时,系统会与数据库User表中的用户名、密码与身份进行匹配,如果匹配成功才可以登陆。根据登陆的用户不同,输入不同的用户与密码,显示不同的界面。

数据库SQL Server 2008&Visual Studio建立管理系统_第1张图片

//登录按钮
private void button1_Click(object sender, EventArgs e)
{
    string str = @"Data Source=(local);Initial Catalog=warehouse;Integrated Security=SSPI";
    string sqlLogin = "SELECT * FROM [User] WHERE (UNo =" + loginName.Text + ") AND (UPwd = '" + loginPwd.Text + "') AND (UType = '" + loginType.Text + "')";

            //定义connection对象
            using (SqlConnection conn = new SqlConnection(str))
            {
                //创建SQL命令
                SqlCommand queryCmd = new SqlCommand(sqlLogin, conn);
                // 打开connection对象,定义并执行 DataReader对象,结果集输出到控制台
                try
                {
                    //建立连接
                    conn.Open();

                    SqlDataReader sdr=queryCmd.ExecuteReader();
                    if (sdr.Read())
                    {
                        if (loginType.Text.Equals("Administrator"))
                        {
                            FormA f = new FormA(Convert.ToInt32(loginName.Text));
                            f.Show();
                        }
                        else if (loginType.Text.Equals("Department"))
                        {
                            FormD f1 = new FormD(Convert.ToInt32(loginName.Text));
                            f1.Show();
                        }
                        else
                        {
                            FormB f2 = new FormB(Convert.ToInt32(loginName.Text));
                            f2.Show();
                        }
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("登录失败!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }


            }
        }

4.管理员界面

   仓库管理员应管理仓库的仓库存放信息、出库入库信息,不同信息表中用标签页进行切换。同时可以在界面右侧显示当前管理员信息,包括管理员编号、姓名和性别,以及当前管理员管理的仓库信息,包括仓库编号与面积。仓库存放信息包括仓库编号,对应存放的物资编号、物资名称以及对应的库存量。

数据库SQL Server 2008&Visual Studio建立管理系统_第2张图片


4.1 数据表显示

  在数据处理所用时间比较长的场合,可以利用SqlDataAdapter对象通过断开连接的方式完成数据库与本机DataSet之间的交互。该对象通过Fil方法将数据库数据填充到本机内存的DataSet或者DataTable中,填充完成后与数据连接就自动断开,当对DataSet中的表处理完成后,也可以通过Update方法进行更新。

  在断开连接方式下操作数据库的一般步骤:

(1)创建SqlConnection的实例

(2)创建SqlDataAdapter的实例,可根据SELECT语句生成

(3)创建DataSet实例

(4)使用Fill方法将数据库中的表填充到DataSet的表中

(5)利用DataGridView显示数据

//显示库存情况表
sqlS = "SELECT * FROM [Store] WHERE WNo=" + wno; //选择该仓库号对应的库存信息
SqlDataAdapter adapter = new SqlDataAdapter(sqlS, conn); //根据SQL语句数据适配器
DataSet set=new Dataset(); //创建实例
adapter.Fill(set, "Store"); //填充数据
t = set.Tables[0];
dataGridView1.DataSource = t;  //设置数据源
dataGridView1. Sort (dataGridView1. Columns [0], ListSortDirection. Ascending); //设置排序方式
//设置列名称
dataGridView1.Columns[0].HeaderText = "仓库编号";
dataGridView1.Columns[1].HeaderText = "物资编号";
dataGridView1.Columns[2].HeaderText = "物资名称";
dataGridView1.Columns[3].HeaderText = "库存量";

4.2 数据库插入、删除、查询、更新操作

可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行的结果。

SqlCommand对象有3种主要对数据库操作方法。

1ExecuteNonQuery方法:执行指定SQL语句,但不返回命令执行的表数据。用于SQL语句为UPDATE,INSERTDELETE的场合。

2ExecuteReader方法:该方法能顺序读取数据库中的数据,根据提供的SELECT语句,返回一个SqlDataReader对象,使用该对象的Read方法依次读取每个记录中各字段的内容。

3ExecuteScaler方法:用于查询结果为一个值的情况。

实施操作的一般步骤:

1)创建SqlConnection的实例

2)创建SqlCommand的实例

3)打开连接

4)执行命令

5)关闭连接

//添加库存代码
string sqlI = "INSERT INTO [Store] VALUES (" + wno + "," + mno + ", '" + mname + "'," + snum + ")";  //添加库存SQL语句
string sqlS = "SELECT SNum FROM [Store] WHERE MNo = " + mno + "AND WNo=" + wno; //查询库存中对应库存量SQL语句
//使用using语句确保关闭连接
using (SqlConnection conn = new SqlConnection(str)){
    conn.Open(); //打开连接
//创建SqlCommand实例,并设置SQL语句和使用的连接实例
    SqlCommand query = new SqlCommand(sqlS, conn); 
    SqlDataReader sdr = query.ExecuteReader();
if (sdr.Read()){
        //如果已有该物资库存 则更新库存
        snum += Convert.ToInt32(sdr[0].ToString());//获取第一个字段内容为已有库存
        string sqlU = "UPDATE [Store] SET SNum= " + snum + "WHERE MNo=" + mno + "AND WNo=" + wno;  //更新SQL语句
         SqlCommand upd = new SqlCommand(sqlU, conn);
         //将执行SQL语句影响的记录数赋值给u
         int u = upd.ExecuteNonQuery();
         if (u != 0) { //如果有记录更新
         MessageBox.Show("添加成功!", "成功", MessageBoxButtons. OK, MessageBoxIcon.Information); //显示添加成功信息窗
            this.Close(); //关闭添加库存窗口 }
  }
        else {
       //没有库存 插入新的库存信息
       SqlCommand insert = new SqlCommand(sqlI, conn);
       int ins = insert.ExecuteNonQuery();
       if (ins != 0) {
       MessageBox.Show("添加成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
       this.Close(); }
       }
Conn.Close(); //关闭连接

5.总结

(1)“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"

①使用using的形式:using指定了SqlConnection的对象作用的范围,且是独占使用的,当使用结束之后会自动将其进行释放。

②在数据库连接字符串中添加MultipleActiveResultSets=true即可,SQL Server数据库默认的只有一个活动的SqlDataReader,如果想要一个连接允许多个SqlDataReader,那就需要将MultipleActiveResultSets设置为true,其意义为:将数据库连接设置可复用,即可供多个SqlCommand同时使用。同时也要注意在SqlCommand在每次执行ExecuteNonQuery()方法之后,内部会生成一个空的DataReader对象,该对象只有在数据库连接关闭之后,才会被释放掉。


(2)“未将对象引用设置到对象的实例”

错误核心就是“没有找到要查询对的东西或者找的东西是空的。”可能的情况有:

①DataSet为空;

②Sql语句或DataBase的原因导致DataReader为空;

③所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用DataGridView等数据控件时出现等情况。后来发现代码错的原因是因为DataSet为空造成的。








你可能感兴趣的:(数据库)