2012-04-10 6 views
-5

Я пытаюсь создать универсальный метод для вызова хранимых процедурC# Хранимые процедуры

Я хотел бы передать в параметрах в через массив

На данный момент у меня возникли проблемы при добавлении параметров к SqlCommand

Это то, что я до сих пор

Может кто-нибудь посоветовать

благодаря

Simon

Вызов метода

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

Вы хотите передать значение параметра в виде строки? –

+0

Почему бы просто не передать массив (или список) SQLParameter? –

+0

Каким образом это не удается? Кроме того, почему вы используете строку для параметров? И почему вы помещаете имя и значение в цепочке _same_, которые нужно проанализировать? Используйте что-то вроде словаря 'для строго типизированной пары ключ/значение. Наконец, ваша обработка исключений выбрасывает полезную информацию, такую ​​как трассировки стека и внутренние исключения. Возможно, что-то не работает, и система представляет вам очень вескую причину, почему она не работает, и вы просто игнорируете ее. – David

ответ

2

Вот класс я взбитыми некоторое время назад. Это очень проста в использовании:

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]); 
    } 
    ... 
} 
Смежные вопросы