//数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.        
public static string connectionString = PubConstant.ConnectionString; //定义连接字符串

 1 public static int GetMaxID(string FieldName, string TableName)
2 {
3 string strsql = "select max(" + FieldName + ")+1 from " + TableName; //获得ID最大值然后加1
4 object obj = GetSingle(strsql);
5 if (obj == null)
6 {
7 return 1;
8 }
9 else
10 {
11 return int.Parse(obj.ToString());
12 }
13 }
14
15 //这段代码好一会才理解,刚开始不明白为什么最大id要加1,估计是要和当获得数据为空的时候,返回值是1而不是0匹配有关系,但是这个实际上我认为是对设计有影响的,反正自己注意一下吧

int.Parse这里,是把一个字符串转换为int型,C#提供类型检查,你不能把一个 string 强制转换成 int,隐式转换就更加不可能,类似(int) 和 Convert.ToInt32 是两个不同的概念,前者是类型转换,而后者则是内容转换,它们并不总是等效的,其实,能够使用 (int) 进行强类型转换的只能是数值类型了,例如 long、short、double等,不过进行这种转换时你需要考虑精度问题

http://topic.csdn.net/u/20080224/21/1bb41739-0a8d-4288-a282-ea1f6b1bc08c.html

==============

下面来看GerSingle(strsql)的实现

 1 public static object GetSingle(string SQLString)
2 {
3 using (OleDbConnection connection = new OleDbConnection(connectionString)) //连接对象生成
4 {
5 using (OleDbCommand cmd = new OleDbCommand(SQLString, connection)) //表示要对数据源执行的 SQL 语句或存储过程。
6 {
7 try
8 {
9 connection.Open(); //连接数据库
10 object obj = cmd.ExecuteScalar(); //返回结果集中第一行的第一列或空引用(如果结果集为空)
11 if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
12 {
13 return null;
14 }
15 else
16 {
17 return obj;
18 }
19 }
20 catch (System.Data.OleDb.OleDbException e)
21 {
22 connection.Close();
23 throw new Exception(e.Message);
24 }
25 }
26 }
27 }

最终,返回到GetMaxID那里的是数据表第一列里的最大的值+1,因为第一列是BHT_ID,实际上就是ID最大值+1

=========================

 1 public static int ExecuteSql(string SQLString)
2 {
3 using (OleDbConnection connection = new OleDbConnection(connectionString))
4 {
5 using (OleDbCommand cmd = new OleDbCommand(SQLString, connection))
6 {
7 try
8 {
9 connection.Open();
10 int rows = cmd.ExecuteNonQuery(); //对于 UPDATE、INSERT 和 DELETE 语句,返回值为该命令所影响的行数。对于所有其他类型的语句,返回值为 -1。如果发生回滚,返回值也为 -1。
11 return rows;
12 }
13 catch (System.Data.OleDb.OleDbException E)
14 {
15 connection.Close();
16 throw new Exception(E.Message);
17 }
18 }
19 }
20 }

 

================

执行多条SQL语句,实现数据库事务。

 1 public static void ExecuteSqlTran(ArrayList SQLStringList)
2 {
3 using (OleDbConnection conn = new OleDbConnection(connectionString))
4 {
5 conn.Open();
6 OleDbCommand cmd = new OleDbCommand();
7 cmd.Connection = conn;
8 OleDbTransaction tx = conn.BeginTransaction(); //以数据库连接对象开始一个数据库事务
9 cmd.Transaction = tx; //设置cmd对象的事务
10 try
11 {
12 for (int n = 0; n < SQLStringList.Count; n++)
13 {
14 string strsql = SQLStringList[n].ToString(); //把ArrayList数组里每一句赋值给strsql
15 if (strsql.Trim().Length > 1)
16 {
17 cmd.CommandText = strsql;
18 cmd.ExecuteNonQuery();
19 }
20 }
21 tx.Commit(); //所有流程成功,提交数据库事务
22 }
23 catch (System.Data.OleDb.OleDbException E)
24 {
25 tx.Rollback(); //出现异常,回滚事务
26 throw new Exception(E.Message);
27 }
28 }
29 }

http://www.cublog.cn/u1/35908/showart_299815.htm

什么是数据库事务

  数据库事务是指作为单个逻辑工作单元执行的一系列操作。

  设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:

  · 更新客户所购商品的库存信息

  · 保存客户付款信息--可能包括与银行系统的交互

  · 生成订单并且保存到数据库中

  · 更新用户相关信息,例如购物数量等等

  正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态--库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。

  数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

  数据库事务的ACID属性

  事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性:

 

============
 执行带一个存储过程参数的的SQL语句。
<param name="SQLString">SQL语句</param>
<param name="content">参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加</param>
<returns>影响的记录数</returns>
 1 public static int ExecuteSql(string SQLString, string content)
2 {
3 using (OleDbConnection connection = new OleDbConnection(connectionString))
4 {
5 OleDbCommand cmd = new OleDbCommand(SQLString, connection);
6 System.Data.OleDb.OleDbParameter myParameter = new System.Data.OleDb.OleDbParameter("@content", OleDbType.VarChar);
7 //初始化使用参数的名称为content,数据类型VarChar为非 Unicode 字符的变长流(只限 OleDbParameter)。它映射到 String。
8 myParameter.Value = content; //设置参数值
9 cmd.Parameters.Add(myParameter); //将该参数值添加到cmd对象的参数集合内
10 try
11 {
12 connection.Open();
13 int rows = cmd.ExecuteNonQuery();
14 return rows;
15 }
16 catch (System.Data.OleDb.OleDbException E)
17 {
18 throw new Exception(E.Message);
19 }
20 finally
21 {
22 cmd.Dispose(); //释放由 Component 占用的资源
23 connection.Close();
24 }
25 }
26 }


========================

执行带参数的SQL语句

 1 public static int ExecuteSql(string SQLString, params OleDbParameter[] cmdParms)
2 {
3 using (OleDbConnection connection = new OleDbConnection(connectionString))
4 {
5 using (OleDbCommand cmd = new OleDbCommand())
6 {
7 try
8 {
9 PrepareCommand(cmd, connection, null, SQLString, cmdParms);
10 int rows = cmd.ExecuteNonQuery();
11 cmd.Parameters.Clear();
12 return rows;
13 }
14 catch (System.Data.OleDb.OleDbException E)
15 {
16 throw new Exception(E.Message);
17 }
18 }
19 }
20 }
21
22 private static void PrepareCommand(OleDbCommand cmd, OleDbConnection conn, OleDbTransaction trans, string cmdText, OleDbParameter[] cmdParms)
23 {
24 if (conn.State != ConnectionState.Open)
25 conn.Open(); //如果连接没开,打开连接
26 cmd.Connection = conn; //连接对象赋值
27 cmd.CommandText = cmdText; //置要对数据源执行的 SQL 语句或存储过程。
28 if (trans != null) //如果存在服务器事务,设置cmd的服务器事务为该值
29 cmd.Transaction = trans;
30 cmd.CommandType = CommandType.Text;//cmdType;
31 if (cmdParms != null)
32 {
33 foreach (OleDbParameter parm in cmdParms)
34 cmd.Parameters.Add(parm); //挨个添加参数
35 }
36 }
posted on 2011-09-14 12:28  终于出名  阅读(450)  评论(0)    收藏  举报