2017-05-09 25 views
-2

附近有語法錯誤','異常,當應用程序設置爲運行出現。

在SQL Server Management Studio查詢運行良好。但它在應用程序設置爲運行時引發異常。

存儲過程:

SET ANSI_NULLS ON; 
SET QUOTED_IDENTIFIER ON; 
GO 

ALTER PROCEDURE dbo.[ USP_GET_MONTH_WISE_PENDING_DETAILS] 
    @MONTH INT = 4, 
    @YEAR INT = 2017 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT 
     P.PbsName, PC.CauseName, 
     dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.DayFrom) + N'/' + dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.MonthFrom) + N'/' + 
       dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.YearFrom) + N'থেকে' + dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.DayTo) + N'/' + 
       dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.MonthTo) + N'/' + dbo.F_CONVERT_ENG_NUMBER_TO_BNG(PCI.YearTo) 'Date', 
     PCI.Remarks 
    FROM  
     Pbs P 
    INNER JOIN 
     ProbableConnectionInfo PCI ON PCI.PbsId = P.PbsId 
    INNER JOIN 
     ConnectionPendingCause CPC ON PCI.Id = CPC.ProbableConnectionId 
    INNER JOIN 
     PendingCause PC ON CPC.PendingCauseId = PC.Id 
    WHERE 
     PCI.MONTH = @MONTH AND 
     YEAR = @YEAR AND 
     CPC.PendingNumber > 0; 

    SELECT 
     dbo.F_CONVERT_ENG_NUMBER_TO_BNG(SUM(IC.Pending)) 'PendingApplication', 
     dbo.F_CONVERT_ENG_NUMBER_TO_BNG(SUM(IC.loadNeed)) 'AppliedLoadAmount' 
    FROM  
     IndustrialConnection IC 
    INNER JOIN 
     ProbableConnectionInfo PCI ON IC.ProbableConnectionId = PCI.Id 
    WHERE 
     PCI.MONTH = @MONTH AND YEAR = @YEAR 
    GROUP BY 
     PCI.PbsId; 

    SET NOCOUNT OFF; 
END; 

,這裏是哪裏出了問題被顯示出來:

public static DataTable GetDataByStoredProcedure(string spName, List<SqlParameter> pars = null) 
{ 
    sqlConnection.Open(); 

    var sqlCommand = new SqlCommand(spName, sqlConnection); 
    sqlCommand.CommandType = CommandType.StoredProcedure; 

    if (pars != null) 
    { 
     sqlCommand.Parameters.AddRange(pars.ToArray()); 
    } 

    var dataReader = sqlCommand.ExecuteReader(); 
    var dt = new DataTable("Command"); 
    dt.Load(dataReader); 

    //sqlConnection.Close(); 
    return dt; 
} 

這裏是我使用的方法:

public void ShowPendingIndustrialInfo(string exportType, int year, int month) 
{ 
    List<SqlParameter> pars = new List<SqlParameter>(); 

    SqlParameter p1 = new SqlParameter("@month", SqlDbType.Int); 
    p1.Value = month; 

    SqlParameter p2 = new SqlParameter("@year", SqlDbType.Int); 
    p2.Value = year; 

    pars.Add(p1); 
    pars.Add(p2); 

    var data = SPService.GetDataByStoredProcedure("USP_GET_MONTH_WISE_PENDING_DETAILS",pars); 
    ReportHelper.ShowReport(data, exportType, "rptPendingDetails.rpt"); 
} 

回答

2

當你建立一個用於運行存儲過程的SqlCommand,您需要將CommandType屬性設置爲CommandType.StoredProcedure,否則,該屬性的默認值是Text,並且引擎試圖解析您的命令名稱,如if是一個文字sql命令。當然,名稱month_wise_pending_details不是有效的sql命令文本。

var sqlCommand = new SqlCommand(spName, sqlConnection); 
    sqlCommand.CommandType = CommandType.StoredProcedure; 
    var dataReader = sqlCommand.ExecuteReader(); 

我也應該在代碼中提出警告。你有一個全局連接對象,你不會在使用它之後進行處理。這是一個不好的做法,因爲ADO.NET實現Connection Pooling以極高的效率不再需要保持這些類型的對象總是打開

