2013-08-22 54 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; 
    } 
} 
相關問題