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

简介: 3.使用ADO.NET实现(SQL语句篇)(1)   ADO.NET是.NET平台的数据访问技术体系,其是微软在COM時代奠基的OLE DB技術发展而来的。微软在OLE DB之上建立了一个很好的数据存取模型ADO,并被业界接受,如VC6.0、Delphi5/6等都使用ADO数据存取技术。

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

  ADO.NET是.NET平台的数据访问技术体系,其是微软在COM時代奠基的OLE DB技術发展而来的。微软在OLE DB之上建立了一个很好的数据存取模型ADO,并被业界接受,如VC6.0、Delphi5/6等都使用ADO数据存取技术。ADO.NET继承了ADO的优点,但它是微软在.NET平台下采用全新的架构和理念构建的。ADO.NET主要通过Connection(连接对象) 、Command(命令对象) 、Parameter(Sql参数) 、DataReader(数据流读取器) 、Transaction(事务) 、DataAdapter(数据适配器) ,以及DataSet,DataTable,DataRow,DataColumn等对象实现对数据库的访问和操纵。发展到今天,ADO.NET已经成为包含Linq、Entity Framework等新一代ORM(Object-Relation Mapping,对象-关系映射)技术的完整体系。就像我们用Linq、Entity Framework来指代新的技术一样,我们还是习惯用ADO.NET一词代表最初的ADO.NET技术。本章即是采用Connection、Command、DataAdapter等最初的ADO.NET技术,通过嵌入SQL语句来实现我们前面给出的示例小系统——订单管理系统。

  本章主要内容:

    从配置文件读取数据连接字符串

    FormMain主窗体代码

    FormEdit添加/修改窗体代码

 

 3.1  从配置文件读取数据连接字符串

 

  当数据库服务器更换IP地址或登录密码等配置时,应用程序的数据连接字符串也要相应更改,才能正常连接到数据库。如果将数据连接字符串硬编码在程序代码中,就需要重新修改代码并编译程序,这导致应用程序的可移植性非常差。为此,我们通常将数据连接字符串存储在配置文件中,应用程序运行时从配置文件读取连接字符串以实现数据连接。当数据库服务器配置变化时,只需更改配置文件中数据连接参数即可,而不用再修改应用程序代码。
  在“解决方案资源管理器”中单击项目“HomeShop.WinForm”,右键→【添加】→【新建项】,在“添加新项”对话框中选定“应用程序配置文件”项,单击【添加】按钮,则在项目中添加App.Config配置文件,如图3-1。


 图3-1 添加应用程序配置文件

 

  

在App.Config文件中输入如下代码,建立<connectionStrings>配置节,添加一个名称为“HomeShop”的数据连接字符串。

 

代码3-1 App.Config 

<? xml version="1.0" encoding="utf-8"  ?>
< configuration >
  < connectionStrings >
     < add  name ="HomeShop"  connectionString ="Data Source=(local1);Initial Catalog=HomeShop;User ID=sa;Password=YourPwd" />
  </ connectionStrings >
</ configuration >

 

  

为实现对<connectionStrings>配置节的读取,需在项目中添加对命名空间“System.Configuration”的引用。在“解决方案资源管理器”中单击项目“HomeShop.WinForm”下的【引用】,右键→【添加引用】,在“添加引用”对话框中的.NET标签页,选中【System.Configuration】后单击【确定】按钮。

图3-2 添加引用

 

在窗体代码文件FormMain.cs和FormEdit.cs的头部添加“using System.Configuration;”,并为窗体类添加成员变量connectionString,实现对配置文件中数据连接字符串的读取,如代码3-2。

 

代码3-2 读取配置文件中数据连接字符串

