我有以下方法将数据保存到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 + "')");
答案 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
方法。