zoukankan      html  css  js  c++  java
  • .NET数据库编程求索之路3.使用ADO.NET实现(SQL语句篇)(2)

    3.使用ADO.NET实现(SQL语句篇)(2)

    3.3  FormEdit新增/修改窗体代码


    代码3-3 FormEdit 窗体代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 using System.Data.SqlClient;//新添命名空间
     10 using System.Configuration;//新添命名空间
     11 
     12 namespace HomeShop.WinForm
     13 {
     14     //功能:订单管理系统-新增/修改订单窗体;
     15     //作者:夏春涛;
     16     //日期:2011-11-30;
     17     public partial class FormEdit : Form
     18     {
     19         //数据库连接字符串
     20         private string connectionString = ConfigurationManager.ConnectionStrings["HomeShop"].ConnectionString;
     21         
     22         //当前操作状态,默认为"ADD"
     23         private string operationState = "ADD";//ADD:新增;UPDATE:修改;
     24 
     25         //当前订单的ID,默认为0
     26         private int currentOrderID = 0;
     27 
     28         //当前订单关联的订购商品信息数据
     29         private DataTable orderItems = new DataTable();
     30 
     31         //临时ID,起始值为0,自动递减(避免与正常的正整数ID重复)
     32         private int tempID = 0;
     33 
     34         //【窗体构造函数】
     35         public FormEdit()
     36         {
     37             InitializeComponent();            
     38         }
     39 
     40         //【窗体构造函数】-重载,入参:要修改的订单的ID
     41         public FormEdit(int orderID)
     42         {
     43             InitializeComponent();
     44             this.currentOrderID = orderID;
     45             this.operationState = "UPDATE";
     46         }
     47 
     48         //【窗体加载事件】-初始化控件的内容
     49         private void FormEdit_Load(object sender, EventArgs e)
     50         {
     51             this.Text = "新增订单";//窗体标题
     52             gridView.AutoGenerateColumns = false;//禁止DataGridView控件自动生成列
     53             OrderID.Text = this.currentOrderID.ToString();            
     54             InitOrderState();//初始化订单状态下拉框
     55             InitOrderItems();//初始化订购商品列表 
     56             
     57             if ("UPDATE" == this.operationState)//在订单修改状态下
     58             {
     59                 this.Text = "修改订单";//窗体标题
     60                 InitOrderBaseInfo();//初始化订单基本信息
     61                 GetOrderTotal();//获取订单总金额
     62             }            
     63         }
     64 
     65         //初始化订单状态下拉框
     66         private void InitOrderState()
     67         {
     68             //从数据库获取订单状态数据
     69             SqlConnection connection = new SqlConnection(connectionString);
     70             connection.Open();
     71             string sql = @"SELECT * FROM [OrderState]
     72                            ORDER BY [Code]";
     73             SqlCommand command = new SqlCommand(sql, connection);
     74             SqlDataAdapter adapter = new SqlDataAdapter(command);
     75             DataTable dataTable = new DataTable();
     76             adapter.Fill(dataTable);
     77             connection.Close();
     78             //将数据绑定到订单状态下拉框
     79             OrderState.ValueMember = "Code";
     80             OrderState.DisplayMember = "Name";
     81             OrderState.DataSource = dataTable;
     82         }
     83 
     84         //初始化订单基本信息
     85         private void InitOrderBaseInfo()
     86         {
     87             //从数据库中获取当前订单基本信息
     88             SqlConnection connection = new SqlConnection(connectionString);
     89             connection.Open();            
     90             string sql = @"SELECT * FROM [Order]
     91                            WHERE [OrderID] = @OrderID";
     92             SqlCommand command = new SqlCommand(sql, connection);
     93             command.Parameters.Add(new SqlParameter("@OrderID", currentOrderID));
     94             SqlDataAdapter adapter = new SqlDataAdapter(command);
     95             DataTable dataTable = new DataTable();
     96             adapter.Fill(dataTable);
     97             connection.Close(); 
     98             //将当前订单基本信息显示在编辑区
     99             OrderID.Text = dataTable.Rows[0]["OrderID"].ToString();
    100             CustomerName.Text = dataTable.Rows[0]["CustomerName"].ToString();
    101             CustomerPhoneNo.Text = dataTable.Rows[0]["CustomerPhoneNo"].ToString();
    102             CustomerAddress.Text = dataTable.Rows[0]["CustomerAddress"].ToString();
    103             OrderTime.Value = Convert.ToDateTime(dataTable.Rows[0]["OrderTime"]);
    104             OrderState.SelectedValue = dataTable.Rows[0]["OrderStateCode"].ToString();
    105         }
    106 
    107         //初始化当前订单关联的商品列表
    108         private void InitOrderItems()
    109         {
    110             SqlConnection connection = new SqlConnection(connectionString);
    111             connection.Open();
    112             string sql = @"SELECT [OrderItemID],
    113                                   [Product],
    114                                   [UnitPrice],
    115                                   [Quantity],
    116                                   [UnitPrice]*[Quantity] AS SubTotal
    117                            FROM [OrderItem]
    118                            WHERE [OrderID] = @OrderID
    119                            ORDER BY [OrderItemID]";
    120             SqlCommand command = new SqlCommand(sql, connection);
    121             command.Parameters.Add(new SqlParameter("@OrderID", currentOrderID));
    122             SqlDataAdapter adapter = new SqlDataAdapter(command);            
    123             adapter.Fill(this.orderItems);
    124             connection.Close();
    125 
    126             this.orderItems.PrimaryKey = new DataColumn[] { this.orderItems.Columns["OrderItemID"] };
    127             gridView.DataSource = this.orderItems;
    128         }
    129 
    130         //计算当前订单的总金额
    131         private void GetOrderTotal()
    132         {
    133             decimal orderTotal = 0m;
    134             //通过累加数据列表中的“小计”来计算当前订单的总金额
    135             for (int i = 0; i < gridView.RowCount; i++)
    136             {
    137                 orderTotal += (decimal)gridView.Rows[i].Cells["Col_SubTotal"].Value;
    138             }
    139             OrderTotal.Text = orderTotal.ToString();
    140         }        
    141 
    142         //【新增】商品
    143         private void btnProductAdd_Click(object sender, EventArgs e)
    144         {
    145             if (!ValidateInput_Product()) return;//验证用户输入
    146 
    147             string product = Product.Text.Trim();
    148             decimal unitPrice = Convert.ToDecimal(UnitPrice.Text.Replace(" ",""));
    149             int quantity = Convert.ToInt32(Quantity.Text.Replace(" ",""));
    150             decimal subtotal = (decimal)unitPrice * quantity;
    151 
    152             DataRow row = this.orderItems.NewRow();
    153             row["OrderItemID"] = tempID--;
    154             row["Product"] = product;
    155             row["UnitPrice"] = unitPrice;
    156             row["Quantity"] = quantity;
    157             row["Subtotal"] = subtotal;
    158             this.orderItems.Rows.Add(row);
    159          
    160             gridView.DataSource = this.orderItems;            
    161             GetOrderTotal();
    162             gridView.Rows[gridView.Rows.Count - 1].Selected = true;
    163         }
    164 
    165         //验证用户输入-新增/修改商品信息时
    166         private bool ValidateInput_Product()
    167         {
    168             //验证商品名称
    169             if ("" == Product.Text.Trim())
    170             {
    171                 MessageBox.Show(this, "请输入商品名称!", "提示",
    172                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    173                 Product.Focus();
    174                 return false;
    175             }
    176             //验证商品单价            
    177             try
    178             {
    179                 string regexString = @"^[0-9]*[0-9]+[\.]*[0-9]*$";//正则表达式-非负数
    180                 RegexStringValidator validator = new RegexStringValidator(regexString);
    181                 validator.Validate(UnitPrice.Text.Replace(" ", ""));
    182             }
    183             catch
    184             {
    185                 MessageBox.Show(this, "请输入正确的商品单价(非负数)!", "提示",
    186                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    187                 UnitPrice.Focus();
    188                 return false;
    189             }
    190             //验证商品数量            
    191             try
    192             {
    193                 string regexString = @"^[0-9]*[1-9][0-9]*$";//正则表达式-正整数
    194                 RegexStringValidator validator = new RegexStringValidator(regexString);
    195                 validator.Validate(Quantity.Text.Replace(" ", ""));
    196             }
    197             catch
    198             {
    199                 MessageBox.Show(this, "请输入正确的商品数量(正整数)!", "提示",
    200                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    201                 Quantity.Focus();
    202                 return false;
    203             }
    204 
    205             return true;
    206         }
    207 
    208         //【修改】选中的商品
    209         private void btnProductUpdate_Click(object sender, EventArgs e)
    210         {
    211             if (gridView.RowCount == 0) return;
    212             if (!ValidateInput_Product()) return;
    213 
    214             int selectedRowIndex = gridView.SelectedRows[0].Index;
    215 
    216             int orderItemID = (int)gridView.Rows[selectedRowIndex].Cells["Col_OrderItemID"].Value;
    217             string product = Product.Text.Trim();
    218             decimal unitPrice = Convert.ToDecimal(UnitPrice.Text.Replace(" ", ""));
    219             int quantity = Convert.ToInt32(Quantity.Text.Replace(" ", ""));
    220             decimal subtotal = (decimal)unitPrice * quantity;
    221 
    222             DataRow row = this.orderItems.Rows.Find(orderItemID);
    223             row["Product"] = product;
    224             row["UnitPrice"] = unitPrice;
    225             row["Quantity"] = quantity;
    226             row["Subtotal"] = subtotal;
    227 
    228             gridView.DataSource = this.orderItems;            
    229             GetOrderTotal();
    230             gridView.Rows[selectedRowIndex].Selected = true;
    231         }
    232 
    233         //【删除】选中的商品
    234         private void btnProductDelete_Click(object sender, EventArgs e)
    235         {
    236             if (gridView.RowCount == 0) return;            
    237             
    238             DialogResult dlgResult = MessageBox.Show(this, "确认要删除选中的商品吗?", "提示", 
    239                                                 MessageBoxButtons.YesNo, MessageBoxIcon.Question);
    240             if (DialogResult.Yes == dlgResult)
    241             {
    242                 int selectedRowIndex = gridView.SelectedRows[0].Index; 
    243                 
    244                 int orderItemID = (int)gridView.SelectedRows[0].Cells["Col_OrderItemID"].Value;
    245                 this.orderItems.Rows.Find(orderItemID).Delete(); 
    246                
    247                 gridView.DataSource = this.orderItems;                 
    248                 GetOrderTotal();
    249                 //选中下一条记录
    250                 if (selectedRowIndex > gridView.Rows.Count - 1)
    251                     selectedRowIndex = gridView.Rows.Count - 1;
    252                 if (selectedRowIndex >= 0)
    253                 {
    254                     gridView.Rows[selectedRowIndex].Selected = true;
    255                     ShowSelectedRowInfo();//将选中的商品信息显示在编辑区
    256                 }
    257             }
    258         }
    259 
    260         //【选择更改事件】-将选中的商品信息显示在编辑区
    261         private void gridView_SelectionChanged(object sender, EventArgs e)
    262         {
    263             ShowSelectedRowInfo();
    264         }
    265 
    266         //将选中的商品信息显示在编辑区
    267         private void ShowSelectedRowInfo()
    268         {
    269             if (gridView.SelectedRows.Count == 0) return;
    270             Product.Text = gridView.SelectedRows[0].Cells["Col_Product"].Value.ToString();
    271             UnitPrice.Text = gridView.SelectedRows[0].Cells["Col_UnitPrice"].Value.ToString();
    272             Quantity.Text = gridView.SelectedRows[0].Cells["Col_Quantity"].Value.ToString();
    273         }        
    274 
    275         //【确定】-保存新增/修改的订单
    276         private void btnOK_Click(object sender, EventArgs e)
    277         {
    278             if (!ValidateInput_Order()) return;//验证用户输入
    279 
    280             if ("ADD"==this.operationState)//新增订单
    281             {
    282                 AddOrder();
    283                 MessageBox.Show(this, "新增订单成功!", "提示", 
    284                     MessageBoxButtons.OK, MessageBoxIcon.Information);                
    285             }
    286             if ("UPDATE" == this.operationState)//修改订单
    287             {
    288                 UpdateOrder();
    289                 MessageBox.Show(this, "修改订单成功!", "提示",
    290                     MessageBoxButtons.OK, MessageBoxIcon.Information);     
    291             }            
    292             
    293             this.DialogResult = DialogResult.OK;//设置对话框结果
    294             this.Close();//关闭窗体
    295         }
    296 
    297         //验证用户输入-保存新增/修改的订单时
    298         private bool ValidateInput_Order()
    299         {
    300             //验证顾客姓名
    301             if ("" == CustomerName.Text.Trim())
    302             {
    303                 MessageBox.Show(this, "请输入顾客姓名!", "提示",
    304                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    305                 CustomerName.Focus();
    306                 return false;
    307             }
    308             //验证联系电话
    309             if ("" == CustomerPhoneNo.Text.Trim())
    310             {
    311                 MessageBox.Show(this, "请输入联系电话!", "提示",
    312                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    313                 CustomerPhoneNo.Focus();
    314                 return false;
    315             }
    316             //订购商品信息
    317             if (0 == gridView.Rows.Count)
    318             {
    319                 MessageBox.Show(this, "请输入订购商品信息!", "提示",
    320                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
    321                 Product.Focus();
    322                 return false;
    323             }
    324 
    325             return true;
    326         }
    327 
    328         //添加订单到数据库
    329         private int AddOrder()
    330         {
    331             int rowsCountAffected = 0;
    332             SqlConnection connection = new SqlConnection(connectionString);
    333             connection.Open();
    334             //开始数据库事务
    335             SqlTransaction trans = connection.BeginTransaction();
    336             SqlCommand command = new SqlCommand();
    337             command.Connection = connection;
    338             command.Transaction = trans;
    339             try
    340             {
    341                 //新增订单基本信息,并使用SQL的系统函数@@IDENTITY获取新增订单的ID
    342                 string sql = @"INSERT INTO [Order]([OrderTime],
    343                                                    [OrderStateCode],
    344                                                    [CustomerName],
    345                                                    [CustomerPhoneNo],
    346                                                    [CustomerAddress])
    347                                VALUES(@OrderTime,
    348                                       @OrderStateCode,
    349                                       @CustomerName,
    350                                       @CustomerPhoneNo,
    351                                       @CustomerAddress)
    352                                SET @OrderID = @@IDENTITY ";
    353                 command.CommandText = sql;
    354                 command.Parameters.Add(new SqlParameter("@OrderTime", OrderTime.Value));
    355                 command.Parameters.Add(new SqlParameter("@OrderStateCode", OrderState.SelectedValue.ToString()));
    356                 command.Parameters.Add(new SqlParameter("@CustomerName", CustomerName.Text.Trim()));
    357                 command.Parameters.Add(new SqlParameter("@CustomerPhoneNo", CustomerPhoneNo.Text.Trim()));
    358                 command.Parameters.Add(new SqlParameter("@CustomerAddress", CustomerAddress.Text.Trim()));
    359                 //@OrderID作为传出参数,用于获取新增订单的ID
    360                 SqlParameter paramOrderID = new SqlParameter("@OrderID", SqlDbType.Int);
    361                 paramOrderID.Direction = ParameterDirection.Output;
    362                 command.Parameters.Add(paramOrderID);
    363                 rowsCountAffected = command.ExecuteNonQuery();
    364                 this.currentOrderID = (int)paramOrderID.Value;
    365                 command.Parameters.Clear();//清空参数列表,避免参数重名问题
    366                 //-----------------------------------------------------------
    367                 //循环添加订购商品信息
    368                 for (int i = 0; i < this.orderItems.Rows.Count; i++)
    369                 {
    370                     sql = @"INSERT INTO [OrderItem]([OrderID],
    371                                                 [Product],
    372                                                 [UnitPrice],
    373                                                 [Quantity])
    374                             VALUES( @OrderID,
    375                                     @Product,
    376                                     @UnitPrice,
    377                                     @Quantity)";
    378                     command.CommandText = sql;
    379 
    380                     DataRow row = this.orderItems.Rows[i];
    381                     command.Parameters.Add(new SqlParameter("@OrderID", this.currentOrderID));
    382                     command.Parameters.Add(new SqlParameter("@Product", row["Product"].ToString()));
    383                     command.Parameters.Add(new SqlParameter("@UnitPrice", (decimal)row["UnitPrice"]));
    384                     command.Parameters.Add(new SqlParameter("@Quantity", (int)row["Quantity"]));
    385                     rowsCountAffected += command.ExecuteNonQuery();
    386                     command.Parameters.Clear();//清空参数列表,避免参数重名问题
    387                 }
    388                 trans.Commit();//提交数据库事务
    389             }
    390             catch
    391             {
    392                 trans.Rollback();//回滚数据库事务
    393                 throw;
    394             }
    395             connection.Close();
    396 
    397             return rowsCountAffected;
    398         }
    399 
    400         //修改订单到数据库
    401         private int UpdateOrder()
    402         {
    403             int rowsCountAffected = 0;
    404             SqlConnection connection = new SqlConnection(connectionString);
    405             connection.Open();
    406             //开始数据库事务
    407             SqlTransaction trans = connection.BeginTransaction();
    408             SqlCommand command = new SqlCommand();
    409             command.Connection = connection;
    410             command.Transaction = trans;
    411             try
    412             {
    413                 //修改订单基本信息
    414                 string sql = @"UPDATE [Order]
    415                                SET [OrderTime] = @OrderTime,
    416                                    [OrderStateCode] = @OrderStateCode,
    417                                    [CustomerName] = @CustomerName,
    418                                    [CustomerPhoneNo] = @CustomerPhoneNo,
    419                                    [CustomerAddress] = @CustomerAddress
    420                                WHERE [OrderID] = @OrderID";
    421                 command.CommandText = sql;
    422                 command.Parameters.Add(new SqlParameter("@OrderTime", OrderTime.Value));
    423                 command.Parameters.Add(new SqlParameter("@OrderStateCode", OrderState.SelectedValue.ToString()));
    424                 command.Parameters.Add(new SqlParameter("@CustomerName", CustomerName.Text.Trim()));
    425                 command.Parameters.Add(new SqlParameter("@CustomerPhoneNo", CustomerPhoneNo.Text.Trim()));
    426                 command.Parameters.Add(new SqlParameter("@CustomerAddress", CustomerAddress.Text.Trim()));
    427                 command.Parameters.Add(new SqlParameter("@OrderID", currentOrderID));
    428                 rowsCountAffected = command.ExecuteNonQuery();
    429                 command.Parameters.Clear();//清空参数列表,避免参数重名问题
    430                 //-----------------------------------------------------------
    431                 //循环将订购商品信息列表同步更新到数据库中
    432                 for (int i = 0; i < this.orderItems.Rows.Count; i++)
    433                 {
    434                     DataRow row = this.orderItems.Rows[i];
    435 
    436                     if (DataRowState.Added == row.RowState)//新增
    437                     {
    438                         sql = @"INSERT INTO [OrderItem]([OrderID],
    439                                                 [Product],
    440                                                 [UnitPrice],
    441                                                 [Quantity])
    442                                 VALUES( @OrderID,
    443                                         @Product,
    444                                         @UnitPrice,
    445                                         @Quantity)";
    446                         command.CommandText = sql;
    447                         command.Parameters.Add(new SqlParameter("@OrderID", this.currentOrderID));
    448                         command.Parameters.Add(new SqlParameter("@Product", row["Product"].ToString()));
    449                         command.Parameters.Add(new SqlParameter("@UnitPrice", (decimal)row["UnitPrice"]));
    450                         command.Parameters.Add(new SqlParameter("@Quantity", (int)row["Quantity"]));
    451                         rowsCountAffected += command.ExecuteNonQuery();
    452                         command.Parameters.Clear();//清空参数列表,避免参数重名问题
    453                     }
    454                     if (DataRowState.Modified == row.RowState)//修改
    455                     {
    456                         sql = @"UPDATE [OrderItem]
    457                                 SET [OrderID] = @OrderID,
    458                                     [Product] = @Product,
    459                                     [UnitPrice] = @UnitPrice,
    460                                     [Quantity] = @Quantity
    461                                 WHERE [OrderItemID] = @OrderItemID";
    462                         command.CommandText = sql;
    463                         command.Parameters.Add(new SqlParameter("@OrderID", this.currentOrderID));
    464                         command.Parameters.Add(new SqlParameter("@Product", row["Product"].ToString()));
    465                         command.Parameters.Add(new SqlParameter("@UnitPrice", (decimal)row["UnitPrice"]));
    466                         command.Parameters.Add(new SqlParameter("@Quantity", (int)row["Quantity"]));
    467                         command.Parameters.Add(new SqlParameter("@OrderItemID", (int)row["OrderItemID"]));
    468                         rowsCountAffected += command.ExecuteNonQuery();
    469                         command.Parameters.Clear();//清空参数列表,避免参数重名问题
    470                     }
    471                     if (DataRowState.Deleted == row.RowState)//删除
    472                     {
    473                         sql = @"DELETE FROM [OrderItem]
    474                                 WHERE [OrderItemID] = @OrderItemID";
    475                         command.CommandText = sql;
    476                         command.Parameters.Add(new SqlParameter("@OrderItemID", (int)row["OrderItemID",DataRowVersion.Original]));
    477                         rowsCountAffected += command.ExecuteNonQuery();
    478                         command.Parameters.Clear();//清空参数列表,避免参数重名问题
    479                     }
    480                 }
    481 
    482                 trans.Commit();//提交数据库事务
    483             }
    484             catch
    485             {
    486                 trans.Rollback();//回滚数据库事务
    487                 throw;
    488             }
    489             connection.Close();
    490 
    491             return rowsCountAffected;
    492         }
    493 
    494         //【取消】-关闭窗体
    495         private void btnCancel_Click(object sender, EventArgs e)
    496         {
    497             this.Close();//关闭窗体
    498         }
    499     }
    500 }

    数据库文件:/Files/SummerRain/NetDbDevRoad/HomeShopDB.rar

    完整源代码:/Files/SummerRain/NetDbDevRoad/3使用ADONET实现SQL语句篇.rar

     转载请注明:【 夏春涛 email: xchuntao@163.com  blog: http://www.cnblogs.com/SummerRain

  • 相关阅读:
    超级楼梯
    hdu1040
    hdu2033(惭愧)
    hdu2032杨辉三角
    hdu1013Digital Roots
    hdu2031
    Linux信号(signal) 机制分析
    android init重启service(进程)
    [android] init进程 .rc文件中service、action的parsing
    oom_adj
  • 原文地址:https://www.cnblogs.com/SummerRain/p/2543758.html
Copyright © 2011-2022 走看看