2014-09-22 86 views
0

我在我的C#代码中有很多存储过程调用,但只有这一个保持失败。我正在运行VS 2012和SQL Server 2008 R2。我的连接字符串对于我的所有存储过程都是相同的,并且我拥有相同的权限。找不到存储过程

我得到这个错误

未能找到存储过程 'StP_Map_Preload @bldg,@linePos,@startD,@lineNo,@Pgrm,@apPos,@sessionID'。
System.Exception的{} System.Data.SqlClient.SqlException

在这条线:

SqlDataReader dr = cmd.ExecuteReader();: 

我试图创建一个新的存储过程使用相同的代码,设置权限,但它失败太。

public ArrayList DetailPreload(string bldg, string linePos, DateTime startD, string lineNo, string Pgrm, int apPos, string sessionID) 
{ 
    string strSQL = "StP_Map_Preload @bldg, @linePos, @startD, @lineNo, @Pgrm, @apPos, @sessionID"; 

    ArrayList list = new ArrayList(); 

    using (SqlConnection conStr = new SqlConnection(connM)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.Clear(); 

      cmd.Parameters.AddWithValue("@bldg", bldg); 
      cmd.Parameters.AddWithValue("@linePos", linePos); 
      cmd.Parameters.AddWithValue("@startD", startD); 
      cmd.Parameters.AddWithValue("@lineNo", lineNo); 
      cmd.Parameters.AddWithValue("@Pgrm", Pgrm); 
      cmd.Parameters.AddWithValue("@apPos", apPos); 
      cmd.Parameters.AddWithValue("@sessionID", sessionID); 

      cmd.CommandText = strSQL; 
      cmd.Connection = conStr; 

      conStr.Open(); 
      SqlDataReader dr = cmd.ExecuteReader(); 

      while (dr.Read()) 
      { 
       list.Add(new 
         { 
          company = dr["Company"], 
          Pgrm = dr["Pgrm"], 
          lineNum = dr["lineNum"], 
          lineStation = dr["lineStation"], 
          jobCount = dr["Job"], 
          item = dr["Item"], 
          qty = dr["Qty"], 
          partQty = dr["partQty"], 
          invCnt = dr["invCnt"], 
          runID = dr["runID"] 
         }); 
      } 

      conStr.Close(); 

      return list; 
     } 
    } 
} 

我的存储过程是在SQL Server中,我可以在SQL Server中执行它

/* 
StP_Map_Preload 'AA-12', '7', '09/19/2014', '', '247', 7, 'val2gxfh5ihoqy4tshzl4tp3' 
*/ 
ALTER proc [dbo].[StP_Map_Preload] 
     @Bldg varchar(10), 
     @linePos varchar(5), 
     @startD date, 
     @LineNo varchar(5), 
     @Pgrm varchar(5), 
     @apPos int, 
     @sessionID varchar(50) 
AS 
BEGIN 
    declare @sql varchar(Max), @PST varchar(20), 
      @SI1 varchar(5), @SI2 varchar(5), @SI3 varchar(5), 
      @hasAP bit, @CCLen varchar, 
      @Co varchar(5), @CCs varchar(25), @lsGrp varchar(max)... 
+1

'公共ArrayList' .....不寒而栗。请停止使用ArrayLists。 – gunr2171 2014-09-22 17:14:41

+1

你应该看看[我们可以停止使用AddWithValue()了吗?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)并停止使用'.AddWithValue()' - 它可能会导致意想不到的结果...以及:[坏习惯踢:声明VARCHAR没有(长度)](http://sqlblog.com/blogs/aaron_bertrand/ archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length.aspx) - 你应该总是**为你使用的任何'varchar'变量和参数提供一个长度 – 2014-09-22 17:17:39

+0

@ gunr2171,代码就像是2002年! – 2014-09-22 17:17:49

回答

3

你行更改为

string strSQL = "StP_Map_Preload"; 

没有必要列出的参数为存储过程命名的字符串。