执行参数化insert语句的C#函数

执行参数化insert语句的C#函数,c#,sql,sql-server,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 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 + "')");

您可以使用
params
关键字,就像我对以下内容所做的那样:

请注意,此方法对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);

在中,我创建了一个类似这样的通用方法,它还将
Func
作为参数并返回
T
。这允许我使用它执行插入、更新、删除和选择-它支持
ExecuteNonQuery()
ExecuteScalar()
ExecuteReader()
,还支持使用
DataAdapter
填充
数据集或
数据表,都使用相同的
Execute
方法。

这似乎是
SqlCommand.ExecuteNonQuery
的包装。所以这个函数本身并没有增加多少。这对你来说是件好事。您应该检查ho
cmdText
是否已构造,以及此函数的使用位置。这样,您就可以知道任何更改的影响。如果这是您调用它的唯一位置,那么它将很容易转换为参数化sql命令。您可以创建一个函数:
DataBase.InsertUpr(雇员ID、大学、学位等)参见示例:谢谢,问题是我在我的项目中有30多个地方使用它。。。即使是100,那也是可行的。这样做的好处是,您可以为每个操作创建一个函数。我认为它将少于100,这是一个很好的编程练习;-)我认为这可以在一小时内完成。查找SqlParameter.NETFramework类。
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);