簡體   English   中英

使用無名參數執行存儲過程

[英]Execute Stored Procedure With Nameless Parameters

我只是想知道是否有辦法執行存儲過程而不命名參數。 這意味着C#按照它們在存儲過程中聲明的順序解析參數。

public static DataTable GetRelatedResources(string StoredProcedure, object[] Parameters)
{
   var Results = new DataTable();

   try
   {
        using (SqlConnection conn = new SqlConnection())
        {
            using (SqlCommand cmd = new SqlCommand(ConfigurationManager.ConnectionStrings["MK3Entities"].ConnectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = StoredProcedure;

                if (Parameters!= null)
                {
                   foreach(var Param in Parameters)
                   { 
                       // I Want To Do something like this
                       cmd.Parameters.AddWithValue(Param);
                   }
                }

                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(Results);
            }
        }
    }
    catch (Exception ex)
    {
       MMSLogger.Instance.WriteToLog("Exception Executing Stored Procedure:" + ex.Message);
    }

    return Results;
}

根據MSDN

ParameterName以@paramname形式指定。 在執行依賴於參數的SqlCommand之前, 必須設置ParameterName。

一篇關於SqlCommand MSDN文章:

SQL Server的.NET Framework數據提供程序不支持無名,也稱為序數。

所以答案是否定的,沒有命名參數就沒有辦法執行存儲過程。

你的意思是派生參數之類的東西。 這篇MSDN文章給出了一個概述:

也可以使用DbCommandBuilder類從存儲過程派生參數。 SqlCommandBuilder和OleDbCommandBuilder類都提供靜態方法DeriveParameters,它自動填充使用存儲過程中的參數信息的命令對象的參數集合。 請注意,DeriveParameters會覆蓋該命令的任何現有參數信息。

另一個解決方案是從sql-database獲取存儲過程的參數,而不是在代碼中設置它們。 但這需要一個額外的查詢。 要獲取參數:

select * from dbo.parameters where specific_name='procedure-name'

但無論如何,您必須使用參數名稱。

改為執行命令 ,並傳入參數'@ p1','@ p2'等:

cmd.CommandType = CommandType.Text;
cmd.CommandText = 'exec ' + StoredProcedure;

int i=0;
string comma = ' ';
foreach(var Param in Parameters)
   {
   var paramName = String.Format("@P{0}", i);
   cmd.CommandText += comma + paramName;
   cmd.Parameters.AddWithValue(paramName, Param);
   ++i;
   comma = ', ';
   }

請注意AddwithValue是一個巨大的性能反模式。 請參閱數據訪問代碼如何影響數據庫性能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM