using System;
using System.ComponentModel;
using System.Collections;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
using System.IO;
namespace DataAccess
{
public class Database : IDisposable
{
private SqlConnection connection;
///
/* 描 述: 执行连锁的插入操作。
* 即利用插入语句sqlOne得到的ID作为后面插入语句的属性之一。
* 输入参数:
* sqlOne 执行的第一条SQL语句,
* pramsOne sqlOne语句对应的参数,
* sqls 连锁执行的SQL语句链表,
* prams 与sqls中每条SQL语句相对应的参数。
*
* sqls和prams示例:
* string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。
* SqlParameter[] pramsOne = {...};
*
* int areaid = 123;
* // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。
* string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";
* SqlParameter[] pram1 =
* {
* null, // 注:与未知id对应参数设置为空。
* db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)
* };
* ......
*
* ArrayList arraySQL = new ArrayList();
* ArrayList arrayPram = new ArrayList();
* sqls.Add(sql1);
* prams.Add(pram1);
* .......
*
* int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");
*
* 返 回 值: int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。
* --> 执行失败,返回-1。
*
*/
/// <summary>
/// 执行插入多个表的操作,第一个表(sqlOne)的主键为自动增长,若id=-1则插入失败
/// 利用插入语句sqlOne得到的ID作为后面插入语句的属性之一
///
/// sqls和prams示例:
/// string sqlOne = "insert into T_User(...) values(...)"; // T_Userd的UserID自增。
/// SqlParameter[] pramsOne = {...};
///
/// int areaid = 123;
/// // 注:与未知id对应的idvalue设置为@_ID_VALUE,此处UserID未知。
/// string sql1 = "insert into T_UserArea(UserID, AreaID) values(@_ID_VALUE, @areaid)";
/// SqlParameter[] pram1 =
/// {
/// null, // 注:与未知id对应参数设置为空。
/// db.MakeInParam("@areaid", SqlDbType.Int, 4, areaid)
/// };
/// ......
///
/// ArrayList arraySQL = new ArrayList();
/// ArrayList arrayPram = new ArrayList();
/// sqls.Add(sql1);
/// prams.Add(pram1);
/// .......
///
/// int id = db.ExecuteReturnID(sqlOne, pramsOne, sqls, prams, "...methodName");
///
/// </summary>
/// <param name="sqlOne">执行的第一条SQL语句</param>
/// <param name="pramsOne">sqlOne语句对应的参数</param>
/// <param name="sqls">连锁执行的SQL语句链表</param>
/// <param name="prams">与sqls中每条SQL语句相对应的参数</param>
/// <returns>
/// int --> 执行成功,返回执行第一条语句所插入的一条记录的ID值。
/// --> 执行失败,返回-1。
/// </returns>
public int ExecuteReturnID(string sqlOne, SqlParameter[] pramsOne, ArrayList sqls, ArrayList prams, string callMethodName)
{
int id = -1; // 初始化id值为-1
// 在第一条insert语句后加入select语句,以获得插入记录的ID值。
sqlOne += ";select CAST( SCOPE_IDENTITY() AS INT) ";
SqlCommand cmd = new SqlCommand();
try
{
this.Open();
cmd.Connection = this.connection;
cmd.CommandText = sqlOne;
for (int i = 0; i < pramsOne.Length; i++) // 插入对应参数。
{
cmd.Parameters.Add(pramsOne[i]);
}
cmd.Transaction = connection.BeginTransaction(); // 事务开始
id = (Int32)cmd.ExecuteScalar(); // 获得插入记录的ID。
// 若sqls和prams不为空,则执行其中的操作。
if (sqls != null && prams != null)
{
// 检查参数中SQL语句sqls和参数prams是否对应,不对应则不执行操作,返回-1。
if (sqls.Count != prams.Count)
{