2017-03-16 61 views
0

我們在數據庫中創建了一個存儲過程。它工作得很好,但我無法弄清楚如何在我的代碼中調用它。出於某種原因,我不斷收到回在C#中存儲過程(ASP.NET CORE)

過程或函數「GetNextApplicationNumber」需要參數「@ApplicationId」,但未提供。

我的代碼:

string connectionString = "THE_CONNECTION_STRING"; 
using (IDbConnection connection = new SqlConnection(connectionString)) 
using (IDbCommand command = connection.CreateCommand()) 
{ 
    command.CommandType = CommandType.StoredProcedure; 

    IDbDataParameter parameter = command.CreateParameter(); 
    parameter.ParameterName = "@ApplicationId"; 
    parameter.Value = applicationId; 
    parameter.DbType = DbType.String; 

    command.Parameters.Add(parameter); 

    command.CommandText = "[dbo].[GetNextApplicationNumber]"; 

    connection.Open(); 

    using (IDataReader reader = command.ExecuteReader()) 
    { 
      string applicationNumber = string.Empty; 

      if (reader.Read()) 
      { 
       applicationNumber = reader.GetValue(0).ToString(); 
      } 

      return applicationNumber; 
    } 
} 

我已經嘗試了不少不同的方式(其中大部分似乎已經過時,不再可用)。

+0

您可以嘗試使用SQL Server Profiler來analize的SQL發送到您的SQL Server。儘量不要設置參數的DbType屬性。 – musium

回答

2

當您設置CommandText屬性時,它將清除參數集合。

0

看來你似乎在使用舊的方式。

試試這個隊友:

public string GetNextApplicationNumber(int applicationId) 
     { 
      DataTable dt = new DataTable(); 
      try 
      { 
       using (SqlConnection conn = new SqlConnection(connString)) 
       { 
        conn.Open(); 

        using (SqlDataAdapter da = new SqlDataAdapter("GetNextApplicationNumber", conn)) 
        { 

         da.SelectCommand.Parameters.AddWithValue("@ApplicationId", applicationId); 
         da.SelectCommand.CommandType = CommandType.StoredProcedure; 
         da.Fill(dt); 

         string applicationNumber = string.Empty; 

         applicationNumber = dt.Rows[0]["Column_Name"].ToString(); 

         return applicationNumber; 
        } 
       } 
      } 
      catch 
      { 
       throw; 
      } 
     } 
+0

你應該看看[我們可以停止使用AddWithValue()了嗎?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)並停止使用'.AddWithValue()' - 它可能會導致意想不到的和令人驚訝的結果... –

+0

我使用.net核心,它似乎並沒有SqlDataAdapter類與核心兼容:( –

0

考慮使用此一:

public static SqlCommand WithParameter(this SqlCommand sqlCommand, SqlParameter parameter) 
    { 
     sqlCommand.Parameters.Add(parameter); 
     return sqlCommand; 
    } 

然後

SqlCommand command = new SqlCommand("[dbo].[GetNextApplicationNumber]",sqlConnection) 
        .WithParameter(new SqlParameter("@ApplicationId", SqlDbType.BigInt) {Value = 1}); 

using (SqlDataReader reader = command.ExecuteReader()) 
{...}