【问题标题】:c# Stored Proceduresc# 存储过程
【发布时间】:2012-04-10 15:34:45
【问题描述】:

我正在尝试创建一个用于调用存储过程的通用方法

我想通过数组传入参数

目前我无法将参数添加到 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;
    }

【问题讨论】:

  • 您想将参数值作为字符串传递??
  • 为什么不只传递一个 SQLParameter 数组(或列表)?
  • 以什么方式失败?另外,为什么要使用字符串作为参数?为什么要将名称和值放在要解析的 same 字符串中?对强类型键/值对使用 Dictionary&lt;TKey,TValue&gt; 之类的东西。最后,您的异常处理会丢弃有用的信息,例如堆栈跟踪和内部异常。有可能某些东西不工作,系统向你提供了一个很好的理由为什么它不工作,而你只是忽略了它。

标签: c# .net stored-procedures


【解决方案1】:

这是我不久前开设的一门课程。它非常易于使用:

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();
    }
}

【讨论】:

    【解决方案2】:

    您必须分别指定参数的名称和值。你有不同的选择来做到这一点。参数集合有一个方法

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

    【讨论】:

      【解决方案3】:

      这个页面很有帮助http://csharp-station.com/Tutorial/AdoDotNet/Lesson01 看看吧,很多例子!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 2020-09-03
        相关资源
        最近更新 更多