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();
}
}
}
Где этот таинственный дополнительный параметр приходит от этого я не знаю о?
И в будущем используйте Profiler, чтобы найти точный код, который отправляется. Обычно, как только вы видите, что именно отправлено, вы можете выяснить, в чем проблема. Эти SQl-серверные, но другие базы данных имеют какие-то возможности профилирования, которые поставляются с ними или вы можете получить. Никогда не записывайте код в базу данных без части программного обеспечения, которое позволяет вам профилировать то, что фактически отправлено в db приложением. Это позволит вам сэкономить тысячи часов отладки. – HLGEM
@HLGEM вот такой совет, который я ищу: практичный. – wootscootinboogie