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,则是。如果它在你的应用程序中是硬编码的,那么不是。