知识点:
1.为了保证链接始终能够关闭,一般要使用try...finally..。
把链接打开放在try中,把链接关闭放在finally中。
例:
try
{
conn.Open();
...
}
finally
{
conn.Close();
...
}
2.使用一个函数返回SqlDataReader,简化代码,但还要保证链接能够关闭。
例:
public SqlDataReader GETSqldatareader(string name)
{
....
}
执行命令时,如果关闭关联的DataReader对象(dr),则关联的Connection对象(conn)也关闭。
例:
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
....
dr.Close();
3.为了保证数据的安全性---使用命令参数:
cmd.CommandText = ".....@uid ....";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@uid","值")
cmd.ExecuteXXXXX();
4.ExecuteScalar()执行SQL语句,返回首行首列中的值。
它一般用来执行聚合函数的查询。(没有练习...)
5.事务Transaction
ACID - A原子性。C一致性。I-隔离性。D持久性。
两类事务:
链接内事务:在链接打开后,使用事务控制多条语句的执行。
1.创建事务对象。
SqlTransanction trans = conn.BeginTransaction(); //注意必须是链接打开后编写
2.把事务对象挂到命令对象上,让命令执行带有事务的功能。
cmd.Transaction = trans;
3.按照之前所讲得执行命令操作数据库
a.成功后调用事务对象的Commit()方法来提交执行的结果。
b.失败后调用事务对象的Rollback()方法来回滚执行前的状态。
物资赈灾发放代码:
namespace ConsoleApplication40
{
class Program
{
public const string CONNECTIONSTRING =
"server=.;database=zhenzai;uid=sa;pwd=5587725";
//简化代码,还要保证能链接能够关闭
static SqlDataReader GETSqldatareader(string name)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from KC where WzName=@name";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@name", name);
//执行命令时,如果关闭关联的DataReader对象(dr),则关联的Connection对象(conn)也
关闭
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
//库存增加
static void ADDKC()
{
Console.WriteLine("物资库存维护");
Console.Write("请输入物资名称:");
string name = Console.ReadLine();
Console.Write("请输入计量单位:");
string unit = Console.ReadLine();
Console.Write("请输入库存数量:");
int num = Convert.ToInt32(Console.ReadLine());
Console.Write("请输入物资单价:");
decimal price = Convert.ToDecimal(Console.ReadLine());
//数据库操作
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
//打开数据库
conn.Open();
SqlCommand cmd = conn.CreateCommand();
//设置链接内事务
SqlTransaction trans = conn.BeginTransaction();//使用链接对象创建事务对象
//把事务对象挂到命令对象上,让命令执行带有事务对象的功能
cmd.Transaction = trans;
try
{
//cmd.CommandText = "insert into KC values('" + name + "','" + num + "','"
+ unit + "','" + price + "')";
//使数据更安全,不会被攻击
cmd.CommandText = "insert into KC values(@name,@num,@unit,@price)";
cmd.Parameters.Clear();//将原有的数据清一把
cmd.Parameters.AddWithValue("@name", name);
cmd.Parameters.AddWithValue("@num", num);
cmd.Parameters.AddWithValue("@unit", unit);
cmd.Parameters.AddWithValue("@price", price);
cmd.ExecuteNonQuery();
trans.Commit();//成功后提交执行的结果
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);//将发生错误的信息输出出来
trans.Rollback();//失败后回滚执行前的结果
}
finally
{
conn.Close();
}
Console.Write("添加成功");
}
//显示库存
static void ShowKC()
{
Console.WriteLine("物资库存列表如下:");
Console.WriteLine("*********************************************************");
Console.WriteLine("物资名称 库存数量 单价(元)");
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);//创建链接
try
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();//创建链接-命令对象
cmd.CommandText = "select * from KC";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["WzName"].ToString() + " " + dr
["Num"].ToString() + dr["Unit"] + " " + dr["Price"].ToString());
}
}
finally
{
conn.Close();
}
Console.WriteLine("*********************************************************");
}
//发放物资
static void FaFang()
{
Console.WriteLine("物资发放");
Console.Write("请输入发放物资:");
string name = Console.ReadLine();
Console.WriteLine("当前单价:"+GETprice(name));
Console.WriteLine("当前库存:"+GETnum(name)+GETunit(name));
Console.Write("请输入发放数量:");
int n = Convert.ToInt32(Console.ReadLine());
Console.Write("接收人:");
string receiver = Console.ReadLine();
//向发放表中插入数据
ADDFaFang(name,n,GETunit(name),GETprice(name),DateTime.Now,receiver);
Console.WriteLine("物资发放成功");
}
//获取价格
static decimal GETprice(string name)
{
decimal price=0;
SqlDataReader dr = GETSqldatareader(name);
dr.Read();
price = Convert.ToDecimal(dr["Price"]);
dr.Close();//在此关闭前面调用GETSqldatareader,未关闭的链接
return price;
}
//获取数量
static int GETnum(string name)
{
int num = 0;
SqlDataReader dr = GETSqldatareader(name);
dr.Read();
num = Convert.ToInt32(dr["Num"]);
dr.Close();
return num;
}
//获取数量单位
static string GETunit(string name)
{
string unit = "";
SqlDataReader dr = GETSqldatareader(name);
dr.Read();
unit =dr["Unit"].ToString();
dr.Close();
return unit;
}
//插入物资发放表
static void ADDFaFang(string wzname,int n,string unit,decimal price,DateTime
fadate,string receiver)
{
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);//链接数据库
conn.Open();//打开数据库
SqlCommand cmd = conn.CreateCommand();//创建数据对象
SqlTransaction trans = conn.BeginTransaction();//使用链接对象创建事务对象
cmd.Transaction = trans;//将事务对象挂靠在命令对象上,使命令对象具有事务对象的
功能
try//为了保证链接始终能够关闭,使用try...finally...把链接打开内容放在try中,把
关闭放在finally中
{
cmd.CommandText = "update KC set Num=Num-@fanum where WzName=@wzname";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@fanum", n);
cmd.Parameters.AddWithValue("@wzname", wzname);
cmd.ExecuteNonQuery();
cmd.CommandText = "insert into FaFang values
(@wzname,@fanum,@unit,@faprice,@fadate,@receiver)";//操作数据库
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@wzname", wzname);
cmd.Parameters.AddWithValue("@fanum", n);
cmd.Parameters.AddWithValue("@unit", unit);
cmd.Parameters.AddWithValue("@faprice", price);
cmd.Parameters.AddWithValue("@fadate", fadate);
cmd.Parameters.AddWithValue("@receiver", receiver);
cmd.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
trans.Rollback();
}
finally
{
conn.Close();
}
}
//显示发放明细
static void ShowFaFang()
{
Console.WriteLine("物资发放统计");
Console.WriteLine
("*************************************************************");
Console.WriteLine("物资名称 发放数量 单价(元) 接收人");
SqlConnection conn = new SqlConnection(CONNECTIONSTRING);
try
{
conn.Open();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select * from FaFang";
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
Console.WriteLine(dr["WzName"].ToString()+" "+dr["fanum"].ToString
()+dr["unit"].ToString()+" "+dr["faprice"]+" "+dr["receiver"]);
}
}
finally
{
conn.Close();
}
Console.WriteLine
("*************************************************************");
}
static void Main(string[] args)
{
while (true)
{
Console.Clear();
Console.WriteLine("赈灾物资发放登记系统");
Console.WriteLine("1.物资库存维护");
Console.WriteLine("2.物资库存列表");
Console.WriteLine("3.物资发放");
Console.WriteLine("4.物资发放统计");
Console.WriteLine("5.退出系统");
Console.Write("请输入您的操作指令:");
string menu = Console.ReadLine();
if (menu=="5")
{
break;
}
else if (menu=="1")
{
ADDKC();
Console.ReadKey();
}
else if (menu == "2")
{
ShowKC();
Console.ReadKey();
}
else if (menu == "3")
{
FaFang();
Console.ReadKey();
}
else if (menu == "4")
{
ShowFaFang();
Console.ReadKey();
}
}
}
}
}