2012-04-10 104 views
-5

我試圖調用存儲過程C#存儲過程

創建一個通用的方法

我想通過一個數組

的參數傳遞在我有麻煩添加參數的瞬間SqlCommand的

這是我迄今爲止

誰能勸

感謝

西蒙

調用方法

string[] paramNames = new string[1]; 
paramNames[0] = "@date = 2012-1-1"; 
string err=""; 


WriteToDatabase("exec LoadData", CommandType.StoredProcedure, paramNames, out err); 

方法

public static bool WriteToDatabase(
     string sql, 
     CommandType commandType, 
     string[] paramNames, 
     out string errorText) 
    { 
     bool success = false; 
     errorText = ""; 
     try 
     { 
      using (SqlConnection connection = new SqlConnection(ConnectionString)) 
      { 
       connection.Open(); 
       List<SqlParameter> parameters = new List<SqlParameter>(); 

       foreach (string paramName in paramNames) 
       { 
        parameters.Add(new SqlParameter() { ParameterName = paramName }); 
       } 

       using (SqlCommand command = new SqlCommand() 
       { 
        Connection = connection, 
        CommandText = sql, 
        CommandType = commandType, 
        Parameters = parameters 

       }) 
       command.ExecuteNonQuery(); 

       connection.Close(); 
      } 


     } 
     catch (SqlException sex) 
     { 
      log.Error("QueryDatabase SQLexception:" + sex.Message); 
     } 
     catch (Exception ex) 
     { 
      log.Error("QueryDatabase exception:" + ex.Message); 
     } 
     return success; 
    } 
+0

你想傳遞參數值作爲字符串? – 2012-04-10 15:37:20

+0

爲什麼不傳遞SQLParameter的數組(或列表)? – 2012-04-10 15:38:32

+0

它失敗的方式是什麼?另外,爲什麼你使用字符串作爲參數?你爲什麼要把名字和_same_字符串中的值解析出來?使用類似「Dictionary 」這樣的強類型鍵/值對。最後,您的異常處理將丟棄有用信息,例如堆棧跟蹤和內部異常。有些東西可能無法正常工作,系統可能會告訴你它不工作的一個很好的理由,而你只是忽略它。 – David 2012-04-10 15:39:08

回答

2

這裏有一個I類颳起了一會兒回來。這是很容易使用:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.Web; 
using System.Xml; 
using System.Collections; 
using System.Collections.Specialized; 
using System.Collections.Generic; 
using System.Text; 

namespace NESCTC.Data 
{ 
    public class DataAccess : IDisposable 
    { 
     #region declarations 

     private SqlCommand _cmd; 
     private string _SqlConnString; 

     #endregion 

     #region constructors 

     public DataAccess(string ConnectionString) 
     { 
      _cmd = new SqlCommand(); 
      _cmd.CommandTimeout = 240; 
      _SqlConnString = ConnectionString; 
     } 

     #endregion 

     #region IDisposable implementation 

     ~DataAccess() 
     { 
      Dispose(false); 
     } 

     public void Dispose() 
     { 
      Dispose(true);    
     } 

     protected virtual void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       _cmd.Connection.Dispose(); 
       _cmd.Dispose(); 
      } 
     } 

     #endregion 

     #region data retrieval methods 

     public DataTable ExecReturnDataTable() 
     { 
      using (var conn = new SqlConnection(this.ConnectionString)) 
      { 
       try 
       { 
        PrepareCommandForExecution(conn); 
        using (SqlDataAdapter adap = new SqlDataAdapter(_cmd)) 
        { 
         DataTable dt = new DataTable(); 
         adap.Fill(dt); 
         return dt; 
        } 
       } 
       finally 
       { 
        _cmd.Connection.Close(); 
       } 
      } 
     }     

     public object ExecScalar() 
     { 
      using (var conn = new SqlConnection(this.ConnectionString)) 
      { 
       try 
       { 
        PrepareCommandForExecution(conn); 
        return _cmd.ExecuteScalar(); 
       } 
       finally 
       { 
        _cmd.Connection.Close(); 
       } 
      } 
     }  

     #endregion 

     #region data insert and update methods 

     public void ExecNonQuery() 
     { 
      using (var conn = new SqlConnection(this.ConnectionString)) 
      { 
       try 
       { 
        PrepareCommandForExecution(conn); 
        _cmd.ExecuteNonQuery(); 
       } 
       finally 
       { 
        _cmd.Connection.Close(); 
       } 
      } 
     } 

     #endregion 

     #region helper methods 

     public void AddParm(string ParameterName, SqlDbType ParameterType, object Value) 
     { _cmd.Parameters.Add(ParameterName, ParameterType).Value = Value; } 

     private SqlCommand PrepareCommandForExecution(SqlConnection conn) 
     { 
      try 
      { 
       _cmd.Connection = conn; 
       _cmd.CommandType = CommandType.StoredProcedure; 
       _cmd.CommandTimeout = this.CommandTimeout; 
       _cmd.Connection.Open(); 

       return _cmd; 
      } 
      finally 
      { 
       _cmd.Connection.Close(); 
      } 
     } 

     #endregion 

     #region properties 

     public int CommandTimeout 
     { 
      get { return _cmd.CommandTimeout; } 
      set { _cmd.CommandTimeout = value; } 
     } 

     public string ProcedureName 
     { 
      get { return _cmd.CommandText; } 
      set { _cmd.CommandText = value; } 
     } 

     public string ConnectionString 
     { 
      get { return _SqlConnString; } 
      set { _SqlConnString = value; } 
     } 

     #endregion 
    } 
} 

下面是如何使用它的一個例子:

public void UpdateWorkOrder(int workOrderID, int paymentTermTypeID, string acceptedBy, string lastIssuedBy) 
{ 
    using (var data = new DataAccess(this.ConnectionString)) 
    { 
     data.ProcedureName = "UpdateWorkOrderDetails"; 
     data.AddParm("@WorkOrderID", SqlDbType.Int, workOrderID); 
     data.AddParm("@PaymentTermTypeID", SqlDbType.Int, paymentTermTypeID); 
     data.AddParm("@AcceptedBy", SqlDbType.VarChar, acceptedBy); 
     data.AddParm("@LastIssuedBy", SqlDbType.VarChar, lastIssuedBy); 
     data.ExecNonQuery(); 
    } 
} 

public DataTable GetWorkOrder(int workOrderID) 
{ 
    using (var data = new DataAccess(this.ConnectionString)) 
    { 
     data.ProcedureName = "GetWorkOrder"; 
     data.AddParm("@WorkOrderID", SqlDbType.Int, workOrderID); 
     return data.ExecReturnDataTable(); 
    } 
} 
0

您必須單獨指定的名稱和參數的值。你有不同的選擇來做到這一點。該參數集合有一個方法

public SqlParameter AddWithValue(string parameterName, object value) 

如果你想使用它,你將不得不他們兩人提供給您的方法

public static bool WriteToDatabase(
    string sql, 
    CommandType commandType, 
    string[] paramNames,  
    object[] paramValues,  
    out string errorText)  
{ 
    ... 
    for (int i = 0; i < paramNames.Length; i++) { 
     command.Parameters.AddWithValue(paramNames[i], paramValues[i]); 
    } 
    ... 
}