2012-01-24 86 views
3

我有這樣的代碼:A類型(類)作爲佔位符? (避免複製/粘貼)

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號線找到 「MissingTables」。這是一個

整個代碼將重複7次,一切都是一樣的,除了這個類的變化,舉例:「MissingColumns」。但我不想複製/粘貼整個代碼,只能取代這個小事。

我該怎麼辦?泛型的東西?如果需要的話,我也可以傳遞參數等。非常感謝每一個解決方案!

+0

它是什麼ge去?也許你可以發表第二個重複的樣子(兩個片段) – gideon

+0

而不是MissingTables,MissingColumns,這就是所有 – eMi

+0

我沒有看到你只是將它分配給一個字符串! 'command.CommandText'這兩個答案提供將適用於你。 – gideon

回答

8
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); 
+0

2010年的OWASP頂級漏洞是SQL注入,這種方法容易受到它嗎? – StuperUser

+0

@StuperUser - 可能。取決於傳入的命令以及它是如何構建的。它看起來像一個字符串資源,無法更改,因此在這種情況下應該是安全的。 – Oded

+0

@StuperUser我都依賴於你的SQL來自哪裏,如果它來自URL,那麼是的。如果它在您的應用中被硬編碼,那麼不會。 –

7

你並不需要仿製藥 - 只是一個包裝方法,它採用的命令文本作爲參數。

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(); 
    } 
} 

請注意使用using statement以確保正確處置。

+0

+1使用'使用(lol) – jere

2

爲什麼不把代碼放入一個帶有字符串參數的命令文本的方法中?像這樣?

/// <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(); 
    } 

然後就可以調用它像這樣:

ExecuteOracleTextCommand(SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable); 
1

要對來自來電的命令的控制的情況下,另一種答案:

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.ExecuteNonQuery(command => 
{ 
    command.CommandText = SchemaDifferenceFinder.Model.SQLStatements.MissingTables.DropTable; 
    command.CommandType = System.Data.CommandType.Text; 
});