我是否需要在具有SqlCommand的类中添加我打算使用的所有参数,或者我可以在调用类时传递参数?
在我的类文件(Called DataAccess)中:
public static int SqlGetInt(string queryString)
{
int retVal = 0;
try
{
using (SqlConnection cn = GetConnection())
{
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted))
{
using (SqlCommand cmd = new SqlCommand(queryString, cn))
{
cmd.Transaction = tr;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
retVal = GetRdrInt(rdr, 0);
}
}
tr.Commit();
}
}
}
在我的Form1代码中:
string sql = "SELECT ID FROM tbl_employees WHERE username = @username";
_responsible_id = DataAccess.SqlGetInt(sql);
由于我没有添加参数,因此这个过程失败了。回到我的问题:我可以在调用SqlGetInt()时在Form1文件中添加这些参数,还是需要将它添加到类文件的SqlGetInt()中?
答案 0 :(得分:0)
查询数据库的通用程序总是很糟糕(我的意见),因为它们缺乏现实世界问题复杂性所需的灵活性。
在您的情况下,您可以将您的程序更改为此类
public static int SqlGetInt(string queryString, List<SqlParameter> parms = null)
{
int retVal = 0;
try
{
using (SqlConnection cn = GetConnection())
{
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction(IsolationLevel.ReadUncommitted))
{
using (SqlCommand cmd = new SqlCommand(queryString, cn))
{
cmd.Transaction = tr;
if(parms != null)
cmd.Parameters.AddRange(parms.ToArray());
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.Read())
retVal = GetRdrInt(rdr, 0);
}
}
tr.Commit();
}
}
}
您为List<SqlParameter>
添加参数并将其保留为可选(因此您的现有代码无需更改即可运行)。此列表if为非null可以添加到命令的参数集合中。
当然,在此之后,当您需要参数时,无论何时调用此方法,都需要创建参数列表。
string sql = "SELECT ID FROM tbl_employees WHERE username = @username";
List<SqlParameter> pl = new List<SqlParameter>();
pl.Add(new SqlParameter()
{
ParameterName="@username",
SqlDbType = SqlDbType.NVarChar,
Value = txtUserName.Text;
};
_responsible_id = DataAccess.SqlGetInt(sql, pl);