您的位置:首页 > 数据库

.NET数据库编程求索之路--3.使用ADO.NET实现(SQL语句篇)(2)

2012-06-10 03:18 921 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