C# 类型(类)作为占位符?(避免复制/粘贴)
我有以下代码:C# 类型(类)作为占位符?(避免复制/粘贴),c#,class,generics,types,C#,Class,Generics,Types,我有以下代码: OracleConnection myOracleConnection = new OracleConnection(connectionString); myOracleConnection.Open(); OracleCommand command = myOracleConnection.CreateCommand(); command.CommandText = SchemaDifferenceFinder.Model.SQLStatements.M
OracleConnection myOracleConnection = new OracleConnection(connectionString);
myOracleConnection.Open();
OracleCommand command = myOracleConnection.CreateCommand();
command.CommandText =
SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable;
command.CommandType = System.Data.CommandType.Text;
command.ExecuteNonQuery();
myOracleConnection.Close();
在第4行中,您会发现“缺少表”。那是一门课
整个代码将重复7次,所有内容都是相同的,只是这个类发生了更改,例如:“缺少列””。但是我不想复制/粘贴整个代码,只是为了替换这个小东西
我能做什么?关于泛型的东西?我也可以传递参数,如果需要等我感谢每一个解决方案
private static void ExecuteSQL(string SQL)
{
OracleConnection myOracleConnection = new OracleConnection(connectionString);
myOracleConnection.Open();
OracleCommand command = myOracleConnection.CreateCommand();
command.CommandText = SQL;
command.CommandType = System.Data.CommandType.Text;
command.ExecuteNonQuery();
myOracleConnection.Close();
}
然后可以通过以下方式称之为:
Helper.ExecuteSQL(SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable);
Helper.ExecuteNonQuery(command =>
{
command.CommandText = SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable;
command.CommandType = System.Data.CommandType.Text;
});
您不需要泛型,只需要一个将命令文本作为参数的包装器方法
private void ExecuteNonQuery(string commandText, string connString)
{
using(OracleConnection myOracleConnection = new OracleConnection(connString))
{
myOracleConnection.Open();
OracleCommand command = myOracleConnection.CreateCommand();
command.CommandText = commandText;
command.CommandType = System.Data.CommandType.Text;
command.ExecuteNonQuery();
}
}
请注意使用以确保正确处理。为什么不将代码放入一个带有字符串参数的方法中作为命令文本?像这样的
/// <summary>
/// Executes the provided CommandText against the Oracle database.
/// </summary>
/// <param name="commandText">The command to execute</param>
/// <exception cref="ArgumentNullException">Thrown if an empty or null commandText is provided</exception>
private void ExecuteOracleTextCommand(string commandText)
{
if(string.IsNullOrWhiteSpace(commandText)
{
throw new ArgumentNullException("commandText", "Please provide a valid command");
}
//other commandText validation here...
OracleConnection myOracleConnection = new OracleConnection(connectionString);
myOracleConnection.Open();
OracleCommand command = myOracleConnection.CreateCommand();
command.CommandText = commandText;
command.CommandType = System.Data.CommandType.Text;
command.ExecuteNonQuery();
myOracleConnection.Close();
}
如果您希望对来自调用者的命令拥有更多控制权,另一个答案是:
private delegate void CommandAction(OracleCommand command);
private static void ExecuteNonQuery(CommandAction action)
{
OracleConnection myOracleConnection = new OracleConnection(connectionString);
myOracleConnection.Open();
OracleCommand command = myOracleConnection.CreateCommand();
action(command);
command.ExecuteNonQuery();
myOracleConnection.Close();
}
然后可以通过以下方式称之为:
Helper.ExecuteSQL(SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable);
Helper.ExecuteNonQuery(command =>
{
command.CommandText = SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable;
command.CommandType = System.Data.CommandType.Text;
});
它会变成什么?也许你可以发布第二次重复的样子(两个片段),而不是丢失表格、丢失列,这是allI没有看到的,你只是将其分配给一个字符串
command.CommandText
提供的两个答案都适用于您。2010年OWASP的最大漏洞是SQL注入,此方法易受攻击吗?@StuperUser-可能是。取决于传入的命令及其构建方式。它看起来像一个无法更改的字符串资源,因此在这个实例中应该是安全的。@StuperUser I完全取决于您的SQL来自何处,如果它来自URL,则是。如果它在你的应用程序中是硬编码的,那么不是。