2015-05-26 6 views
0

У меня возникла интересная проблема в визуальной студии (вероятно, из-за моего отсутствия опыта). У меня есть объект SqlDataSource и объект GridView. Объект Gridview настроен на использование источника SqlDataSource в качестве источника.Использование SqlDataSource в Visual Studio

SqlDataSource использует параметр (Source = Control, его текстовое поле) для передачи в качестве хранимой процедуры SQL для возврата набора записей. Когда я перехожу через код, при изменении в текстовое поле я выполняю SqlDataSource.Insert(), затем GridView.DataBind().

Поскольку у меня были проблемы с получением результатов, я ожидал, что я запустил транс в SQL Server Profiler.

Кажется, что при запуске SqlDataSource.Insert() нулевое значение передается через параметр. Когда GridView.DataBind() работает на следующей строке, значение параметра передается должным образом.

Любые идеи, что может быть причиной этого? Я считаю, что все, что я делаю неправильно, также влияет на другие области моего кода.

protected void ItemBox_TextChanged(object sender, EventArgs e) 
{ 
    if(setFire) 
    { 
     SqlDataSource1.Insert(); 
     GridView1.DataBind(); 
     Label1.Text = GridView1.Rows.Count.ToString() + " Results Found"; 
     Label2.Text = ItemBox.Text; 

     setFire = false; 
     ItemBox.Text = ""; 
     ItemBox.Focus(); 
     setFire = true; 
    } 
} 

ProfilerSnapshot

DataSourceParam

GridView

+0

Почему у нас есть SqlDataSource.Insert здесь, я не вижу никаких вложений в базу данных. ? – Dreamweaver

+0

Чтобы быть абсолютно честным, я просто пытаюсь выполнить хранимую процедуру. Я думал, что мне нужно использовать .Insert(), поскольку я пытаюсь передать значения параметров хранимой процедуре. – user2061929

+0

Чтобы добавить немного к этому. У меня есть второй SqlDataSource, который возвращает выходной параметр. Я также пытаюсь выполнить это, но у меня такая же проблема, как и здесь, когда пропускается NULL. – user2061929

ответ

1

Перед тем, как можно вызвать метод вставки на ваш SqlDataSource вам нужно правильно определить его InsertCommand. Вот как вы можете это сделать:

protected void ItemBox_TextChanged(object sender, EventArgs e) 
{ 
    if(setFire) 
    { 
     SqlDataSource1.InsertCommandType = SqlDataSourceCommandType.StoredProcedure; 
     string storedProcedureName = .... // The name of your stored procedure 

     SqlDataSource1.InsertCommand= storedProcedureName; 

     // Then you should add a SqlParameter object into the collection 
     // of Parameters for the Insert Command 
     // Its name correspond to the variable name expected by your 
     // stored procedure and its value comes from your textbox 
     string paramName = .... // The parameter name in your stored procedure 

     SqlDataSource1.InsertParameters.Add(paramName, yourTextBoxName.Text); 

     // Now you can call Insert() 

     SqlDataSource1.Insert(); 
     GridView1.DataBind(); 
     Label1.Text = GridView1.Rows.Count.ToString() + " Results Found"; 
     Label2.Text = ItemBox.Text; 

     setFire = false; 
     ItemBox.Text = ""; 
     ItemBox.Focus(); 
     setFire = true; 
    } 
} 
+0

Я попробовал ваше решение, но получил следующую ошибку: «В процедуре или функции указано слишком много аргументов». Как вы думаете, это связано с тем, что я уже сделал некоторые настройки с помощью графического интерфейса «Настройка источника данных»? – user2061929

+0

Также, как бы настроить это для работы с параметром вывода? У меня есть другой SqlDataSource, который использует вторую хранимую процедуру с двумя входными и одним выходным параметрами. Спасибо за помощь! – user2061929

+0

@ user2061929, да, возможен конфликт с первоначальными настройками. Я буду исследовать дальше, вернемся к более подробному примеру. С наилучшими пожеланиями – alainlompo

0

Я смог решить свои проблемы. У меня было две хранимые процедуры, которые мне нужно выполнить. Один из них был привязан к GridView, а другой - только для возврата выходного параметра, который я бы отображал на экране.

С SqlDataSource1 (объект привязан к моему GridView) мне не нужно было вызывать SqlDataSource1.Insert(). Просто выполнение команды GridView1.DataBind() работало нормально.

Что касается другого я не мог получить объект SqlDataSource вести себя, как я хотел, так что я закончил с использованием метода, описанного в YouTube видео ниже:

https://www.youtube.com/watch?v=stIWeAcO45Y

Это в конечном итоге работает отлично ,

Огромное спасибо @alainlompo за помощь выше. Хотя я не использовал эту технику, я нашел ваш пример очень полезным.

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