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ではselect * from teacherがあります

于 2012-04-04T20:55:41.090 に答える
0

スキーマにいくつか問題があります。

  • さまざまな ID は、varchar ではなく整数である必要があります。
  • 教師テーブルには、FName、LName、および TeacherName があります。これは正規化されていません。FName と LName が生徒用の場合、それらは StudentId プライマリ キーを持つ個別の Student テーブルに保持する必要があります。
  • StudentId は、おそらく Teacher テーブルにあるべきではありません。どの学生がどの時期にいるかを保存したい場合は、多対多の標準である結合テーブルを使用する必要があります。たとえば、「PeriodStudent」と呼ぶことができ、StudentId と PeriodId を格納します。

第 1 正規形、第 2 正規形、第 3 正規形などの DB 正規化の概念を時間をかけて理解してください。基本的な正規化の原則に従わない場合、将来的に大きな問題が発生することになり、これらの問題を後で修正するには非常に費用がかかります。

于 2012-04-04T20:49:45.830 に答える
0

sproc でパラメーターを「@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 に答える