using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using System.Text;
using System.Configuration;
using System.Linq;
namespace Common
{
public class SqlHelp
{
public delegate T BuildObjectHandler<T>(IDataReader reader);
public delegate Object BuildObjectHandler1(IDataReader reader);
private static readonly string ConnStr = ConfigurationManager.AppSettings["ConnectionString"];
private static object syncLock = new object();
private static SqlHelp _instance;
public static SqlHelp Instance()
{
if (_instance == null)
{
lock (syncLock)
{
if (_instance == null)
{
_instance = new SqlHelp();
}
}
}
return _instance;
}
public int ExecuteNonQuery(string commandText)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = new SqlCommand(commandText);
command.Connection = conn;
return command.ExecuteNonQuery();
}
}
public object ExecuteFrist(string commandText)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = new SqlCommand(commandText);
command.Connection = conn;
return command.ExecuteScalar();
}
}
public object ExecuteFrist(string commandText, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(commandText, parameterValues);
command.Connection = conn;
return command.ExecuteScalar();
}
}
public object ExecuteFrist(string commandText, string ExecuteNonQuery, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = new SqlCommand(commandText, conn);
if (ps != null)
{
command.Parameters.Clear();
foreach (IDbDataParameter p in ps)
{
command.Parameters.Add(p);
}
}
return Convert.ToInt32(command.ExecuteScalar());
}
}
public int ExecuteNonQuery(string commandText, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
int iRows;
SqlCommand command = new SqlCommand(commandText, conn);
if (ps != null)
{
command.Parameters.Clear();
foreach (IDbDataParameter p in ps)
{
command.Parameters.Add(p);
}
}
iRows = command.ExecuteNonQuery();
return iRows;
}
}
public int ExecuteQuery(string commandText, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = new SqlCommand(commandText, conn);
if (ps != null)
{
command.Parameters.Clear();
foreach (IDbDataParameter p in ps)
{
command.Parameters.Add(p);
}
}
return Convert.ToInt32(command.ExecuteScalar());
}
}
public int ExecuteInsert(string commandText, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = new SqlCommand(commandText, conn);
if (ps != null)
{
command.Parameters.Clear();
foreach (IDbDataParameter p in ps)
{
command.Parameters.Add(p);
}
}
return Convert.ToInt32(command.ExecuteNonQuery());
}
}
public DataTable ExecuteDataTable(string commandText)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
try
{
conn.Open();
SqlCommand command = new SqlCommand(commandText);
command.Connection = conn;
using (IDataReader dr = command.ExecuteReader())
{
DataTable dt = new DataTable("row");
dt.Load(dr);
conn.Close();
return dt;
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
conn.Close();
}
}
}
public IDataReader ExecuteProduceReader(string storedProcedureName, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(storedProcedureName, parameterValues);
command.Connection = conn;
return command.ExecuteReader();
}
}
public int ExecuteProduce(string produceName, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(produceName, parameterValues);
command.Connection = conn;
return command.ExecuteNonQuery();
}
}
public string ExecuteProduceReturn(string produceName, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(produceName, parameterValues);
command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
command.Connection = conn;
command.ExecuteNonQuery();
return command.Parameters["@return"].Value.ToString();
}
}
public int ExecuteProduceReturnInt(string produceName, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(produceName, parameterValues);
command.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
command.Connection = conn;
command.ExecuteNonQuery();
return int.Parse(command.Parameters["@return"].Value.ToString());
}
}
public DataTable GetProduceDataTable(string cmdText, CommandType cmdType, SqlParameter[] cmdParms)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlDataReader reader;
DataTable dt = new DataTable();
try
{
SqlCommand cmd = new SqlCommand();
SetCommand(cmd, cmdText, cmdType,conn, cmdParms);
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
dt.Load(reader);
reader.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
return dt;
}
}
public DataTable GetProduceDataTableAndOutput(string cmdText, CommandType cmdType, SqlParameter[] cmdParms,out string output)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlDataReader reader;
DataTable dt = new DataTable();
try
{
SqlCommand cmd = new SqlCommand();
SetCommand(cmd, cmdText, cmdType, conn, cmdParms);
cmd.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 60));
cmd.Parameters["@outPut"].Direction = ParameterDirection.Output;
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
dt.Load(reader);
output=cmd.Parameters["@outPut"].Value.ToString();
reader.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
return dt;
}
}
public string ExecuteProduceOutPut(string produceName, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(produceName, parameterValues);
command.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 60));
command.Parameters["@outPut"].Direction = ParameterDirection.Output;
command.Connection = conn;
command.ExecuteNonQuery();
return command.Parameters["@outPut"].Value.ToString();
}
}
public int ExecuteProduceReturnOutPut(string produceName, out string outStr, params object[] parameterValues)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
SqlCommand command = GetStoredCommand(produceName, parameterValues);
command.Parameters.Add(new SqlParameter("@return", SqlDbType.Int));
command.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
command.Parameters.Add(new SqlParameter("@outPut", SqlDbType.VarChar, 8000));
command.Parameters["@outPut"].Direction = ParameterDirection.Output;
command.Connection = conn;
command.ExecuteNonQuery();
outStr = command.Parameters["@outPut"].Value.ToString();
string ret = command.Parameters["@return"].Value.ToString();
return int.Parse(ret);
}
}
/// <summary>
/// 获取存储过程命令
/// </summary>
/// <param name="storedProcedureName"></param>
/// <param name="parameterValues"></param>
/// <returns></returns>
public SqlCommand GetStoredCommand(string storedProcedureName, params object[] parameterValues)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = storedProcedureName;
cmd.Parameters.Clear();
if (parameterValues != null && parameterValues.Length > 0)
{
for (int i = 0; i < parameterValues.Length; i++)
{
cmd.Parameters.Add(parameterValues[i]);
}
}
return cmd;
}
public IList<T> ExecuteQueryToList<T>(string sqlStr, BuildObjectHandler<T> buildObj)
{
IList<T> sets = new List<T>();
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand(sqlStr, conn);
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
sets.Add(buildObj(dr));
}
dr.Close();
}
}
catch (Exception)
{
conn.Close();
throw;
}
}
return sets;
}
/// <summary>
/// 存储过程返回list集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sqlStr"></param>
/// <param name="buildObj"></param>
/// <returns></returns>
public IList<T> ExecuteQueryToListByProcedure<T>(string storedProcedureName, BuildObjectHandler<T> buildObj, params object[] parameterValues)
{
IList<T> sets = new List<T>();
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = GetStoredCommand(storedProcedureName, parameterValues);
cmd.CommandTimeout = 180;
cmd.Connection = conn;
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
sets.Add(buildObj(dr));
}
dr.Close();
}
}
catch (Exception)
{
conn.Close();
throw;
}
}
return sets;
}
public T ExecuteQueryToFirst<T>(string sqlStr, BuildObjectHandler<T> buildObj)
{
IList<T> sets = new List<T>();
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand(sqlStr, conn);
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
sets.Add(buildObj(dr));
break;
}
dr.Close();
}
}
catch (Exception)
{
conn.Close();
throw;
}
}
return sets.First();
}
public Object ExecuteQueryToFirstAndReturn(string proName, out int returnVal, BuildObjectHandler1 buildObj, params object[] parameterValues)
{
IList<Object> sets = new List<Object>();
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = GetStoredCommand(proName, parameterValues);
cmd.Parameters["@return"].Direction = ParameterDirection.ReturnValue;
cmd.Connection = conn;
conn.Open();
//cmd.ExecuteNonQuery();
//returnVal = 0;
try
{
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
sets.Add(buildObj(dr));
break;
}
dr.Close();
returnVal = int.Parse(cmd.Parameters["@return"].Value.ToString());
}
}
catch (Exception)
{
conn.Close();
throw;
}
}
if (sets.Count == 0)
{
return null;
}
return sets.First();
}
//根据父ID找出所有的子节点
public string GetChildIDStr(string tabName, string pKey, string parentName, int parentID)
{
StringBuilder sqlStr = new StringBuilder();
sqlStr.Append("create table #lsb(id int) ");
sqlStr.Append(string.Format("insert into #lsb values({0}) ", parentID));
sqlStr.Append(string.Format("insert into #lsb select {0} from {1} where {2}={3} ", pKey, tabName,
parentName, parentID));
sqlStr.Append(" while @@rowcount>0 ");
sqlStr.Append(
string.Format(
"insert into #lsb select a.{0} from {1} a inner join #lsb b on a.{2}=b.id where a.{0} not in (select id from #lsb)",
pKey, tabName, parentName));
sqlStr.Append(" select id from #lsb ");
sqlStr.Append(" drop table #lsb");
string childSr = "";
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand(sqlStr.ToString(), conn);
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
childSr = childSr + dr[0].ToString() + ",";
}
dr.Close();
}
}
catch (Exception)
{
conn.Close();
throw;
}
return childSr.Trim(',');
}
}
public Dictionary<string, string> GetDictionary(string sqlStr)
{
Dictionary<string, string> dic = new Dictionary<string, string>();
using (SqlConnection conn = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand(sqlStr, conn);
try
{
conn.Open();
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
dic.Add(dr[0].ToString(), dr[1].ToString());
}
dr.Close();
}
}
catch (Exception)
{
conn.Close();
throw;
}
}
return dic;
}
public SqlConnection GetConnection()
{
SqlConnection conn = new SqlConnection(ConnStr);
return conn;
}
public bool ExecuteTrasaction(string sqlStr, IList<SqlParameter> param)
{
SqlTransaction tran = null;
try
{
using (SqlConnection conn = GetConnection())
{
conn.Open();
SqlCommand cmd;
tran = conn.BeginTransaction();
if (param.Count > 0)
{
cmd = new SqlCommand(sqlStr, conn, tran);
foreach (var sqlParam in param)
{
if (sqlParam != null)
{
cmd.Parameters.Add(sqlParam);
}
}
cmd.ExecuteNonQuery();
tran.Commit();
}
return true;
}
}
catch
{
tran.Rollback();
}
return false;
}
/// <summary>
/// Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
/// using the provided parameters.
/// </summary>
/// <remarks>
/// e.g.:
/// DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
/// </remarks>
/// <param name="connection">a valid SqlConnection</param>
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
/// <param name="commandText">the stored procedure name or T-SQL command</param>
/// <param name="commandParameters">an array of SqlParamters used to execute the command</param>
/// <returns>a dataset containing the resultset generated by the command</returns>
public DataSet ExecuteDataset(CommandType commandType, string commandText, params SqlParameter[] commandParameters)
{
SqlConnection connection = new SqlConnection(ConnStr);
//create a command and prepare it for execution
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, (SqlTransaction)null, commandType, commandText, commandParameters);
//create the DataAdapter & DataSet
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
//fill the DataSet using default values for DataTable names, etc.
da.Fill(ds);
// detach the SqlParameters from the command object, so they can be used again.
cmd.Parameters.Clear();
connection.Close();
connection.Dispose();
//return the dataset
return ds;
}
/// <summary>
/// This method opens (if necessary) and assigns a connection, transaction, command type and parameters
/// to the provided command.
/// </summary>
/// <param name="command">the SqlCommand to be prepared</param>
/// <param name="connection">a valid SqlConnection, on which to execute this command</param>
/// <param name="transaction">a valid SqlTransaction, or 'null'</param>
/// <param name="commandType">the CommandType (stored procedure, text, etc.)</param>
/// <param name="commandText">the stored procedure name or T-SQL command</param>
/// <param name="commandParameters">an array of SqlParameters to be associated with the command or 'null' if no parameters are required</param>
private void PrepareCommand(SqlCommand command, SqlConnection connection, SqlTransaction transaction, CommandType commandType, string commandText, SqlParameter[] commandParameters)
{
//if the provided connection is not open, we will open it
if (connection.State != ConnectionState.Open)
{
connection.Open();
}
//associate the connection with the command
command.Connection = connection;
//set the command text (stored procedure name or SQL statement)
command.CommandText = commandText;
//if we were provided a transaction, assign it.
if (transaction != null)
{
command.Transaction = transaction;
}
//set the command type
command.CommandType = commandType;
//attach the command parameters if they are provided
if (commandParameters != null)
{
AttachParameters(command, commandParameters);
}
return;
}
/// <summary>
/// This method is used to attach array of SqlParameters to a SqlCommand.
///
/// This method will assign a value of DbNull to any parameter with a direction of
/// InputOutput and a value of null.
///
/// This behavior will prevent default values from being used, but
/// this will be the less common case than an intended pure output parameter (derived as InputOutput)
/// where the user provided no input value.
/// </summary>
/// <param name="command">The command to which the parameters will be added</param>
/// <param name="commandParameters">an array of SqlParameters tho be added to command</param>
private void AttachParameters(SqlCommand command, SqlParameter[] commandParameters)
{
foreach (SqlParameter p in commandParameters)
{
//check for derived output value with no value assigned
if ((p.Direction == ParameterDirection.InputOutput) && (p.Value == null))
{
p.Value = DBNull.Value;
}
command.Parameters.Add(p);
}
}
/// <summary>
/// 执行无参数的sql语句
/// </summary>
/// <param name="commandText"></param>
/// <returns></returns>
public void ExecuteSqls(List<string> commandText)
{
//using (SqlConnection conn = new SqlConnection(ConnStr))
//{
// conn.Open();
// SqlCommand command = new SqlCommand(commandText);
// command.Connection = conn;
// return command.ExecuteNonQuery();
//}
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
SqlCommand cmd = new SqlCommand();
try
{
cmd.Connection = conn;
cmd.Transaction = trans;
//循环
foreach (string sql in commandText)
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
conn.Close();
throw ex;
}
finally
{
conn.Close();
}
}
}
}
/// <summary>
/// 批量执行带参数的sql语句
/// </summary>
/// <param name="sqlList"></param>
public void ExecuteSqlsParameter(List<KeyValuePair<object, object>> sqlList)
{
using (SqlConnection conn = new SqlConnection(ConnStr))
{
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction())
{
SqlCommand cmd = new SqlCommand();
try
{
cmd.Connection = conn;
cmd.Transaction = trans;
//循环
foreach (KeyValuePair<object, object> sql in sqlList)
{
cmd.CommandText = sql.Key.ToString();
foreach (SqlParameter item in (SqlParameter[])sql.Value)
{
cmd.Parameters.Add(item);
}
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
conn.Close();
throw ex;
}
finally
{
conn.Close();
}
}
}
}
#region 设置SqlCommand对象
/// <summary>
/// 设置SqlCommand对象
/// </summary>
/// <param name="cmd">SqlCommand对象 </param>
/// <param name="cmdText">命令文本</param>
/// <param name="cmdType">命令类型</param>
/// <param name="cmdParms">参数集合</param>
private static void SetCommand(SqlCommand cmd, string cmdText, CommandType cmdType,SqlConnection conn, SqlParameter[] cmdParms)
{
cmd.Connection = conn;
cmd.CommandText = cmdText;
cmd.CommandType = cmdType;
if (cmdParms != null)
{
cmd.Parameters.AddRange(cmdParms);
}
}
#endregion
}
}