2017-02-08 2 views
0

Я знаю, что этот поток будет, вероятно, получите помечен как дубликат, но я просмотрел все подобные сообщения, но никто, похоже, чтобы помочь решить эту проблему:Procdure ожидает параметр @location, который не был предоставлен. Это сводит меня с умом

У меня есть этот код надрез:

Dim loc As String = DirectCast(GridView1 _ 
      .FooterRow.FindControl("txtLocation"), TextBox).Text 

cmd.CommandText = "insert into Locations(Location " & _ 
") values(@Location);" & _ 
"select LocationID, Location from locations" 

cmd.Parameters.AddWithValue("@Location", SqlDbType.VarChar).Value = loc 

Просто чтобы это было просто.

Это прекрасно работает.

Затем я повернул этот встроенный код в хранимую процедуру:

ALTER PROCEDURE [dbo].[spx_AddNewLoc] 
      @Location varchar(150) 
AS 
set nocount on 
    BEGIN --add new request type 
    INSERT INTO Locations(Location)VALUES(@Location) 
    SELECT LocationID, Location from locations 
    END 
set nocount off 

Тогда назвал его в моем CodeFile:

Dim loc As String = DirectCast(GridView1 _ 
      .FooterRow.FindControl("txtLocation"), TextBox).Text 
cmd.CommandText = "spx_AddNewLoc " 
cmd.Parameters.AddWithValue("@Location", SqlDbType.VarChar).Value = loc 

Я просто продолжаю получать «Процедура ожидает @location, который не поставлялся.»

Любые идеи, что мне не хватает?

<FooterTemplate> 
    <asp:TextBox ID="txtlocation" runat="server" placeholder="Please enter location here..." style="width:400px;"></asp:TextBox><br /> 
</FooterTemplate>  
<FooterTemplate> 
    <asp:Button ID="btnAdd" runat="server" Text="Add" OnClick = "AddNewLocation" /> 
</FooterTemplate> 

«// ** последний код ниже

Protected Sub AddNewLocation(ByVal sender As Object, ByVal e As EventArgs) 
    Dim IsAdded As Boolean = True 
    Dim loc As String = DirectCast(GridView1 _ 
      .FooterRow.FindControl("txtLocation"), TextBox).Text 
    Dim con As New SqlConnection(strConnString) 
    Dim cmd As New SqlCommand() 
    cmd.CommandType = CommandType.Text 
    cmd.CommandText = "insert into Locations(Location " & _ 
    ") values(@Location);" & _ 
    "select LocationID, Location from locations" 
    cmd.Parameters.Add("@Location", SqlDbType.VarChar).Value = loc 
    If IsAdded = True Then 
     lblMsg.Text = (Convert.ToString("'") & loc) + "' location added successfully!" 
     lblMsg.ForeColor = System.Drawing.Color.Green 
    Else 
     lblMsg.Text = (Convert.ToString("Error while adding '") & loc) + "' locaton!" 
     lblMsg.ForeColor = System.Drawing.Color.Red 
    End If 

    GridView1.DataSource = GetData(cmd) 
    GridView1.DataBind() 
End Sub 
+0

Вы на 100% уверены, что 'loc' не' Nothing' И что выглядит нижний колонтитул GridView? – VDWWD

+0

@VDWWD, прежде всего, спасибо за ваш ответ.Я абсолютно уверен, что loc получает значение, переданное ему из gridview. Все работает отлично, когда я использую встроенный я опубликовал. Вот как выглядит нижний колонтитул GridView. Пожалуйста, см. Выше для обновленного кода. – Tairoc

+0

Возможный дубликат [При выполнении команды.Prepare() У меня есть метод SqlCommand.Prepare требует, чтобы все параметры имели явно установленный тип «ошибка» (http://stackoverflow.com/q/36554082/11683) – GSerg

ответ

0

Насколько вы изменили его к хранимой процедуре, вы должны изменить .CommandType вашего SqlCommand.

cmd.CommandType = CommandType.StoredProcedure; 

SqlCommand.CommandType Property

+0

Это была моя первая мысль. Не уверен, почему кто-то будет вниз. – Bugs

+1

По умолчанию 'CommandType = CommandType.Text' – McNets

+0

И если он не установлен правильно, вы получите смешные ошибки, подобные этому. Это законный ответ. – Bugs

0

Rename AddWithValue Добавить. В вашем коде AddWithValue принимает значение как второй параметр, и я подозреваю, что он делает ваш параметр @Location другого типа, чем varchar, поэтому он не может быть найден при выполнении процедуры. https://msdn.microsoft.com/en-us/library/wbys3e9s(v=vs.110).aspx

+0

, как я уже говорил в своем последнем посте, у меня был Add before, но из-за этой же проблемы я изменил его на AddWithValue. Я изменил его снова, чтобы добавить, но до сих пор не люблю. – Tairoc

+0

Попробуйте установить точку останова сразу после добавления параметра и найти его в коллекции параметров, чтобы убедиться, что оно имеет правильное имя, тип и размер. –

+0

cmd.Parameters.AddWithValue ("@ Location", SqlDbType.VarChar) создает параметр типа Int и значение 22, поскольку SqlDbType.VarChar передается как значение. Тогда .Value = loc делает этот параметр типа NVarChar. Попробуйте изменить тип @Location на NVarchar в определении процедуры, и он должен работать –

1

Быстрый переход от C#. Я тестировал его локально, и он работает. Вы должны в конечном итоге обернуть код в блоке Using, чтобы правильно и правильно закрыть объекты/соединение.

Dim loc As String = "test" 

Dim Command As New SqlCommand("spx_AddNewLoc") 
Command.Parameters.Add("@Location", SqlDbType.VarChar).Value = loc 

Dim Connection As New SqlConnection(connStr) 
Command.Connection = Connection 
Command.CommandType = CommandType.StoredProcedure 
Connection.Open() 

Command.ExecuteNonQuery() 

Connection.Close() 

C#

string storedProcedure = "spx_AddNewLoc"; 
string location = "Amsterdam"; 

using (SqlConnection connection = new SqlConnection(connStr)) 
using (SqlCommand command = new SqlCommand(storedProcedure, connection)) 
{ 
    command.CommandType = CommandType.StoredProcedure; 
    command.Parameters.Add("@Location", SqlDbType.VarChar).Value = location; 

    connection.Open(); 
    command.ExecuteNonQuery(); 
} 
1

Причина ошибки в том, что вы не установили CommandType использовать CommandType.StoredProcedure. Я высмеял оба примера, чтобы выделить эту ошибку.

Это код до меня установки CommandType:

enter image description here

Это код, когда я установить CommandType:

enter image description here

Это рабочий код:

Using con As New SqlConnection(strConnString), 
     cmd As New SqlCommand With {.CommandText = "spx_AddNewLoc", .CommandType = CommandType.StoredProcedure, 
            .Connection = con} 

    cmd.Parameters.Add("@Location", SqlDbType.VarChar).Value = location 

    con.Open() 

    cmd.ExecuteNonQuery() 

End Using 
Смежные вопросы