2017-02-08 8 views
0

Я не уверен, что его управление asp:SqlDataSource или это ASPxTreeList от DevExpress Я использую, но я получаю странную ошибку при попытке запустить хранимую процедуру с использованием метода Insert().SQLDataSource = "Процедура или функция [Имя] содержит слишком много аргументов."

При добавлении узла, когда я пытаюсь вставить узел в базу данных

protected void TagList_NodeInserting(object sender, DevExpress.Web.Data.ASPxDataInsertingEventArgs e) 
    { 
     SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.StoredProcedure; 
     SqlDataTagging.InsertParameters.Add("ParentID", e.NewValues["ParentTag_ID"].ToString()); 
     SqlDataTagging.InsertParameters.Add("TagName", e.NewValues["TagName_VC"].ToString()); 
     SqlDataTagging.InsertParameters.Add("UserID", "1"); 

     SqlDataTagging.InsertCommand = "sp_InsertTag"; 

     SqlDataTagging.Insert(); 
    } 

Однако, когда я стрелять выше код, я получаю эту ошибку

Процедура или функция sp_InsertTag имеет слишком много аргументов указано.

Мой SP Заголовок

ALTER PROCEDURE [dbo].[sp_InsertTag] (@ParentID INT, @TagName VARCHAR(100), @UserID int) 

Но как вы можете видеть, есть 3 параметров в СП и 3 в C# код.

Странно, если я действительно запускаю SQL через текст, например.

SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.Text; 

и писать SQL в C#, он будет работать ...

Кто-нибудь есть какие-либо идеи или какие-либо альтернативы, так что я могу использовать хранимые процедуры?

Благодаря

+0

остерегаться приставка "sp_" : http://stackoverflow.com/questions/20530211/avoid-naming-user-stored-procedures-sp-or-sp – Tanner

+0

Спасибо за предупреждение, по-прежнему делает ту же ошибку, когда я сменил имя, но что-то о чем подуматьбудущее. – user3428422

+1

Вызывается ли 'TagList_NodeInserting' 2-й раз, когда это происходит? Если это так же объект Collection объектов? Если это так, вы очищаете коллекцию перед вызовом? Даже если вы очищаете коллекцию, создайте новый экземпляр. – radarbob

ответ

1

Предположим, у вас есть SqlDataSource с ID SqlDataTagging заселить узлы дерева, то возникает ошибка, если TagList_NodeInserting метод срабатывает несколько раз, поэтому в какой-то момент InsertParameters коллекция заполняет с более чем 3-х параметров, указанных в хранимой процедуре.

Чтобы смягчить эту проблему, я предлагаю вам очистку InsertParameters коллекции перед добавлением параметров, как показано ниже:

... 
SqlDataTagging.InsertCommandType = SqlDataSourceCommandType.StoredProcedure; 
SqlDataTagging.InsertParameters.Clear(); // add this line to clear InsertParameters collection before adding parameters 
SqlDataTagging.InsertParameters.Add("ParentID", e.NewValues["ParentTag_ID"].ToString()); 
SqlDataTagging.InsertParameters.Add("TagName", e.NewValues["TagName_VC"].ToString()); 
SqlDataTagging.InsertParameters.Add("UserID", "1"); 
... 

Связанного вопрос:

ASPxTreeList - The 'Procedure or function [name] has too many arguments specified' exception is raised when a node is deleted (подобный подход)

+0

Спасибо, ваши знания помогли мне решить эту проблему. – user3428422

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