0

我正在使用以下存储过程来调用期间编号以将它们与教师匹配。

我们正在编写一个考勤应用程序,从下拉菜单中选择教师的姓名后,“句号”下拉菜单就会出现。出于某种原因,我们没有得到要填充的周期数据。

存储过程:

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
4

3 回答 3

1

1)您在代码上添加了一个名为 TeacherId 的参数,但在您的 proc 上它不存在。您必须将正确的参数从接口传递给过程

2)您的过程称为 spGetPeriod 但在您的 SQL 上,您选择 * from teacher

于 2012-04-04T20:55:41.090 回答
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()
于 2012-04-04T20:41:42.577 回答
0

我发现您的架构存在一些问题:

  • 您的各种 ID 应该是整数,而不是 varchar。
  • 教师表具有 FName、LName 和 TeacherName。这不是标准化的。如果 FName 和 LName 用于学生,则应将它们保存在具有 StudentId 主键的单独学生表中。
  • StudentId 可能不应该在教师表中。如果你想存储哪些学生在哪个时期,你应该使用一个多对多关系的标准连接表。例如,您可以将其称为“PeriodStudent”,它将存储 StudentId 和 PeriodId。

花点时间了解数据库规范化概念,例如第一、第二和第三范式。如果您不遵守基本的规范化原则,那么您就是在寻求未来的重大问题,而这些问题在以后修复的成本将非常高。

于 2012-04-04T20:49:45.830 回答