2012-04-10 8 views
-5

Ich versuche, für den Aufruf von Stored ProceduresC# Stored Procedures

eine generische Methode zu erstellen

ich in

i Mühe, die Parameter angeben, um das habe im Moment über ein Array in den Parameter zu übergeben möchten SqlCommand

Dies ist, was ich bisher haben

Kann jemand raten

dank

Simon

Aufruf der Methode

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


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

Methode

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

Sie möchten den Parameterwert als String übergeben ?? –

+0

Warum übergeben Sie nicht einfach ein Array (oder eine Liste) von SQLParameter? –

+0

Inwiefern scheitert es? Warum verwenden Sie eine Zeichenfolge für die Parameter? Und warum setzen Sie den Namen und den Wert in der Zeichenfolge _same_, die geparst werden soll, zurück? Verwenden Sie so etwas wie ein 'Dictionary ' für ein stark typisiertes Schlüssel/Wert-Paar. Schließlich werden durch die Ausnahmebehandlung nützliche Informationen wie Stack-Traces und innere Ausnahmen entfernt. Es ist möglich, dass etwas nicht funktioniert und das System präsentiert Ihnen einen sehr guten Grund, warum es nicht funktioniert, und Sie ignorieren es einfach. – David

Antwort

2

Hier ist eine Klasse I vor einiger Zeit aufgepeitscht. Es ist ziemlich einfach zu bedienen:

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 
    } 
} 

Hier ist ein Beispiel dafür, wie es zu benutzen:

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

Sie müssen die Namen angeben und die Werte des Parameters getrennt. Sie haben verschiedene Möglichkeiten, dies zu tun. Die Parameter Sammlung hat ein Verfahren

public SqlParameter AddWithValue(string parameterName, object value) 

Wenn Sie es verwenden möchten, werden Sie es beide auf Ihre Methode

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]); 
    } 
    ... 
} 
Verwandte Themen