using
System;
using
System.Collections;
using
System.Collections.Specialized;
using
System.Data;
using
System.Data.SqlClient;
using
System.Configuration;
using
System.Data.Common;
using
System.Collections.Generic;
namespace
Maticsoft.DBUtility
{
///
<summary>
///
数据访问抽象基础类
///
</summary>
public
abstract
class
DbHelperSQL
{
//
<?xml version="1.0" encoding="utf-8" ?>
//
<configuration>
//
<appSettings>
//
<!--连接主程序的字符串-->
//
<add key="connection" value="server=CONTRON-CAD9158;uid=sa;pwd=sa;database=syt"/>
//
<!---->
//
<add key="connectionzt" value="server=CONTRON-CAD9158;uid=sa;pwd=sa;database=syt_qwerthjkl"/>
//
<!--连接主SQLServer 的字符串-->
//
<add key="ConnectServer" value="server=CONTRON-CAD9158;uid=sa;pwd=sa;database=master"/>
//
<!--建立数据库的连接字符串-->
//
<add key="connInit" value="data source=CONTRON-CAD9158;user id=sa;password=sa;persist security info=false;packet size=4096"/>
//
<!--SQLServer安装目录-->
//
<add key="sqlServerData" value="C:\Program Files\Microsoft SQL Server\MSSQL\Data"/>
//
</appSettings>
//
</configuration>
//
数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
public
static
string
connectionString
=
PubConstant.ConnectionString;
public
static
string
connectionString
=
System.Configuration.ConfigurationSettings.AppSettings[
"
connection
"
];
public
static
string
connInitStr
=
System.Configuration.ConfigurationSettings.AppSettings[
"
connInit
"
];
public
static
string
sqlServerPath
=
System.Configuration.ConfigurationSettings.AppSettings[
"
sqlServerData
"
];
public
static
string
connectServer
=
ConfigurationSettings.AppSettings[
"
ConnectServer
"
];
public
DbHelperSQL()
{
}
#region
公用方法
///
<summary>
///
判断是否存在某表的某个字段
///
</summary>
///
<param name="tableName">
表名称
</param>
///
<param name="columnName">
列名称
</param>
///
<returns>
是否存在
</returns>
public
static
bool
ColumnExists(
string
tableName,
string
columnName)
{
string
sql
=
"
select count(1) from syscolumns where [id]=object_id('
"
+
tableName
+
"
') and [name]='
"
+
columnName
+
"
'
"
;
object
res
=
GetSingle(sql);
if
(res
==
null
)
{
return
false
;
}
return
Convert.ToInt32(res)
>
0
;
}
public
static
int
GetMaxID(
string
FieldName,
string
TableName)
{
string
strsql
=
"
select max(
"
+
FieldName
+
"
)+1 from
"
+
TableName;
object
obj
=
GetSingle(strsql);
if
(obj
==
null
)
{
return
1
;
}
else
{
return
int
.Parse(obj.ToString());
}
}
public
static
bool
Exists(
string
strSql)
{
object
obj
=
GetSingle(strSql);
int
cmdresult;
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
cmdresult
=
0
;
}
else
{
cmdresult
=
int
.Parse(obj.ToString());
}
if
(cmdresult
==
0
)
{
return
false
;
}
else
{
return
true
;
}
}
///
<summary>
///
表是否存在
///
</summary>
///
<param name="TableName"></param>
///
<returns></returns>
public
static
bool
TabExists(
string
TableName)
{
string
strsql
=
"
select count(*) from sysobjects where id = object_id(N'[
"
+
TableName
+
"
]') and OBJECTPROPERTY(id, N'IsUserTable') = 1
"
;
//
string strsql = "SELECT count(*) FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[" + TableName + "]') AND type in (N'U')";
object
obj
=
GetSingle(strsql);
int
cmdresult;
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
cmdresult
=
0
;
}
else
{
cmdresult
=
int
.Parse(obj.ToString());
}
if
(cmdresult
==
0
)
{
return
false
;
}
else
{
return
true
;
}
}
public
static
bool
Exists(
string
strSql,
params
SqlParameter[] cmdParms)
{
object
obj
=
GetSingle(strSql, cmdParms);
int
cmdresult;
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
cmdresult
=
0
;
}
else
{
cmdresult
=
int
.Parse(obj.ToString());
}
if
(cmdresult
==
0
)
{
return
false
;
}
else
{
return
true
;
}
}
#endregion
#region
执行简单SQL语句
///
<summary>
///
执行SQL语句,返回影响的记录数
///
</summary>
///
<param name="SQLString">
SQL语句
</param>
///
<returns>
影响的记录数
</returns>
public
static
int
ExecuteSql(
string
SQLString)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand(SQLString, connection))
{
try
{
connection.Open();
int
rows
=
cmd.ExecuteNonQuery();
return
rows;
}
catch
(System.Data.SqlClient.SqlException e)
{
connection.Close();
throw
e;
}
}
}
}
public
static
int
ExecuteSqlByTime(
string
SQLString,
int
Times)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand(SQLString, connection))
{
try
{
connection.Open();
cmd.CommandTimeout
=
Times;
int
rows
=
cmd.ExecuteNonQuery();
return
rows;
}
catch
(System.Data.SqlClient.SqlException e)
{
connection.Close();
throw
e;
}
}
}
}
///
<summary>
///
执行Sql和Oracle滴混合事务
///
</summary>
///
<param name="list">
SQL命令行列表
</param>
///
<param name="oracleCmdSqlList">
Oracle命令行列表
</param>
///
<returns>
执行结果 0-由于SQL造成事务失败 -1 由于Oracle造成事务失败 1-整体事务执行成功
</returns>
public
static
int
ExecuteSqlTran(List
<
CommandInfo
>
list, List
<
CommandInfo
>
oracleCmdSqlList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd
=
new
SqlCommand();
cmd.Connection
=
conn;
SqlTransaction tx
=
conn.BeginTransaction();
cmd.Transaction
=
tx;
try
{
foreach
(CommandInfo myDE
in
list)
{
string
cmdText
=
myDE.CommandText;
SqlParameter[] cmdParms
=
(SqlParameter[])myDE.Parameters;
PrepareCommand(cmd, conn, tx, cmdText, cmdParms);
if
(myDE.EffentNextType
==
EffentNextType.SolicitationEvent)
{
if
(myDE.CommandText.ToLower().IndexOf(
"
count(
"
)
==
-
1
)
{
tx.Rollback();
throw
new
Exception(
"
违背要求
"
+
myDE.CommandText
+
"
必须符合select count(..的格式
"
);
//
return 0;
}
object
obj
=
cmd.ExecuteScalar();
bool
isHave
=
false
;
if
(obj
==
null
&&
obj
==
DBNull.Value)
{
isHave
=
false
;
}
isHave
=
Convert.ToInt32(obj)
>
0
;
if
(isHave)
{
//
引发事件
myDE.OnSolicitationEvent();
}
}
if
(myDE.EffentNextType
==
EffentNextType.WhenHaveContine
||
myDE.EffentNextType
==
EffentNextType.WhenNoHaveContine)
{
if
(myDE.CommandText.ToLower().IndexOf(
"
count(
"
)
==
-
1
)
{
tx.Rollback();
throw
new
Exception(
"
SQL:违背要求
"
+
myDE.CommandText
+
"
必须符合select count(..的格式
"
);
//
return 0;
}
object
obj
=
cmd.ExecuteScalar();
bool
isHave
=
false
;
if
(obj
==
null
&&
obj
==
DBNull.Value)
{
isHave
=
false
;
}
isHave
=
Convert.ToInt32(obj)
>
0
;
if
(myDE.EffentNextType
==
EffentNextType.WhenHaveContine
&&
!
isHave)
{
tx.Rollback();
throw
new
Exception(
"
SQL:违背要求
"
+
myDE.CommandText
+
"
返回值必须大于0
"
);
//
return 0;
}
if
(myDE.EffentNextType
==
EffentNextType.WhenNoHaveContine
&&
isHave)
{
tx.Rollback();
throw
new
Exception(
"
SQL:违背要求
"
+
myDE.CommandText
+
"
返回值必须等于0
"
);
//
return 0;
}
continue
;
}
int
val
=
cmd.ExecuteNonQuery();
if
(myDE.EffentNextType
==
EffentNextType.ExcuteEffectRows
&&
val
==
0
)
{
tx.Rollback();
throw
new
Exception(
"
SQL:违背要求
"
+
myDE.CommandText
+
"
必须有影响行
"
);
//
return 0;
}
cmd.Parameters.Clear();
}
string
oraConnectionString
=
PubConstant.GetConnectionString(
"
ConnectionStringPPC
"
);
bool
res
=
OracleHelper.ExecuteSqlTran(oraConnectionString, oracleCmdSqlList);
if
(
!
res)
{
tx.Rollback();
throw
new
Exception(
"
Oracle执行失败
"
);
//
return -1;
}
tx.Commit();
return
1
;
}
catch
(System.Data.SqlClient.SqlException e)
{
tx.Rollback();
throw
e;
}
catch
(Exception e)
{
tx.Rollback();
throw
e;
}
}
}
///
<summary>
///
执行多条SQL语句,实现数据库事务。
///
</summary>
///
<param name="SQLStringList">
多条SQL语句
</param>
public
static
int
ExecuteSqlTran(List
<
String
>
SQLStringList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd
=
new
SqlCommand();
cmd.Connection
=
conn;
SqlTransaction tx
=
conn.BeginTransaction();
cmd.Transaction
=
tx;
try
{
int
count
=
0
;
for
(
int
n
=
0
; n
<
SQLStringList.Count; n
++
)
{
string
strsql
=
SQLStringList[n];
if
(strsql.Trim().Length
>
1
)
{
cmd.CommandText
=
strsql;
count
+=
cmd.ExecuteNonQuery();
}
}
tx.Commit();
return
count;
}
catch
{
tx.Rollback();
return
0
;
}
}
}
///
<summary>
///
执行带一个存储过程参数的的SQL语句。
///
</summary>
///
<param name="SQLString">
SQL语句
</param>
///
<param name="content">
参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加
</param>
///
<returns>
影响的记录数
</returns>
public
static
int
ExecuteSql(
string
SQLString,
string
content)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
SqlCommand cmd
=
new
SqlCommand(SQLString, connection);
System.Data.SqlClient.SqlParameter myParameter
=
new
System.Data.SqlClient.SqlParameter(
"
@content
"
, SqlDbType.NText);
myParameter.Value
=
content;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
int
rows
=
cmd.ExecuteNonQuery();
return
rows;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
///
<summary>
///
执行带一个存储过程参数的的SQL语句。
///
</summary>
///
<param name="SQLString">
SQL语句
</param>
///
<param name="content">
参数内容,比如一个字段是格式复杂的文章,有特殊符号,可以通过这个方式添加
</param>
///
<returns>
影响的记录数
</returns>
public
static
object
ExecuteSqlGet(
string
SQLString,
string
content)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
SqlCommand cmd
=
new
SqlCommand(SQLString, connection);
System.Data.SqlClient.SqlParameter myParameter
=
new
System.Data.SqlClient.SqlParameter(
"
@content
"
, SqlDbType.NText);
myParameter.Value
=
content;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
object
obj
=
cmd.ExecuteScalar();
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
return
null
;
}
else
{
return
obj;
}
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
///
<summary>
///
向数据库里插入图像格式的字段(和上面情况类似的另一种实例)
///
</summary>
///
<param name="strSQL">
SQL语句
</param>
///
<param name="fs">
图像字节,数据库的字段类型为image的情况
</param>
///
<returns>
影响的记录数
</returns>
public
static
int
ExecuteSqlInsertImg(
string
strSQL,
byte
[] fs)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
SqlCommand cmd
=
new
SqlCommand(strSQL, connection);
System.Data.SqlClient.SqlParameter myParameter
=
new
System.Data.SqlClient.SqlParameter(
"
@fs
"
, SqlDbType.Image);
myParameter.Value
=
fs;
cmd.Parameters.Add(myParameter);
try
{
connection.Open();
int
rows
=
cmd.ExecuteNonQuery();
return
rows;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
finally
{
cmd.Dispose();
connection.Close();
}
}
}
///
<summary>
///
执行一条计算查询结果语句,返回查询结果(object)。
///
</summary>
///
<param name="SQLString">
计算查询结果语句
</param>
///
<returns>
查询结果(object)
</returns>
public
static
object
GetSingle(
string
SQLString)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand(SQLString, connection))
{
try
{
connection.Open();
object
obj
=
cmd.ExecuteScalar();
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
return
null
;
}
else
{
return
obj;
}
}
catch
(System.Data.SqlClient.SqlException e)
{
connection.Close();
throw
e;
}
}
}
}
public
static
object
GetSingle(
string
SQLString,
int
Times)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand(SQLString, connection))
{
try
{
connection.Open();
cmd.CommandTimeout
=
Times;
object
obj
=
cmd.ExecuteScalar();
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
return
null
;
}
else
{
return
obj;
}
}
catch
(System.Data.SqlClient.SqlException e)
{
connection.Close();
throw
e;
}
}
}
}
///
<summary>
///
执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
///
</summary>
///
<param name="strSQL">
查询语句
</param>
///
<returns>
SqlDataReader
</returns>
public
static
SqlDataReader ExecuteReader(
string
strSQL)
{
SqlConnection connection
=
new
SqlConnection(connectionString);
SqlCommand cmd
=
new
SqlCommand(strSQL, connection);
try
{
connection.Open();
SqlDataReader myReader
=
cmd.ExecuteReader(CommandBehavior.CloseConnection);
return
myReader;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
}
///
<summary>
///
执行查询语句,返回DataSet
///
</summary>
///
<param name="SQLString">
查询语句
</param>
///
<returns>
DataSet
</returns>
public
static
DataSet Query(
string
SQLString)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
DataSet ds
=
new
DataSet();
try
{
connection.Open();
SqlDataAdapter command
=
new
SqlDataAdapter(SQLString, connection);
command.Fill(ds,
"
ds
"
);
}
catch
(System.Data.SqlClient.SqlException ex)
{
throw
new
Exception(ex.Message);
}
return
ds;
}
}
public
static
DataSet Query(
string
SQLString,
int
Times)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
DataSet ds
=
new
DataSet();
try
{
connection.Open();
SqlDataAdapter command
=
new
SqlDataAdapter(SQLString, connection);
command.SelectCommand.CommandTimeout
=
Times;
command.Fill(ds,
"
ds
"
);
}
catch
(System.Data.SqlClient.SqlException ex)
{
throw
new
Exception(ex.Message);
}
return
ds;
}
}
#endregion
#region
执行带参数的SQL语句
///
<summary>
///
执行SQL语句,返回影响的记录数
///
</summary>
///
<param name="SQLString">
SQL语句
</param>
///
<returns>
影响的记录数
</returns>
public
static
int
ExecuteSql(
string
SQLString,
params
SqlParameter[] cmdParms)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand())
{
try
{
PrepareCommand(cmd, connection,
null
, SQLString, cmdParms);
int
rows
=
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return
rows;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
}
}
}
///
<summary>
///
执行多条SQL语句,实现数据库事务。
///
</summary>
///
<param name="SQLStringList">
SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])
</param>
public
static
void
ExecuteSqlTran(Hashtable SQLStringList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
using
(SqlTransaction trans
=
conn.BeginTransaction())
{
SqlCommand cmd
=
new
SqlCommand();
try
{
//
循环
foreach
(DictionaryEntry myDE
in
SQLStringList)
{
string
cmdText
=
myDE.Key.ToString();
SqlParameter[] cmdParms
=
(SqlParameter[])myDE.Value;
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
int
val
=
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}
trans.Commit();
}
catch
{
trans.Rollback();
throw
;
}
}
}
}
///
<summary>
///
执行多条SQL语句,实现数据库事务。
///
</summary>
///
<param name="SQLStringList">
SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])
</param>
public
static
int
ExecuteSqlTran(System.Collections.Generic.List
<
CommandInfo
>
cmdList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
using
(SqlTransaction trans
=
conn.BeginTransaction())
{
SqlCommand cmd
=
new
SqlCommand();
try
{
int
count
=
0
;
//
循环
foreach
(CommandInfo myDE
in
cmdList)
{
string
cmdText
=
myDE.CommandText;
SqlParameter[] cmdParms
=
(SqlParameter[])myDE.Parameters;
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
if
(myDE.EffentNextType
==
EffentNextType.WhenHaveContine
||
myDE.EffentNextType
==
EffentNextType.WhenNoHaveContine)
{
if
(myDE.CommandText.ToLower().IndexOf(
"
count(
"
)
==
-
1
)
{
trans.Rollback();
return
0
;
}
object
obj
=
cmd.ExecuteScalar();
bool
isHave
=
false
;
if
(obj
==
null
&&
obj
==
DBNull.Value)
{
isHave
=
false
;
}
isHave
=
Convert.ToInt32(obj)
>
0
;
if
(myDE.EffentNextType
==
EffentNextType.WhenHaveContine
&&
!
isHave)
{
trans.Rollback();
return
0
;
}
if
(myDE.EffentNextType
==
EffentNextType.WhenNoHaveContine
&&
isHave)
{
trans.Rollback();
return
0
;
}
continue
;
}
int
val
=
cmd.ExecuteNonQuery();
count
+=
val;
if
(myDE.EffentNextType
==
EffentNextType.ExcuteEffectRows
&&
val
==
0
)
{
trans.Rollback();
return
0
;
}
cmd.Parameters.Clear();
}
trans.Commit();
return
count;
}
catch
{
trans.Rollback();
throw
;
}
}
}
}
///
<summary>
///
执行多条SQL语句,实现数据库事务。
///
</summary>
///
<param name="SQLStringList">
SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])
</param>
public
static
void
ExecuteSqlTranWithIndentity(System.Collections.Generic.List
<
CommandInfo
>
SQLStringList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
using
(SqlTransaction trans
=
conn.BeginTransaction())
{
SqlCommand cmd
=
new
SqlCommand();
try
{
int
indentity
=
0
;
//
循环
foreach
(CommandInfo myDE
in
SQLStringList)
{
string
cmdText
=
myDE.CommandText;
SqlParameter[] cmdParms
=
(SqlParameter[])myDE.Parameters;
foreach
(SqlParameter q
in
cmdParms)
{
if
(q.Direction
==
ParameterDirection.InputOutput)
{
q.Value
=
indentity;
}
}
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
int
val
=
cmd.ExecuteNonQuery();
foreach
(SqlParameter q
in
cmdParms)
{
if
(q.Direction
==
ParameterDirection.Output)
{
indentity
=
Convert.ToInt32(q.Value);
}
}
cmd.Parameters.Clear();
}
trans.Commit();
}
catch
{
trans.Rollback();
throw
;
}
}
}
}
///
<summary>
///
执行多条SQL语句,实现数据库事务。
///
</summary>
///
<param name="SQLStringList">
SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])
</param>
public
static
void
ExecuteSqlTranWithIndentity(Hashtable SQLStringList)
{
using
(SqlConnection conn
=
new
SqlConnection(connectionString))
{
conn.Open();
using
(SqlTransaction trans
=
conn.BeginTransaction())
{
SqlCommand cmd
=
new
SqlCommand();
try
{
int
indentity
=
0
;
//
循环
foreach
(DictionaryEntry myDE
in
SQLStringList)
{
string
cmdText
=
myDE.Key.ToString();
SqlParameter[] cmdParms
=
(SqlParameter[])myDE.Value;
foreach
(SqlParameter q
in
cmdParms)
{
if
(q.Direction
==
ParameterDirection.InputOutput)
{
q.Value
=
indentity;
}
}
PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
int
val
=
cmd.ExecuteNonQuery();
foreach
(SqlParameter q
in
cmdParms)
{
if
(q.Direction
==
ParameterDirection.Output)
{
indentity
=
Convert.ToInt32(q.Value);
}
}
cmd.Parameters.Clear();
}
trans.Commit();
}
catch
{
trans.Rollback();
throw
;
}
}
}
}
///
<summary>
///
执行一条计算查询结果语句,返回查询结果(object)。
///
</summary>
///
<param name="SQLString">
计算查询结果语句
</param>
///
<returns>
查询结果(object)
</returns>
public
static
object
GetSingle(
string
SQLString,
params
SqlParameter[] cmdParms)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
using
(SqlCommand cmd
=
new
SqlCommand())
{
try
{
PrepareCommand(cmd, connection,
null
, SQLString, cmdParms);
object
obj
=
cmd.ExecuteScalar();
cmd.Parameters.Clear();
if
((Object.Equals(obj,
null
))
||
(Object.Equals(obj, System.DBNull.Value)))
{
return
null
;
}
else
{
return
obj;
}
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
}
}
}
///
<summary>
///
执行查询语句,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
///
</summary>
///
<param name="strSQL">
查询语句
</param>
///
<returns>
SqlDataReader
</returns>
public
static
SqlDataReader ExecuteReader(
string
SQLString,
params
SqlParameter[] cmdParms)
{
SqlConnection connection
=
new
SqlConnection(connectionString);
SqlCommand cmd
=
new
SqlCommand();
try
{
PrepareCommand(cmd, connection,
null
, SQLString, cmdParms);
SqlDataReader myReader
=
cmd.ExecuteReader(CommandBehavior.CloseConnection);
cmd.Parameters.Clear();
return
myReader;
}
catch
(System.Data.SqlClient.SqlException e)
{
throw
e;
}
//
finally
//
{
//
cmd.Dispose();
//
connection.Close();
//
}
}
///
<summary>
///
执行查询语句,返回DataSet
///
</summary>
///
<param name="SQLString">
查询语句
</param>
///
<returns>
DataSet
</returns>
public
static
DataSet Query(
string
SQLString,
params
SqlParameter[] cmdParms)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
SqlCommand cmd
=
new
SqlCommand();
PrepareCommand(cmd, connection,
null
, SQLString, cmdParms);
using
(SqlDataAdapter da
=
new
SqlDataAdapter(cmd))
{
DataSet ds
=
new
DataSet();
try
{
da.Fill(ds,
"
ds
"
);
cmd.Parameters.Clear();
}
catch
(System.Data.SqlClient.SqlException ex)
{
throw
new
Exception(ex.Message);
}
return
ds;
}
}
}
private
static
void
PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans,
string
cmdText, SqlParameter[] cmdParms)
{
if
(conn.State
!=
ConnectionState.Open)
conn.Open();
cmd.Connection
=
conn;
cmd.CommandText
=
cmdText;
if
(trans
!=
null
)
cmd.Transaction
=
trans;
cmd.CommandType
=
CommandType.Text;
//
cmdType;
if
(cmdParms
!=
null
)
{
foreach
(SqlParameter parameter
in
cmdParms)
{
if
((parameter.Direction
==
ParameterDirection.InputOutput
||
parameter.Direction
==
ParameterDirection.Input)
&&
(parameter.Value
==
null
))
{
parameter.Value
=
DBNull.Value;
}
cmd.Parameters.Add(parameter);
}
}
}
#endregion
#region
存储过程操作
///
<summary>
///
执行存储过程,返回SqlDataReader ( 注意:调用该方法后,一定要对SqlDataReader进行Close )
///
</summary>
///
<param name="storedProcName">
存储过程名
</param>
///
<param name="parameters">
存储过程参数
</param>
///
<returns>
SqlDataReader
</returns>
public
static
SqlDataReader RunProcedure(
string
storedProcName, IDataParameter[] parameters)
{
SqlConnection connection
=
new
SqlConnection(connectionString);
SqlDataReader returnReader;
connection.Open();
SqlCommand command
=
BuildQueryCommand(connection, storedProcName, parameters);
command.CommandType
=
CommandType.StoredProcedure;
returnReader
=
command.ExecuteReader(CommandBehavior.CloseConnection);
return
returnReader;
}
///
<summary>
///
执行存储过程
///
</summary>
///
<param name="storedProcName">
存储过程名
</param>
///
<param name="parameters">
存储过程参数
</param>
///
<param name="tableName">
DataSet结果中的表名
</param>
///
<returns>
DataSet
</returns>
public
static
DataSet RunProcedure(
string
storedProcName, IDataParameter[] parameters,
string
tableName)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
DataSet dataSet
=
new
DataSet();
connection.Open();
SqlDataAdapter sqlDA
=
new
SqlDataAdapter();
sqlDA.SelectCommand
=
BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.Fill(dataSet, tableName);
connection.Close();
return
dataSet;
}
}
public
static
DataSet RunProcedure(
string
storedProcName, IDataParameter[] parameters,
string
tableName,
int
Times)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
DataSet dataSet
=
new
DataSet();
connection.Open();
SqlDataAdapter sqlDA
=
new
SqlDataAdapter();
sqlDA.SelectCommand
=
BuildQueryCommand(connection, storedProcName, parameters);
sqlDA.SelectCommand.CommandTimeout
=
Times;
sqlDA.Fill(dataSet, tableName);
connection.Close();
return
dataSet;
}
}
///
<summary>
///
构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
///
</summary>
///
<param name="connection">
数据库连接
</param>
///
<param name="storedProcName">
存储过程名
</param>
///
<param name="parameters">
存储过程参数
</param>
///
<returns>
SqlCommand
</returns>
private
static
SqlCommand BuildQueryCommand(SqlConnection connection,
string
storedProcName, IDataParameter[] parameters)
{
SqlCommand command
=
new
SqlCommand(storedProcName, connection);
command.CommandType
=
CommandType.StoredProcedure;
foreach
(SqlParameter parameter
in
parameters)
{
if
(parameter
!=
null
)
{
//
检查未分配值的输出参数,将其分配以DBNull.Value.
if
((parameter.Direction
==
ParameterDirection.InputOutput
||
parameter.Direction
==
ParameterDirection.Input)
&&
(parameter.Value
==
null
))
{
parameter.Value
=
DBNull.Value;
}
command.Parameters.Add(parameter);
}
}
return
command;
}
///
<summary>
///
执行存储过程,返回影响的行数
///
</summary>
///
<param name="storedProcName">
存储过程名
</param>
///
<param name="parameters">
存储过程参数
</param>
///
<param name="rowsAffected">
影响的行数
</param>
///
<returns></returns>
public
static
int
RunProcedure(
string
storedProcName, IDataParameter[] parameters,
out
int
rowsAffected)
{
using
(SqlConnection connection
=
new
SqlConnection(connectionString))
{
int
result;
connection.Open();
SqlCommand command
=
BuildIntCommand(connection, storedProcName, parameters);
rowsAffected
=
command.ExecuteNonQuery();
result
=
(
int
)command.Parameters[
"
ReturnValue
"
].Value;
//
Connection.Close();
return
result;
}
}
///
<summary>
///
创建 SqlCommand 对象实例(用来返回一个整数值)
///
</summary>
///
<param name="storedProcName">
存储过程名
</param>
///
<param name="parameters">
存储过程参数
</param>
///
<returns>
SqlCommand 对象实例
</returns>
private
static
SqlCommand BuildIntCommand(SqlConnection connection,
string
storedProcName, IDataParameter[] parameters)
{
SqlCommand command
=
BuildQueryCommand(connection, storedProcName, parameters);
command.Parameters.Add(
new
SqlParameter(
"
ReturnValue
"
,
SqlDbType.Int,
4
, ParameterDirection.ReturnValue,
false
,
0
,
0
,
string
.Empty, DataRowVersion.Default,
null
));
return
command;
}
#endregion
#region
还原与备份数据库
///
<summary>
///
还原数据库
///
</summary>
///
<param name="backfile">
数据库文件
</param>
///
<returns>
还原成功与否提示
</returns>
public
static
bool
RestoreDatabase(
string
dbName,
string
backfile)
{
///
杀死原来所有的数据库连接进程
///
bool
flag
=
false
;
SqlConnection conn
=
new
SqlConnection();
conn.ConnectionString
=
connectServer;
conn.Open();
string
sql
=
"
SELECT spid FROM sysprocesses ,sysdatabases WHERE sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='pubs'
"
;
SqlCommand cmd1
=
new
SqlCommand(sql, conn);
SqlDataReader dr;
ArrayList list
=
new
ArrayList();
try
{
dr
=
cmd1.ExecuteReader();
while
(dr.Read())
{
list.Add(dr.GetInt16(
0
));
}
dr.Close();
}
catch
(SqlException eee)
{
flag
=
false
;
Debug.Print(eee.ToString());
throw
eee;
}
finally
{
conn.Close();
}
Debug.Print(
"
使用的线程数
"
+
list.Count.ToString());
for
(
int
i
=
0
; i
<
list.Count; i
++
)
{
cmd1
=
new
SqlCommand(
string
.Format(
"
KILL {0}
"
, list[i].ToString()), conn);
cmd1.ExecuteNonQuery();
Debug.Print(
"
you have killed thread
"
+
list[i].ToString());
}
string
killThread
=
string
.Format(
"
declare hcforeach cursor global for
"
+
"
select 'kill '+rtrim(spid) from master.dbo.sysprocesses where dbid=db_id(N'{0}') exec sp_msforeach_worker '?'
"
, dbName);
//
还原前,kill进程
using
(SqlConnection connServer
=
new
SqlConnection(connectServer))
{
connServer.Open();
SqlCommand cmdServer
=
new
SqlCommand(killThread, connServer);
cmdServer.ExecuteNonQuery();
}
//
这里一定要是master数据库,而不能是要还原的数据库,因为这样便变成了有其它进程
//
占用了数据库。
string
constr
=
connectServer;
string
BACKUP
=
String.Format(
"
RESTORE DATABASE {0} FROM DISK = '{1}'
"
, dbName, backfile);
SqlConnection con
=
new
SqlConnection(constr);
SqlCommand cmd
=
new
SqlCommand(BACKUP, con);
con.Open();
try
{
flag
=
true
;
cmd.ExecuteNonQuery();
Debug.Print(
"
还原成功
"
);
}
catch
(SqlException ee)
{
flag
=
false
;
throw
(ee);
Debug.Print(
"
还原失败
"
);
Debug.Print(ee.ToString());
}
finally
{
con.Close();
}
return
flag;
}
///
<summary>
///
备份数据库
///
</summary>
///
<returns>
是否备份成功
</returns>
public
static
bool
BackDb(
string
dbName,
string
dbFileName)
{
bool
flag
=
false
;
//
备份前,Kill掉进程
string
killThread
=
string
.Format(
"
declare hcforeach cursor global for
"
+
"
select 'kill '+rtrim(spid) from master.dbo.sysprocesses where dbid=db_id(N'{0}') exec sp_msforeach_worker '?'
"
, dbName);
//
还原前,kill进程
using
(SqlConnection connServer
=
new
SqlConnection(connectServer))
{
connServer.Open();
SqlCommand cmdServer
=
new
SqlCommand(killThread, connServer);
cmdServer.ExecuteNonQuery();
}
SqlConnection conn;
SqlCommand cmd;
string
strsql
=
""
;
strsql
=
string
.Format(
"
backup database {0} to disk = '{1}'
"
, dbName, dbFileName);
try
{
string
strConn
=
connectServer;
conn
=
new
SqlConnection(strConn);
conn.Open();
cmd
=
new
SqlCommand(strsql, conn);
int
index
=
cmd.ExecuteNonQuery();
if
(index
!=
0
)
{
flag
=
true
;
}
conn.Close();
}
catch
(Exception e)
{
flag
=
false
;
throw
new
Exception(
"
数据库备份时出错了!
"
);
}
return
flag;
}
#endregion
#region
建立于删除数据库
///
<summary>
///
新建立数据库
///
</summary>
///
<param name="databaseName">
数据库名
</param>
public
static
void
NewDataBase(
string
databaseName)
{
//
调用ExecuteNonQuery()来创建数据库
string
sql
=
string
.Format(
"
CREATE DATABASE {0}
"
, databaseName);
ExecuteSql(connInitStr,
"
master
"
, sql);
}
///
<summary>
///
删除数据库
///
</summary>
public
static
void
DropDataBase(
string
databaseName)
{
string
killThread
=
string
.Format(
"
declare hcforeach cursor global for
"
+
"
select 'kill '+rtrim(spid) from master.dbo.sysprocesses where dbid=db_id(N'{0}') exec sp_msforeach_worker '?'
"
, databaseName);
//
删除前,Kill掉进程
ExecuteSql(connInitStr,
"
master
"
, killThread);
//
调用ExecuteNonQuery()来删除数据库
string
sqlQuery
=
string
.Format(
"
DROP DATABASE {0}
"
, databaseName);
ExecuteSql(connInitStr,
"
master
"
, sqlQuery);
}
private
static
void
ExecuteSql(
string
conn,
string
dataBase,
string
sql)
{
System.Data.SqlClient.SqlConnection mySqlConnection
=
new
System.Data.SqlClient.SqlConnection(conn);
System.Data.SqlClient.SqlCommand command
=
new
System.Data.SqlClient.SqlCommand(sql, mySqlConnection);
command.Connection.Open();
command.Connection.ChangeDatabase(dataBase);
try
{
command.ExecuteNonQuery();
}
catch
(Exception exp)
{
throw
exp;
}
finally
{
mySqlConnection.Close();
}
}
#endregion
}
}