C#函数执行参数化插入语句

时间:2017-11-05 12:12:24

标签: c# sql sql-server

我有以下方法将数据保存到SQL Server数据库

public static int ExecuteNonQuery(string cmdText)
{
    if(con.State == ConnectionState.Closed)
        con.Open();

    SqlCommand SC = new SqlCommand(cmdText, con);

    return SC.ExecuteNonQuery();
}

我的问题是:这很容易引入SQL,所以最好的方法是使用参数,如果我想保存像单引号这样的特殊字符,那是不可能的,所以对我来说参数选项是最好的。

我现在的问题是如何在使用方法时处理它,因为我无法确定SQL语句需要的参数数量

这就是我所说的

return Database.ExecuteNonQuery("INSERT INTO UPR00112(EMPLOYID, UNIVERSITY, DEGREE, MAJOR, GPA, GPABASE, GRADUATIONYEAR, SUPID, NOTE, ATTACHMENT, USERDEF1, STATUS, TYP) VALUES('" + EmpID + "','" + Uni + "','" + Degree + "','" + Major + "','" + GPA + "','" + GPABase + "','" + GYear + "'," + SupID + ",'" + Note  + "','" + Attach  + "','" + UserName + "','" + Status + "','" + Typ + "')");

1 个答案:

答案 0 :(得分:1)

您可以像我对ADONETHelper所做的那样使用params关键字:

public static int ExecuteNonQuery(string sql, CommandType commandType, params SqlParameter[] parameters)
{
    using (var con = new SqlConnection("ConnectionString"))
    {
        using (var cmd = new SqlCommand(sql, con))
        {
            cmd.CommandType = commandType;
            foreach (var parameter in parameters)
            {
                cmd.Parameters.Add(parameter);
            }
            con.Open();
            return cmd.ExecuteNonQuery();
        }
    }
}

请注意,此方法对SqlConnection对象使用局部变量,因此可以在完成后立即处理它并返回到连接池。

使用此功能:

var params = new SQLParameter[]
{
    new SqlParameter("@P1", SqlDbType.Int).Value = intValue,
    new SqlParameter("@P2", SqlDbType.NVarChar).Value = stringValue,
    new SqlParameter("@P3", SqlDbType.DateTime).Value = dateTimeValue
};

return Database.ExecuteNonQuery("INSERT INTO .... VALUES (@P1, @P2, @P3)", params);

ADONETHelper中,我创建了一个这样的通用方法,它也将Func<IDbCommand, T>作为参数并返回T。这允许我使用它来执行插入,更新,删除和选择 - 它支持ExecuteNonQuery()ExecuteScalar()ExecuteReader()并使用DataAdapter来填充{{1 }或DataSet,都使用相同的DataTable方法。