2012-04-10 105 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]); 
    } 
    ... 
}