public class SPService 
{ 
    private static string connectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 

    public static DataTable GetDataByStoredProcedure(string spName) 
    { 
     using(SqlConnection sqlConnection = new SqlConnection(connectionString)) 
     using(SqlCommand sqlCommand = new SqlCommand(spName, sqlConnection)) 
     { 
      sqlConnection.Open(); 
      sqlCommand.CommandType = CommandType.StoredProcedure; 
      using(SqlDataReader dataReader = sqlCommand.ExecuteReader()) 
      { 
       var dt = new DataTable("Command"); 
       dt.Load(dataReader); 
       return dt; 
      } 
     } 
    } 
} 

編輯
如果你想傳遞參數給你的存儲過程,那麼你需要一些修改代碼:

的方法應該接受List<SqlParameter>作爲第二個參數,這個列表添加到收藏SqlCommand.Parameters

public static DataTable GetDataByStoredProcedure(string spName, List<SqlParameter> pars = null) 
{ 
    using(SqlConnection sqlConnection = new SqlConnection(connectionString)) 
    using(SqlCommand sqlCommand = new SqlCommand(spName, sqlConnection)) 
    { 
     sqlConnection.Open(); 
     sqlCommand.CommandType = CommandType.StoredProcedure; 
     if(pars != null) sqlCommand.Parameters.AddRange(pars.ToArray()); 
     using(SqlDataReader dataReader = sqlCommand.ExecuteReader()) 
     { 
      var dt = new DataTable("Command"); 
      dt.Load(dataReader); 
      return dt; 
     } 
    } 
} 

而且調用代碼修改這些參數傳遞

public void ShowPendingIndustrialInfo(string exportType, int year, int month) 
{ 
    List<SqlParameter> pars = new List<SqlParameter>(); 
    SqlParameter p1 = new SqlParameter("@month", SqlDbType.Int); 
    p1.Value = month; 
    SqlParameter p2 = new SqlParameter("@year", SqlDbType.Int); 
    p2.Value = year; 
    pars.Add(p1); 
    pars.Add(p2); 
    var data = SPService.GetDataByStoredProcedure("USP_GET_MONTH_WISE_PENDING_DETAILS", pars); 
    ReportHelper.ShowReport(data, exportType, "rptPendingDetails.rpt"); 
} 

最後編輯
關於未找到存儲過程中的錯誤:如果你仔細看ALTER語句,你會發現在名稱前一個空格的程序。這是錯誤的persinstence的也都與以前固定

ALTER PROCEDURE dbo.[ USP_GET_MONTH_WISE_PENDING_DETAILS] 
        ^
+0

我注意到你已經改變了sp的名字。現在它讀取爲* USP_GET_MONTH_WISE_PENDING_DETAILS *。哪一個是正確的?你可以用調試器檢查傳遞給你的方法的參數的值是什麼? – Steve

+0

參數作爲「USP_GET_MONTH_WISE_PENDING_DETAILS4,2017」(月,年)傳遞給我認爲正確的方法。但程序沒有找到。 @Steve –

+0

如果你的存儲過程被命名爲USP_GET_MONTH_WISE_PENDING_DETAILS但你通過USP_GET_MONTH_WISE_PENDING_DETAILS,4,2017然後難怪如果數據庫找不到名稱 – Steve

0

RU,

在代碼中添加下面的命令通知C#的SqlCommand的是存儲過程後的原因。

sqlCommand.CommandType = CommandType.StoredProcedure; 

IE:

namespace PBSM.DBGateway 
{ 
public class SPService 
{ 
    private static string connectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString; 
    private static SqlConnection sqlConnection = new SqlConnection(connectionString); 

    public static DataTable GetDataByStoredProcedure(string spName) 
    { 
     sqlConnection.Open(); 
     var sqlCommand = new SqlCommand(spName, sqlConnection); 
     **sqlCommand.CommandType = CommandType.StoredProcedure;** 
     var dataReader = sqlCommand.ExecuteReader(); 
     var dt = new DataTable("Command"); 
     dt.Load(dataReader); 
     sqlConnection.Close(); 
     return dt; 
    } 
} 

}

請記住我的答案迴應,如果它幫助你。問候。

相關問題