2011-11-11 31 views
3

无论如何,我可以使这个数据库代码更短吗?它工作正常,但似乎非常冗长和重复。用一种方法包装它会更好一些,但是还有其他的改进可以缩短它吗?如何使用ADO.NET,IDbConnection和IDbCommand生成C#代码较少冗长?

using (IDbConnection theConn = GetDatabaseConnection()) 
using (IDbCommand theCmd = theConn.CreateCommand()) 
{ 
    theCmd.CommandText = @"INSERT INTO table(one, two, three,four) 
            VALUES (@one,@two,@three,@four)"; 
    var parameterOne = theCmd.CreateParameter(); 
    parameterOne.ParameterName = "@one"; 
    parameterOne.Value = "text"; 
    theCmd.Parameters.Add(parameterOne); 

    var parameterTwo = theCmd.CreateParameter(); 
    parameterTwo.ParameterName = "@two"; 
    parameterTwo.Value = "text"; 
    theCmd.Parameters.Add(parameterTwo); 

    var parameterThree = theCmd.CreateParameter(); 
    parameterThree.ParameterName = "@three"; 
    parameterThree.Value = "text"; 
    theCmd.Parameters.Add(parameterThree); 

    var parameterFour = theCmd.CreateParameter(); 
    parameterFour.ParameterName = "@four"; 
    parameterFour.Value = "text"; 
    theCmd.Parameters.Add(parameterFour); 

    theCmd.ExecuteNonQuery(); 
} 
+0

我写的一个小解决方案:http://stackoverflow.com/questions/13133804/writing-driver-class-generic-for-any-database-support – nawfal

回答

6

如果你不想使用完整的OR/M为什么不试试Dapper

+0

有趣的是,我没有意识到这一点。谢谢! – mikel

3

如果您正在寻找一个普遍的变化,我建议使用Microsoft实体框架(或任何其他OR/M)。 这将导致更少的代码,因为您不必再​​次编写这种低级代码。 它适用于许多数据库。您可以用相对较小的更改来更改基础数据库。

如果您只是在寻找这种特定方法的改变,那么我只是想自己提到的解决方案。继续并将每个重复的段落重构为一个方法。

来源:

var parameterOne = theCmd.CreateParameter(); 
parameterOne.ParameterName = "@one"; 
parameterOne.Value = "text"; 
theCmd.Parameters.Add(parameterOne); 

进入(例如):

private void addParameter(IDbCommand theCmd, string paramName, string paramValue) 
{ 
    var createdParameter = theCmd.CreateParameter(); 
    createdParameter.ParameterName = paramName; 
    createdParameter.Value = paramValue ; 
    theCmd.Parameters.Add(createdParameter); 
} 

此外,调用mmethod的时候,我喜欢定义一些常量,参数名称,而不是每次都写入字符串的再次。这避免了拼写错误。

定义它们在一个合适的范围内,就像类成员一样,如果你在这个方法中使用它们(我猜这肯定会是这种情况)。