最早写的是静态的类,因为别人说过存在并发的问题,所以改成动态的,然后又看了一些资料
还是决定用静态的类和方法,想请大家帮我看看这个类,有什么问题,还有
那些可以写的更好,也请大家帮我改一下!特别是并发问题! 小弟先在此谢谢各位了! 代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections; namespace DbHelper
{
/// <summary>
/// DBHELPER 的摘要说明
/// </summary>
public static class DBHELPER
{
private static readonly string con = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString; public static SqlParameter GetParam(String ParamName, SqlDbType type, object value)
{
SqlParameter param = new SqlParameter(ParamName, type);
param.Value = value;
return param;
}
public static int ExecSql(string sql, SqlParameter[] param,CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
int a = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return a;
}
}
public static SqlDataReader GetReader(string sql, SqlParameter[] param, CommandType ct)
{
SqlConnection conn = new SqlConnection(con);
SqlCommand cmd = new SqlCommand();
getcmd(cmd, conn, ct, sql, param);
SqlDataReader sdr;
try
{
sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); }
catch
{
conn.Close();
throw;
}
finally
{
cmd.Parameters.Clear();
}
return sdr;
}
public static object GetScalar(string sql, SqlParameter[] param, CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
object a = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return a;
}
}
public static DataTable GetTable(string sql, SqlParameter[] param, CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds, "t1");
cmd.Parameters.Clear();
return ds.Tables["t1"];
}
}
public static SqlParameter GetP(string paname, SqlDbType st)
{
SqlParameter sp = new SqlParameter(paname, st);
sp.Direction = ParameterDirection.ReturnValue;
return sp;
}
private static void getcmd(SqlCommand cmd, SqlConnection conn, CommandType cmdType, string sql, SqlParameter[] param)
{ if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = sql;
cmd.CommandType = cmdType; if (param != null)
{
cmd.Parameters.AddRange(param);
}
}
}
}
还是决定用静态的类和方法,想请大家帮我看看这个类,有什么问题,还有
那些可以写的更好,也请大家帮我改一下!特别是并发问题! 小弟先在此谢谢各位了! 代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Data.SqlClient;
using System.Collections; namespace DbHelper
{
/// <summary>
/// DBHELPER 的摘要说明
/// </summary>
public static class DBHELPER
{
private static readonly string con = ConfigurationManager.ConnectionStrings["sqlconn"].ConnectionString; public static SqlParameter GetParam(String ParamName, SqlDbType type, object value)
{
SqlParameter param = new SqlParameter(ParamName, type);
param.Value = value;
return param;
}
public static int ExecSql(string sql, SqlParameter[] param,CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
int a = cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
return a;
}
}
public static SqlDataReader GetReader(string sql, SqlParameter[] param, CommandType ct)
{
SqlConnection conn = new SqlConnection(con);
SqlCommand cmd = new SqlCommand();
getcmd(cmd, conn, ct, sql, param);
SqlDataReader sdr;
try
{
sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); }
catch
{
conn.Close();
throw;
}
finally
{
cmd.Parameters.Clear();
}
return sdr;
}
public static object GetScalar(string sql, SqlParameter[] param, CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
object a = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return a;
}
}
public static DataTable GetTable(string sql, SqlParameter[] param, CommandType ct)
{
SqlCommand cmd = new SqlCommand();
using (SqlConnection conn = new SqlConnection(con))
{
getcmd(cmd, conn, ct, sql, param);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
sda.Fill(ds, "t1");
cmd.Parameters.Clear();
return ds.Tables["t1"];
}
}
public static SqlParameter GetP(string paname, SqlDbType st)
{
SqlParameter sp = new SqlParameter(paname, st);
sp.Direction = ParameterDirection.ReturnValue;
return sp;
}
private static void getcmd(SqlCommand cmd, SqlConnection conn, CommandType cmdType, string sql, SqlParameter[] param)
{ if (conn.State != ConnectionState.Open)
conn.Open(); cmd.Connection = conn;
cmd.CommandText = sql;
cmd.CommandType = cmdType; if (param != null)
{
cmd.Parameters.AddRange(param);
}
}
}
}
解决方案 »
- 有劳大家推荐几本书???
- 在AutoCompleteService中怎样使用页面后台代码中的变量?
- asp.ne+mysql的问题!在线等
- 如何将LISTBOX里面的内容用逗号隔开输入到数据库中
- 程序运行时错误,各位大侠帮忙看看
- 打了SP1发布和直接发布到指定的文件中有什么区别啊 都是一样的为什么还要下SP1了
- vs2003对javascript中getElementsByName方法的支持?
- 求孟子的css
- 急求sa登录失败!答案!!!
- 这个怎么解决高手帮看下谢谢了????
- C#WindowsForms中显示pdf文件?求方,(100分)
- 跪求那个大哥给常来网的一个论坛帐号,想使用500分开通.net 2.0 那个大哥好心给点,
{
public abstract void BeginTrans();
public abstract void Close();
public abstract void CommitTrans();
public abstract string Convert2Date(string strDate);
public abstract DataSet ExecuteDataSet(string strSql);
public abstract DataSet ExecuteDataSet(CommandType cmdType, string cmdText, string[] parmsName, object[] parmsValue);
public abstract void ExecuteNonQuery(IList<string> arrSql);
public abstract void ExecuteNonQuery(CommandType cmdType, string cmdText, string[] parmsName, object[] parmsValue);
public abstract void ExecuteNonQuery(CommandType cmdType, string cmdText, string[] parmsName, ref object[] parmsValue, object[] parmsDirection);
public abstract IDataReader ExecuteReader(string strSql);
public abstract IDataReader ExecuteReader(CommandType cmdType, string cmdText, string[] parmsName, object[] parmsValue);
public abstract object ExecuteScalar(string strSql);
public abstract object ExecuteScalar(CommandType cmdType, string cmdText, string[] parmsName, object[] parmsValue);
public abstract string GetCurrSysDate();
public abstract string GetCurrSysTime();
public abstract IDbDataAdapter GetDataAdapter(string strSql);
public abstract IDbDataAdapter GetDataAdapter(CommandType cmdType, string cmdText, string[] parmsName, object[] parmsValue);
public abstract void Open(string strConn);
public abstract DataSet PopulateDataSet(IDbDataAdapter ida, string strTableName);
public abstract void RollbackTrans();
public abstract void UpdateByAdapter(IDbDataAdapter ida, DataSet ds, string strTableName);
}
public enum DBOperatorType
{
Cursor
}
毕竟如nhibernate,ibatisNet都已经包含了参考FortuneBase
http://www.cnblogs.com/mail-ricklee
http://hi.baidu.com/isloveok/blog/item/44dd4f2dddbaed37359bf77c.html
存在并发的问题可以在DAL里面用sqldataadpter填充datatable,然后循环datatable添加到泛型集合,我觉得这样方便写。我这样做过没的问题,不知道楼主觉得可行不?
Public Enum DataType
VarChar
NVarChar
DateTime
Int
SmallInt
VarBinary
Bool
Money
BigInt
Text
CharFixed
Dec
End Enum Private Enum ConnectionType
SQL
OleDb
ODBC
End Enum Public Shared Function MaakCommand(ByVal command As String, ByRef con As IDbConnection, ByVal commandType As CommandType) As IDbCommand
'Maak Command op basis van connectie. Het type connectie is bepalend
'voor het type command wat geretourneerd wordt
Try
If TypeOf con Is System.Data.SqlClient.SqlConnection Then
Dim cmd As SqlClient.SqlCommand
cmd = New SqlClient.SqlCommand(command, con)
cmd.CommandType = commandType
Return cmd
ElseIf TypeOf con Is System.Data.OleDb.OleDbConnection Then
Dim cmd As OleDb.OleDbCommand
cmd = New OleDb.OleDbCommand(command, con)
cmd.CommandType = commandType
Return cmd
ElseIf TypeOf con Is Odbc.OdbcConnection Then
Dim cmd As Odbc.OdbcCommand
cmd = New Odbc.OdbcCommand(command, con)
cmd.CommandType = commandType
Return cmd
Else
Return Nothing
End If
Catch exc As Exception
Throw New Exception("Error in MaakCommand", exc)
End Try
End Function Public Shared Function MaakParameter(ByRef command As IDbCommand, ByVal name As String, ByVal type As DataType, ByVal direction As ParameterDirection) As IDataParameter
Try
If TypeOf command Is System.Data.SqlClient.SqlCommand Then
Dim parameter As SqlClient.SqlParameter
parameter = New SqlClient.SqlParameter
parameter.ParameterName = name
parameter.Direction = direction
parameter.SqlDbType = ConverteerDbType(ConnectionType.SQL, type)
command.Parameters.Add(parameter)
Return parameter
ElseIf TypeOf command Is System.Data.OleDb.OleDbCommand Then
Dim parameter As OleDb.OleDbParameter
parameter = New OleDb.OleDbParameter
parameter.ParameterName = name
parameter.Direction = direction
parameter.DbType = ConverteerDbType(ConnectionType.OleDb, type)
command.Parameters.Add(parameter)
Return parameter
ElseIf TypeOf command Is Odbc.OdbcCommand Then
Dim parameter As Odbc.OdbcParameter
parameter = New Odbc.OdbcParameter
parameter.ParameterName = name
parameter.Direction = direction
parameter.OdbcType = ConverteerDbType(ConnectionType.ODBC, type)
command.Parameters.Add(parameter)
Return parameter
Else
Return Nothing
End If
Catch exc As Exception
Throw New Exception("Error in MaakParameter", exc)
End Try
End Function Public Shared Function MaakParameter(ByRef command As IDbCommand, ByVal name As String, ByVal type As DataType, ByVal direction As ParameterDirection, ByVal size As Integer) As IDataParameter
Try
If TypeOf command Is System.Data.SqlClient.SqlCommand Then
Dim parameter As SqlClient.SqlParameter
parameter = MaakParameter(command, name, type, direction)
parameter.Size = size
Return parameter
ElseIf TypeOf command Is System.Data.OleDb.OleDbCommand Then
Dim parameter As OleDb.OleDbParameter
parameter = MaakParameter(command, name, type, direction)
parameter.Size = size
Return parameter
ElseIf TypeOf command Is Odbc.OdbcCommand Then
Dim parameter As Odbc.OdbcParameter
parameter = MaakParameter(command, name, type, direction)
parameter.Size = size
Return parameter
Else
Return Nothing
End If
Catch exc As Exception
Throw New Exception("Error in MaakParameter", exc)
End Try
End Function