C# 在数据库连接类中使用参数

C# 在数据库连接类中使用参数,c#,sql,class,parameters,C#,Sql,Class,Parameters,我试图将Sql参数添加到我的项目中,但我在一个类中有数据库连接。当代码试图将employerId读取为列名时,如何添加它们 我在一个类中有以下代码,可以从数据库中读取和返回: public SqlDataReader ExecuteQuery(String query) { SqlCommand cmd = new SqlCommand(query,sqlConn); SqlDataReader reader = cmd.ExecuteReader();

我试图将Sql参数添加到我的项目中,但我在一个类中有数据库连接。当代码试图将employerId读取为列名时,如何添加它们

我在一个类中有以下代码,可以从数据库中读取和返回:

public SqlDataReader ExecuteQuery(String query)        
{
    SqlCommand cmd = new SqlCommand(query,sqlConn);
    SqlDataReader reader = cmd.ExecuteReader();                
    return reader;
}
以及web服务中的以下代码:

[WebMethod]
public string CheckTime1(string employerId)
{
    try
    {
        UseDatabase useDb = new UseDatabase("database.mdf");
        string queryString = "SELECT * FROM [employer] WHERE [employerId] =" + employerId;
        useDb.ConnectToDatabase();

        SqlDataReader dbReader = useDb.ExecuteQuery(queryString);
        if (dbReader != null && dbReader.HasRows)
        {
            return "RECORDS EXIST";
        }
        else if (dbReader == null)
        {
            return "RECORDS DONT EXIST";
        }
        else
        {
            return "Error";
        }    
        useDb.DisconectDatabase();
    }
    catch (Exception exq)
    {
        return exq.ToString(); ;
    }
}

尽管我强烈建议您从头开始重新考虑数据访问层,但这里有一个简单的解决方案:

public SqlDataReader ExecuteQuery(String query, params object[] p)
{
    SqlCommand cmd = new SqlCommand(query, sqlConn);
    for (int i = 0; i < p.Length; i++)
    {
        cmd.Parameters.Add(new SqlParameter("@p"+i, p[i]));
    }

    SqlDataReader reader = cmd.ExecuteReader();
    return reader;
}

可能是我,但你能澄清一下你的问题吗?这不是答案,而是建议,这些使用“makeit all”数据库类的方法通常是痛苦多于收获。该类通常是不完整的,降低复杂性所需的权衡直接影响性能或安全性。我建议您投入一些时间使用一个已经过测试的ORM,它的速度众所周知,而不是试图修复您的数据库类。为了使用
SqlParameter
,您需要一个
SqlCommand
。看起来您已经在
UseDatabase
类中包装了
SqlConnection
?这是否支持运行
SqlCommand
?为什么
params对象[]
而不仅仅是
IEnumerable
?您还假设OP可以修改
UseDatabase
类。OP没有说明该类的所有者是谁,因此它可能不是一个选项。当然,所有的猜测都是因为这个问题缺少太多的基本信息。没错,OP没有说明谁拥有
UseDatabase
类。是的,您可以直接传递SqlParameters或Dictionary来构造参数。但是使用隐式命名的参数似乎是这里最简单的解决方案。有点符合整体设计。别误会我的意思,我并不推荐这是最先进的DAL,我只是说这回答了问题。
public string CheckTime1(string employerId)
{
        ...

        string queryString = "SELECT * FROM [employer] WHERE [employerId] = @p0";

        SqlDataReader dbReader = useDb.ExecuteQuery(queryString, employerId);

        ...
}