2012-04-04 4 views
0

Я использую следующую хранимую процедуру, чтобы вызывать числа периодов, соответствующие их учителям.Проблема с хранимой процедурой SQL Server

Мы пишем приложение для приема посетителей, где при выборе имени учителя из выпадающего меню отображается раскрывающееся меню «период». По какой-то причине мы не собираем данные периода.

хранимой процедуры:

ALTER PROCEDURE spGetPeriod @Period varchar(10) 
AS 
SELECT Period 
FROM tmTeacher 
WHERE Period = @Period 

RETURN 

Teacher Table 
TeacherId varchar(10) Unchecked 
FName   varchar(20) Checked 
LName   varchar(20) Checked 
StudentId varchar(10) Unchecked 
Period   varchar(10) Unchecked 
TeacherName varchar(50) Checked 

Period Table 
PeriodId varchar(10) Unchecked 
Period   varchar(50) Unchecked 
ClassId   varchar(10) Unchecked 

Спасибо заранее!

Код вызова SP:

'***** SETUP THE CONNECTION *** 
    SQL = "spGetPeriod '" + (cboTeacher.Text) + "'" 
    'SQL = "select * from teacher" 
    Try 
     With SqlCmd 
      .CommandText = SQL 
      '.CommandType = CommandType.StoredProcedure 
      .Connection = objConnection 
      '.Parameters.AddWithValue("@TeacherId", cboTeacher.SelectedIndex) 
     End With 
     SqlCmd = New SqlCommand(SQL, objConnection) 
    Catch ex As Exception 
     Call ErrorControl(ex) 
    End Try 

    '*** MAKE THE CONNECTION *** 

    Try 
     HandleConnection(objConnection) 
     'MsgBox("Connection Established!") 
     ToolStripStatusLabel1.Text = "Connection Established!" 


    Catch ex As Exception 
     Call ErrorControl(ex) 

    End Try 

    '*** EXECUTE THE COMMAND AND FILL THE COMBO *** 
    Dim Reader As SqlDataReader = SqlCmd.ExecuteReader() 
    While Reader.Read() 
     cboPeriod.Items.Add(Reader(0).ToString) 

    End While 
    ToolStripStatusLabel1.Text = "Periods Loaded!" 




End Sub 
+0

Вам необходимо включить код VB, который вы используете, чтобы захватить результаты SP. – James

+0

Не хотите ли вы передать «teacherid» в процедуру, а затем в sproc выберите «период» из таблицы «учитель», где «teacherid» = @teacherid? – temarsden

+0

Являются ли эти данные возвращенными из хранимой процедуры? Если это так, то нам нужно увидеть ваш код vb.net, чтобы дать вам ответ –

ответ

1

1) Вы добавляете в свой код параметр TeacherId, но на вашем proc он не существует. Вы должны передать правильный параметр в процедуре из интерфейса

2) Ваша процедура называется spGetPeriod, но на вашем SQL вы должны выбрать * от учителя

0

Вы определили параметр как «@Period» в sproc, но при добавлении параметра к команде вы вызываете его «@TeacherId». Ваш код выглядит нормально на первый взгляд, попробуйте изменить процедуру как таковую ...

ALTER PROCEDURE spGetPeriod @TeacherId varchar(10) 
AS 
SELECT Period 
FROM tmTeacher 
WHERE TeacherId = @TeacherId 

RETURN 

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

cboPeriod.DataSource = Reader 
cboPeriod.DataTextField = "Period" 
cboPeriod.DataValueField = "Period" 
cboPeriod.DataBind() 
+0

Я попробовал ваше предложение, и оно умирает. Я получаю ошибку исключения: Процедура или функция 'spGetPeriod' ожидает параметра '@TeacherId', который не был предоставлен. –

+0

Это потому, что вы указали эту строку в коде VB. Значение selectIndex, которое вы передаете параметру, также выглядит подозрительным. – James

+0

Мое плохое, нужно в нижнем регистре «D» в Ид, попробуйте ... ГДЕ TeacherId = @TeacherId также я предполагаю, что cboTeacher.SelectedIndex является INT, тогда как TeacherId в вашей таблице столбец VARCHAR, может проверить, что тоже. – temarsden

0

Я вижу некоторые проблемы с вашей схеме:

  • Ваши различные Идентификаторы должны быть целыми числами, НЕ варчар.
  • Таблица преподавателей имеет имя FName, LName и TeacherName. Это не нормализуется. Если FName и LName предназначены для учащегося, их следует хранить в отдельной таблице Student с основным ключом StudentId.
  • StudentId, вероятно, не должно быть в таблице Учителя. Если вы хотите сохранить, какие ученики в какие периоды, вы должны использовать таблицу соединений, которая является стандартной для отношений «многие ко многим». Вы могли бы назвать его «PeriodStudent», например, и он будет хранить StudentId и PeriodId.

Потратьте время, чтобы понять концепции нормализации БД, такие как Первая, Вторая и Третья Нормальная форма. Если вы не придерживаетесь основных принципов нормализации, вы просите о серьезных проблемах в будущем, и эти проблемы будут очень дорогими, чтобы исправить их позже.

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