实现简易赈灾物资发放登记系统---再次练习

知识点:
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();
                }
            }
           

        }
    }
}

原文地址:https://www.cnblogs.com/likaixuan/p/4490539.html