【问题标题】:Issue with SQL Server Stored ProcedureSQL Server 存储过程的问题
【发布时间】:2012-04-18 14:39:57
【问题描述】:

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

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

存储过程:

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

【问题讨论】:

  • 您需要包含用于捕获 SP 结果的 VB 代码。
  • 您不想将“teacherid”传递给过程,然后在 sproc 中从“teacherid” = @teacherid 的“teacher”表中选择“period”吗?
  • 该数据是从您的存储过程中返回的吗?如果是这样,那么我们需要查看您的 vb.net 代码给您答案
  • “已选中”和“未选中”是什么意思?另外我会考虑将 Int 用于您的 Id 列而不是 varchar(10)。
  • Checked 和 Unchecked 指的是 ALLOW NULL 列,它是如何复制过来的。

标签: sql-server vb.net


【解决方案1】:

您已在存储过程中将参数定义为“@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()

【讨论】:

  • 我试过你的建议,但它死了。我收到一个异常错误:过程或函数“spGetPeriod”需要参数“@TeacherId”,但未提供。
  • 这是因为您在 VB 代码中注释掉了该行。您传递给参数的 selectedIndex 的值看起来也很可疑。
  • 我的错,在 Id 中需要小写“d”,尝试... WHERE TeacherId = @TeacherId 我还假设 cboTeacher.SelectedIndex 是 INT 而表中的 TeacherId 是 varchar 列,可能会检查那也是。
  • 我进行了更改,错误消失了,我只是没有得到任何信息的返回。
  • 您是否检查过您的查询是否返回了行?也许尝试将组合框的数据源绑定到阅读器,就像我在上面列出的那样......
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 2013-08-14
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多