2013-08-22 60 views
2

你好我有两种方法恢复如int和字符串值的两个不同的返回类型,我正在执行的查询方法内部进行传递不同的变量,如下面的结合两种方法返回两个不同的值

方法1

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

我如何结合这两种方法,以使更多的一般类型.. 会不会有人对如何做到这一点的任何建议.. 非常感谢。 ....

+0

怎么样'out'参数? – Artless

+0

“联合”是什么意思?这些方法的顺序调用是否有意义?另外,请在查询中使用参数来防止SQL注入,并使用''来释放资源。 – Dennis

+1

你会只有两个,或者将来可以添加更多吗? – bendataclear

回答

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 + "'") 
+0

我得到两种不同类型的返回类型..... –

+0

看我的编辑:) –

+0

非常感谢这个解决方案和我正在寻找这一个...我在测试方法内调用这些方法...所以有可能在执行查询内写入选择命令... –

0

您可以创建一个单一的功能如下 - (未测试)

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]; 

上面的代码是不测试。但你可以得到一个想法。

1

我已将所有基础结构类设置为使用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; 
    } 
} 
相关问题