cuando estaba leyendo libros para aprender C# (podría ser unos viejos libros Visual Studio 2005
) que he encontrado consejos para usar siempre SqlCommand.Prepare
cada vez que ejecuto llamada SQL (si su un SELECT
/o UPDATE
INSERT
en SQL SERVER 2005/2008) y Le paso parámetros. ¿Pero es realmente tan?Pros y contras de usar SqlCommand Prepare in C#?
¿Se debe hacer siempre? ¿O solo algunas veces?
¿Importa si se pasa un parámetro o cinco o veinte?
¿Qué impulso debería dar si hay alguno? ¿Sería notable en absoluto (he estado usando
SqlCommand.Prepare
aquí y me salté allí y nunca tuve ningún problema o diferencias notables).
Por el bien de la pregunta, este es mi código habitual que uso, pero esto es más una pregunta general.
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Prepare();
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
aclaración adicional:
si muevo sqlQuery.Prepare()
como en código de abajo excepción se produce que el tamaño tiene que ser declarado explícitamente, que básicamente me lleva a pensar que el tener sqlQuery.Prepare()
como primera hace que sea inútil? ¿Alguien puede mostrar el uso correcto usando mi ejemplo?
public static decimal pobierzBenchmarkKolejny(string varPortfelID, DateTime data, decimal varBenchmarkPoprzedni, decimal varStopaOdniesienia) {
const string preparedCommand = @"SELECT [dbo].[ufn_BenchmarkKolejny](@varPortfelID, @data, @varBenchmarkPoprzedni, @varStopaOdniesienia) AS 'Benchmark'";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetailsDZP)) //if (varConnection != null) {
using (var sqlQuery = new SqlCommand(preparedCommand, varConnection)) {
sqlQuery.Parameters.AddWithValue("@varPortfelID", varPortfelID);
sqlQuery.Parameters.AddWithValue("@varStopaOdniesienia", varStopaOdniesienia);
sqlQuery.Parameters.AddWithValue("@data", data);
sqlQuery.Parameters.AddWithValue("@varBenchmarkPoprzedni", varBenchmarkPoprzedni);
sqlQuery.Prepare();
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
while (sqlQueryResult.Read()) {
}
}
}
}
¿Cómo haré eso? Al agregar .size al lado de los parámetros y hacer varPortfel.Lenght si es una cadena, etc.
¿Qué pasa con el rendimiento y otras cosas? ¿Solo para evitar la inyección de SQL? He leído la documentación de MSDN antes de hacer esta pregunta y la parte citada no es realmente útil con respecto a mis preguntas para usarla o no y si tiene algún beneficio de rendimiento que parece sugerirse en algunos sitios web. – MadBoy
Según tengo entendido, al definir todo, puede almacenar en caché y reutilizar el plan de consulta. Supongo que no te da una cantidad extrema de beneficio. –
¿El uso que tengo en el código es correcto? Intenté mover Preparar a después de configurar todos los Parámetros y lanzar el error. Entonces, ¿sqlQuery.Prepare siempre debe usarse antes de los parámetros o? – MadBoy