执行参数化insert语句的C#函数
我使用以下方法将数据保存到SQL Server数据库中执行参数化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注入,
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
的包装。所以这个函数本身并没有增加多少。这对你来说是件好事。您应该检查hocmdText
是否已构造,以及此函数的使用位置。这样,您就可以知道任何更改的影响。如果这是您调用它的唯一位置,那么它将很容易转换为参数化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);