仓库管理数据库综合实验
某供应部门管理多个仓库,仓库主要管理物资的入库、出库、库存和采购等事项。
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中数据的更改协调回数据源。
要与数据库打交道,首先必须建立与数据库服务器的连接。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(); //打开连接
登录模块可以分为仓库管理员登陆、部门人员登陆和采购员登陆。用户要进行登陆时,系统会与数据库User表中的用户名、密码与身份进行匹配,如果匹配成功才可以登陆。根据登陆的用户不同,输入不同的用户与密码,显示不同的界面。
//登录按钮
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);
}
}
}
仓库管理员应管理仓库的仓库存放信息、出库入库信息,不同信息表中用标签页进行切换。同时可以在界面右侧显示当前管理员信息,包括管理员编号、姓名和性别,以及当前管理员管理的仓库信息,包括仓库编号与面积。仓库存放信息包括仓库编号,对应存放的物资编号、物资名称以及对应的库存量。
在数据处理所用时间比较长的场合,可以利用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 = "库存量";
可以通过SqlCommand对象提供的方法传递对数据库操作的命令,并返回命令执行的结果。
SqlCommand对象有3种主要对数据库操作方法。
(1)ExecuteNonQuery方法:执行指定SQL语句,但不返回命令执行的表数据。用于SQL语句为UPDATE,INSERT或DELETE的场合。
(2)ExecuteReader方法:该方法能顺序读取数据库中的数据,根据提供的SELECT语句,返回一个SqlDataReader对象,使用该对象的Read方法依次读取每个记录中各字段的内容。
(3)ExecuteScaler方法:用于查询结果为一个值的情况。
实施操作的一般步骤:
(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(); //关闭连接
(1)“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。"
①使用using的形式:using指定了SqlConnection的对象作用的范围,且是独占使用的,当使用结束之后会自动将其进行释放。
②在数据库连接字符串中添加MultipleActiveResultSets=true即可,SQL Server数据库默认的只有一个活动的SqlDataReader,如果想要一个连接允许多个SqlDataReader,那就需要将MultipleActiveResultSets设置为true,其意义为:将数据库连接设置可复用,即可供多个SqlCommand同时使用。同时也要注意在SqlCommand在每次执行ExecuteNonQuery()方法之后,内部会生成一个空的DataReader对象,该对象只有在数据库连接关闭之后,才会被释放掉。
(2)“未将对象引用设置到对象的实例”
错误核心就是“没有找到要查询对的东西或者找的东西是空的。”可能的情况有:
①DataSet为空;
②Sql语句或DataBase的原因导致DataReader为空;
③所设置的变量为空值或没有取到值,一般出现在传递参数的时候出现这个问题,也会在使用DataGridView等数据控件时出现等情况。后来发现代码错的原因是因为DataSet为空造成的。