2013-07-25 10 views
0

Posibale дубликатом Getting 'too many parameters passed' to stored procedure on ASPX pageхранимых процедур имеет слишком много параметров


Я использую элемент управления SqlDataSource для некоторого обновления и удаления функциональность в GridView. Я продолжаю получать ошибку времени выполнения Procedure or function spUpdateTest has too many arguments specified. Когда я запускаю хранимую процедуру на SQL Server, она работает нормально. Когда я нажимаю на часть удаления GridView, это работает. Однако, когда я пытаюсь обновить, я получаю вышеуказанную ошибку.

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
      ConnectionString="<%$ ConnectionStrings:dbcsDrugCards %>" 
      DeleteCommand="spDeleteTest" DeleteCommandType="StoredProcedure" 
      InsertCommand="spInsertTest" InsertCommandType="StoredProcedure" 
      SelectCommand="spGetAllTest" SelectCommandType="StoredProcedure" 
      UpdateCommand="spUpdateTest" UpdateCommandType="StoredProcedure"> 
      <DeleteParameters> 
       <asp:Parameter Name="PatientId" Type="Int32" /> 
      </DeleteParameters> 
      <InsertParameters> 
       <asp:Parameter Name="PatientId" Type="Int32" /> 
       <asp:Parameter Name="RaceId" Type="Int32" /> 
       <asp:Parameter Name="CountyId" Type="Int32" /> 
       <asp:Parameter Name="Gender" Type="String" /> 
       <asp:Parameter Name="DateOfBirth" Type="DateTime" /> 
       <asp:Parameter Name="SesId" Type="Int32" /> 
      </InsertParameters> 
      <UpdateParameters> 
       <asp:Parameter Name="PatientId" Type="Int32" /> 
       <asp:Parameter Name="RaceId" Type="Int32" /> 
       <asp:Parameter Name="CountyId" Type="Int32" /> 
       <asp:Parameter Name="Gender" Type="String" /> 
       <asp:Parameter Name="DateOfBirth" Type="DateTime" /> 
       <asp:Parameter Name="SesId" Type="Int32" /> 
      </UpdateParameters> 
     </asp:SqlDataSource> 

Вы можете увидеть шесть параметров в SqlDataSource. Теперь вот моя хранимая процедура

create proc spUpdateTest 
@PatientId int 
,@RaceId int 
,@CountyId int 
,@Gender varchar(50) 
,@DateOfBirth date 
,@SesId int 
as 
begin 
update t 
set t.raceid = @RaceId 
,t.countyId = @CountyId 
,t.gender = @Gender 
,t.DateOfBirth = @DateOfBirth 
,t.SocioEconomicStatusId = @SesId 
from test as t 
where t.patientId = @PatientId 
end 

обе имеют шесть параметров. GridView для хорошей меры в случае, если это делает разницу

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
      CellPadding="4" DataKeyNames="patientId" DataSourceID="SqlDataSource1" 
      ForeColor="#333333" GridLines="None"> 
      <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> 
      <Columns> 
       <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> 
       <asp:BoundField DataField="patientId" HeaderText="patientId" ReadOnly="True" 
        SortExpression="patientId" /> 
       <asp:BoundField DataField="RaceId" HeaderText="RaceId" 
        SortExpression="RaceId" /> 
       <asp:BoundField DataField="CountyId" HeaderText="CountyId" 
        SortExpression="CountyId" /> 
       <asp:BoundField DataField="Gender" HeaderText="Gender" 
        SortExpression="Gender" /> 
       <asp:BoundField DataField="DateOfBirth" HeaderText="DateOfBirth" 
        SortExpression="DateOfBirth" /> 
       <asp:BoundField DataField="SocioEconomicStatusId" 
        HeaderText="SocioEconomicStatusId" SortExpression="SocioEconomicStatusId" /> 
       <asp:BoundField DataField="DateEnrolled" HeaderText="DateEnrolled" ReadOnly="true" 
        SortExpression="DateEnrolled" /> 
      </Columns> 
      <EditRowStyle BackColor="#999999" /> 
      <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> 
      <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> 
      <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> 
      <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> 
      <SortedAscendingCellStyle BackColor="#E9E7E2" /> 
      <SortedAscendingHeaderStyle BackColor="#506C8C" /> 
      <SortedDescendingCellStyle BackColor="#FFFDF8" /> 
      <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> 
     </asp:GridView> 

Я не знаю, если это означает что-нибудь, но у меня есть одно поле, DateEnrolled, который не предназначен для редактирования пользователем и сохраняется в базы данных как GetDate() всякий раз, когда в базу данных добавлен объект Test.

C#

public static void UpdateTest(int PatientId, int raceID, int countyId, string gender 
      , DateTime dateOfBirth, int sesId) 
     { 
      using (SqlConnection con = new SqlConnection(TestDataAccessLayer.ConnectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("spUpdateTest", con)) 
       { 
        con.Open(); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@RaceDescription", raceID); 
        cmd.Parameters.AddWithValue("@CountyName", countyId); 
        cmd.Parameters.AddWithValue("@Gender", gender); 
        cmd.Parameters.AddWithValue("@DateOfBirth", dateOfBirth); 
        cmd.Parameters.AddWithValue("@SesDescription", sesId); 
        cmd.Parameters.AddWithValue("@PatientId", PatientId); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 

это работает

public static void DeleteTest(int PatientId) 
     { 
      using (SqlConnection con = new SqlConnection(TestDataAccessLayer.ConnectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand("spDeleteTest", con)) 
       { 
        con.Open(); 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@PatientId", PatientId); 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 

Где этот таинственный дополнительный параметр приходит от этого я не знаю о?

+2

И в будущем используйте Profiler, чтобы найти точный код, который отправляется. Обычно, как только вы видите, что именно отправлено, вы можете выяснить, в чем проблема. Эти SQl-серверные, но другие базы данных имеют какие-то возможности профилирования, которые поставляются с ними или вы можете получить. Никогда не записывайте код в базу данных без части программного обеспечения, которое позволяет вам профилировать то, что фактически отправлено в db приложением. Это позволит вам сэкономить тысячи часов отладки. – HLGEM

+0

@HLGEM вот такой совет, который я ищу: практичный. – wootscootinboogie

ответ

2

Ваши имена параметров в коде C# не соответствуют тем, что определено в хранимой процедуре.

Вот имена, которые не соответствуют, что в хранимой процедуре:

  • @RaceId - он находится в C# код @RaceDescription
  • @CountyId - это в коде C# @CountryName
  • @SesId - это в C# код @SesDescription

Моя догадка, не видя код, для удаления хранимой процедуры, является то, что @PatientId параметров с обеих сторон (C# и хранимая процедура), поэтому он работает, а обновление не работает.

+0

Проблема в том, что все в элементе управления GridView было связанным полем и, таким образом, было преобразовано в параметр хранимой процедуры. У меня было одно поле, которое было 'GetDate()', которое не использовалось. Поэтому я добавил дополнительный параметр в хранимую процедуру со значением по умолчанию null, и он работал, как ожидалось. – wootscootinboogie