【问题标题】:combine two methods returning two different values结合两个方法返回两个不同的值
【发布时间】:2013-08-25 20:52:05
【问题描述】:

您好,我有两个方法返回两个不同的返回类型的值,如 int 和 string,我正在方法内部执行查询,并传递不同的变量,如下所示

方法一

private string SelectTransactionHistory(int transactionId, ContextObject contextObject)
{
    SqlConnection con;
    SqlCommand cmd;
    con = new SqlConnection(contextObject.ConnectionString);
    con.Open();

    string returnvalue = string.Empty;            
    string selecteQuery = "SELECT Comments 
                           From dbo.TransactionHistory 
                           WHERE TransactionID = '" + transactionId + "'";
    cmd = new SqlCommand(selecteQuery, con);
    returnvalue = (string)cmd.ExecuteScalar();
    con.Close();            
    return returnvalue;        
 }

方法 2

private int SelectTransactionHistoryID(string comment, ContextObject contextObject)
{
    SqlConnection con;
    SqlCommand cmd;
    con = new SqlConnection(contextObject.ConnectionString);
    con.Open();

    string query = "SELECT TransactionID  
                    From dbo.TransactionHistory 
                    WHERE Comments = '" + comment + "'";
    cmd = new SqlCommand(query, con);
    int returnvalue = (int)cmd.ExecuteScalar();
    con.Close();
    return returnvalue;
} 

我在像这样的另一种方法中调用这些方法

int transactionId = SelectTransactionHistoryID(comment, GetContext()); 
string commentsreturnValue = SelectTransactionHistory(transactionId, GetContext());

我怎样才能结合这两种方法来制作更通用的类型.. 有人对如何做到这一点有任何建议吗? 非常感谢.....

【问题讨论】:

  • out参数怎么样?
  • “合并”是什么意思?这些方法的顺序调用有什么意义吗?另外,请在查询中使用参数防止SQL注入,usings释放资源。
  • 你会只有两个还是以后可以添加更多?
  • hmm 是否可以制作单个方法并将变量传递给该方法,感谢您的建议...

标签: c# c#-4.0 ado.net


【解决方案1】:

您可以创建一个方法来使用 ado.net 执行任何查询,例如:

private static T ExecuteQuery<T>(ContextObject contextObject, string query)
{
    T result;
    using (SqlConnection con = con = new SqlConnection(contextObject.ConnectionString))
    {
        try
        {
            con.Open();
            using (SqlCommand cmd = cmd = new SqlCommand(query, con))
            {
                result = (T)cmd.ExecuteScalar();
            }
        }
        catch
        {
            result = null;
        }
        finally
        {
            con.Close();
        }

    }   
    returnr result;  
}

并传递一个返回单个值的查询(在 sql 中我们使用TOP 1),如下所示:

var resultComment = ExecuteQuery<string>("SELECT TOP 1 Comments From dbo.TransactionHistory WHERE TransactionID = '" + transactionId + "'");
var resultTransactionId = ExecuteQuery<int>("SELECT TOP 1 TransactionID  From dbo.TransactionHistory WHERE Comments = '" + comment + "'")

【讨论】:

  • 非常感谢这个解决方案,我正在寻找这个......我在测试方法中调用这些方法......所以可以在执行查询中编写选择命令......跨度>
  • 您可以将任何查询传递给此方法,它将为您执行并给出T 值结果。如果它可以帮助您找到最终解决方案,请记住将其作为遮阳篷进行检查:)
  • 哦,这里的错误处理让我哭了。让错误冒出来。
【解决方案2】:

我已将所有基础设施类设置为使用Dapper。但是,您可以用常规方法替换 dapper 扩展方法。

基础服务:

public interface IService
{
     T Execute<T>(Func<IDbConnection, T> query);
     void Execute(Action<IDbConnection> query);
}

public sealed class Service : IService
{
    private readonly string _connectionString;

    public Service(string connectionString)
    {
        _connectionString = connectionString;
    }

    private IDbConnection CreateConnection()
    {
        var connection = new SqlConnection(_connectionString);
        connection.Open();

        return connection;
    }

    public T Execute<T>(Func<IDbConnection, T> query)
    {
        using (var connection = CreateConnection())
        {
            return query(connection);
        }
    }

    public void Execute(Action<IDbConnection> query)
    {
        using (var connection = CreateConnection())
        {
            query(connection);
        }
    }
}

DTO:

public class TransactionHistory
{
    public int TransactionID { get; set; }
    public string Comments { get; set; }
}

服务:

public interface ITransactionHistoryService
{
    IEnumerable<TransactionHistory> GetByTransactionId(int transactionId);
    IEnumerable<TransactionHistory> GetByComment(string comment);
}

public sealed class TransactionHistoryService : ITransactionHistoryService
{
    // Note SELECT * is frowned upon. Replace with actual column names.
    private const string GetByTransactionIdQuery =
        "SELECT * FROM dbo.TransactionHistory WHERE TransactionID = @TransactionId";
    private const string GetByCommentQuery =
        "SELECT * FROM dbo.TransactionHistory WHERE Comments = @Comment";
    private readonly IService _service;

    public TransactionHistoryService(IService service)
    {
        _service = service;
    }

    public IEnumerable<TransactionHistory> GetByTransactionId(int transactionId)
    {
        var result = _service.Execute(c =>
                                        c.Query<TransactionHistory>(GetByTransactionIdQuery,
                                                                    new { TransactionId = transactionId }));

        return result;
    }

    public IEnumerable<TransactionHistory> GetByComment(string comment)
    {
        var result = _service.Execute(c =>
                                        c.Query<TransactionHistory>(GetByCommentQuery,
                                                                    new { Comment = comment }));

        return result;
    }
}

【讨论】:

    【解决方案3】:

    您可以按如下方式创建单个函数-(未测试)

    private string[] SelectTransactionHistory(int transactionId, ContextObject contextObject)
    {
            string[] returnValues;
            SqlConnection con;
            SqlCommand cmd;
            SqlDataReader reader;
            con = new SqlConnection(contextObject.ConnectionString);
            con.Open();
    
            string returnvalue = string.Empty;
            string selecteQuery = "SELECT TransactionID, Comments From dbo.TransactionHistory WHERE TransactionID = '" + transactionId + "'";
            cmd = new SqlCommand(selecteQuery, con);
            reader = cmd.ExecuteReader();
            while(reader.Read())
            {
                returnValues[0] = reader["TransactionID"].ToString();
                returnValues[1] = reader["Comments"].ToString();
            }
            con.Close();
            return returnValues; 
    }
    

    然后调用如下-

    string[] TransactionHistory = SelectTransactionHistory(transactionId, GetContext());
    int transactionId = Convert.ToInt32(TransactionHistory[0]);
    string commentsreturnValue = TransactionHistory[1];
    

    以上代码未经测试。但你可以得到一个想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2015-05-18
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多