日期:2014-05-20  浏览次数:20561 次

关于数据访问类的疑惑
我想自己写一个简单的数据访问类,用于自己开发的程序。由于对数据访问不太熟悉,想请各位指教。

对于带有许多条件的sql语句,该如何处理?有时候条件只有一个,有时候有10几个,都是用来选择数据的,因此查询语句,返回格式都一样,我想用一个通用的方法来实现,请问,查询参数该如何处理?比如:
1、select   a,b,c   from   t   where   a= "1 "
2、select   f,g,h,k   from   v   where   f= "2 "   and   g= "3 "

返回的是dataset,
function   GetDataset1(byval   TJ   as   integer)   as   Dataset
dim   sql   as   string= "select   .. "
dim   ds   as   new   dataset
dim   sda   as   new   sqldataadapter(sql,dbConn)

sda.selectcommand.parameters.add(new   sqlparameter( "@a ",sqldbtype.int)
sda.selectcommand.parameters( "@a ").value= "TJ
...

sda.fill(ds, "a ")
GetDataset1=ds
end   Function


function   GetDataset2(byval   TJ   as   integer)   as   Dataset
dim   sql   as   string= "select   .. "
dim   ds   as   new   dataset
dim   sda   as   new   sqldataadapter(sql,dbConn)

sda.selectcommand.parameters.add(new   sqlparameter( "@a ",sqldbtype.int)
sda.selectcommand.parameters( "@a ").value= "TJ
...

sda.fill(ds, "a ")
GetDataset2=ds
end   Function


GetDataset1、GetDataset2   除了sql语句不同,条件数目不同,其余都一样。如何处理不同数目的条件?我不想一个一个来写,想写一个通用方法



------解决方案--------------------
用param 修饰, 这个参数允许你传递一个以上的数据的参数

比如
void ExecMySql(SqlCommand cmd, param SqlParameter[] ps)
{
foreach(SqlParameter p in ps)
cmd.Parameters.Add....
}

调用的时候可以这样调,非常方便

ExecMySql(cmd, p1, p2, p3...任意多);

------解决方案--------------------
写一个静态的数据访问函数全部参数都写字符串,配合一个存储过程来执行速度会快些,参数对外就自己写个防SQL注入攻击函数过滤一个字符串.
------解决方案--------------------
例:
#region gettable通用查询
public DataTable getTable(string tableName, int page, int pageSize, string sortID, string fieldStr, string filter, string tablekey)
{
DataTable dt = new DataTable(tableName);
if (filter == null)
filter = " ";
if (sortID == null)
sortID = " ";
adapter.TableMappings.Clear();
adapter.TableMappings.Add( "Table ", dt.TableName);
adapter.SelectCommand = new SqlCommand( "Seek_All ", conn);
adapter.SelectCommand.CommandType = System.Data.CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.AddWithValue( "@page ", page);
adapter.SelectCommand.Parameters.AddWithValue( "@count ", pageSize);
adapter.SelectCommand.Parameters.AddWithValue( "@Table ", tableName);
adapter.SelectCommand.Parameters.AddWithValue( "@SortId ", sortID);
adapter.SelectCommand.Parameters.AddWithValue( "@TableKey ", tablekey);
adapter.SelectCommand.Parameters.AddWithValue( "@FieldStr ", fieldStr);
adapter.SelectCommand.Parameters.AddWithValue( "@Condition ", filter);
adapter.Fill(dt);

return dt;
}

public DataTable getTable(string tableName, string sortID, string fieldStr, string filter)
{