2012-04-04 111 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 2012-04-04 20:30:47

+0

難道你想通過「teacherid」的過程,然後在存儲過程中從「老師」表中選擇「期間」,其中「teacherid」 = @teacherid? – temarsden 2012-04-04 20:32:22

+0

從存儲的proc中返回數據嗎?如果是這樣,那麼我們就需要看你的vb.net代碼給你一個答案 – 2012-04-04 20:34:39

回答

1

1)您正在代碼上添加一個名爲TeacherId的參數,但是您的proc中不存在該參數。你必須在正確的參數從接口傳遞給過程

2)你的程序被稱爲spGetPeriod但你的SQL您有SELECT * FROM老師

0

你定義的參數作爲存儲過程「@Period」,但是當你將參數添加到命令你把它稱爲「@TeacherId」。您的代碼看起來不錯一目瞭然,嘗試改變程序這樣...

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

RETURN 

對您的問題有沒有任何數據,也許嘗試組合框的數據源綁定到讀者,而不是通過閱讀器和循環每個加入,離開的ExecuteReader聲明,並嘗試更換while循環,在這個月底...

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

我嘗試了你的建議,它死了。我收到以下異常錯誤:過程或函數'spGetPeriod'需要參數'@TeacherId',該參數未提供。 – 2012-04-04 20:44:10

+0

這是因爲你有這條線在VB代碼中註釋掉了。您傳遞給參數的selectedIndex的值看起來也是可疑的。 – James 2012-04-04 20:46:23

+0

我的壞,需要小寫字母「d」的標識,嘗試... WHERE TeacherId = @TeacherId 也是我認爲cboTeacher.SelectedIndex是表中的INT而TeacherId是varchar列,可以檢查這一點。 – temarsden 2012-04-04 20:48:29

0

我看到一些問題,您的模式:

  • 你的各種ID應該是整數, NOT varchar。
  • 教師表具有FName,LName和TeacherName。這是不正常的。如果FName和LName用於學生,則應將其保存在帶有StudentId主鍵的獨立Student表中。
  • StudentId可能不應該在Teacher表中。如果要存儲哪些學生處於哪些時段,則應該使用多對多關係標準的連接表。例如,您可以將其稱爲「PeriodStudent」,它將存儲StudentId和PeriodId。

花時間瞭解數據庫規範化概念,如第一,第二和第三範式。如果你不堅持基本的標準化原則,那麼你需要在這個過程中遇到重大問題,而這些問題在以後的修復中將非常昂貴。