private  string connectionString = ConfigurationManager.ConnectionStrings[ " HomeShop "].ConnectionString;

 

 

 3.2  FormMain主窗体代码

 

   代码3-2 FormMain主窗体代码

  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 FormMain : Form
 18     {
 19          // 数据库连接字符串
 20           private  string connectionString = ConfigurationManager.ConnectionStrings[ " HomeShop "].ConnectionString;
 21 
 22          // 【窗体构造函数】
 23           public FormMain()
 24         {
 25             InitializeComponent();            
 26         }
 27 
 28          // 【窗体加载事件】
 29           private  void FormMain_Load( object sender, EventArgs e)
 30         {   
 31             gridView.AutoGenerateColumns =  false; // 禁止DataGridView控件自动生成列         
 32              BindData_Orders(); // 绑定订单列表
 33          }
 34 
 35          // 绑定订单列表
 36           private  void BindData_Orders()
 37         {
 38             txtCustomerName.Clear();
 39             SqlConnection connection =  new SqlConnection(connectionString);
 40             connection.Open();
 41              string sql =  @" SELECT [OrderID],
 42                              [CustomerName],
 43                              [CustomerPhoneNo],
 44                              [CustomerAddress],
 45                              [OrderTime],
 46                              [OrderState].[Name] AS [OrderState]
 47                      FROM [Order]
 48                      LEFT OUTER JOIN [OrderState]
 49                      ON [Order].[OrderStateCode] = [OrderState].[Code]
 50                      ORDER BY [OrderID] DESC ";
 51             SqlCommand command =  new SqlCommand(sql, connection);
 52             SqlDataAdapter adapter =  new SqlDataAdapter(command);
 53             DataTable dataTable =  new DataTable();
 54             adapter.Fill(dataTable);
 55             connection.Close();
 56 
 57             gridView.DataSource = dataTable;
 58             labRecordCount.Text =  " 共  " + dataTable.Rows.Count.ToString() +  "  条记录 ";
 59         }
 60 
 61          // 【查询】订单
 62           private  void btnQuery_Click( object sender, EventArgs e)
 63         {
 64              if ( "" == txtCustomerName.Text.Trim())
 65             {
 66                 MessageBox.Show( this" 请输入要查询的顾客姓名关键词! "" 提示 "
 67                                 MessageBoxButtons.OK, MessageBoxIcon.Information);
 68                 txtCustomerName.Focus();
 69                  return;
 70             }
 71 
 72             SqlConnection connection =  new SqlConnection(connectionString);
 73             connection.Open();
 74              string sql =  @" SELECT [OrderID],
 75                              [CustomerName],
 76                              [CustomerPhoneNo],
 77                              [CustomerAddress],
 78                              [OrderTime],
 79                              [OrderState].[Name] AS [OrderState]
 80                      FROM [Order]
 81                      LEFT OUTER JOIN [OrderState]
 82                      ON [Order].[OrderStateCode] = [OrderState].[Code]
 83                      WHERE [CustomerName] LIKE @CustomerName 
 84                      ORDER BY [OrderID] DESC ";
 85             SqlCommand command =  new SqlCommand(sql, connection);
 86             command.Parameters.Add( new SqlParameter( " @CustomerName "" % " + txtCustomerName.Text.Trim() +  " % "));
 87             SqlDataAdapter adapter =  new SqlDataAdapter(command);
 88             DataTable dataTable =  new DataTable();
 89             adapter.Fill(dataTable);
 90             connection.Close();
 91 
 92             gridView.DataSource = dataTable;
 93             labRecordCount.Text =  " 共  " + dataTable.Rows.Count.ToString() +  "  条记录 ";
 94         }
 95 
 96          // 【全部显示】订单
 97           private  void btnShowAll_Click( object sender, EventArgs e)
 98         {
 99             BindData_Orders();
100         }
101 
102          // 【新增】订单
103           private  void menuAdd_Click( object sender, EventArgs e)
104         {
105             FormEdit formEdit =  new FormEdit();
106             DialogResult dlgResult = formEdit.ShowDialog( this); // 显示为模式对话框
107               if (DialogResult.OK == dlgResult)
108             {
109                 BindData_Orders(); // 重新绑定订单列表
110              }
111             formEdit.Dispose(); // 释放窗体资源
112          }
113 
114          // 【修改】订单
115           private  void menuUpdate_Click( object sender, EventArgs e)
116         {
117              if (gridView.RowCount ==  0return;
118 
119              int selectedRowIndex = gridView.SelectedRows[ 0].Index;
120              int selectedOrderID = ( int)gridView.SelectedRows[ 0].Cells[ " Col_OrderID "].Value;
121             FormEdit formEdit =  new FormEdit(selectedOrderID); //指定要修改的订单ID
122             DialogResult dlgResult = formEdit.ShowDialog( this); // 显示为模式对话框
123               if (DialogResult.OK == dlgResult)
124             {
125                 BindData_Orders(); // 重新绑定订单列表
126                  gridView.Rows[selectedRowIndex].Selected =  true; // 依然选中当前行
127              }
128             formEdit.Dispose(); // 释放窗体资源
129          }
130 
131          // 【删除】订单
132           private  void menuDelete_Click( object sender, EventArgs e)
133         {
134              if (gridView.RowCount ==  0return;
135 
136              int selectedRowIndex = gridView.SelectedRows[ 0].Index;
137              int selectedOrderID = ( int)gridView.SelectedRows[ 0].Cells[ " Col_OrderID "].Value;
138             DialogResult dlgResult = MessageBox.Show( this" 确认要删除选中的订单吗? "" 提示 "
139                                                      MessageBoxButtons.YesNo, MessageBoxIcon.Question);
140              if (DialogResult.Yes == dlgResult)
141             {
142                 DeleteOrder(selectedOrderID); // 删除订单
143                  BindData_Orders(); // 重新绑定订单列表
144                   // 选中下一条记录
145                   if (selectedRowIndex > gridView.Rows.Count -  1)
146                     selectedRowIndex = gridView.Rows.Count -  1;
147                  if (selectedRowIndex >=  0)
148                 {
149                     gridView.Rows[selectedRowIndex].Selected =  true;
150                 }
151             }            
152         }
153 
154          // 删除订单
155           private  int DeleteOrder( int orderID)
156         {
157              int rowsCountAffected =  0;
158             SqlConnection connection =  new SqlConnection(connectionString);
159             connection.Open();
160              string sql =  @" DELETE FROM [OrderItem]
161                             WHERE [OrderID] = @OrderID
162                             
163                             DELETE FROM [Order]
164                             WHERE [OrderID] = @OrderID  ";
165             SqlCommand command =  new SqlCommand(sql, connection);
166             command.Parameters.Add( new SqlParameter( " @OrderID ", orderID));
167              // 开始数据库事务
168              SqlTransaction trans = connection.BeginTransaction();
169             command.Transaction = trans;
170              try
171             {
172                 rowsCountAffected = command.ExecuteNonQuery();
173                 trans.Commit(); // 提交数据库事务
174              }
175              catch
176             {
177                 trans.Rollback(); // 回滚数据库事务
178                   throw;
179             }
180             connection.Close();
181             
182              return rowsCountAffected;
183         }
184     }
185 }

 

 

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

 

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

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

 

 

目录
相关文章
|
10天前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
2天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
2天前
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
24天前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
41 16
|
26天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
2月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
80 19
|
2月前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
2月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
110 9
|
3月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
297 6
|
7月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")

热门文章

最新文章