2

アクセスデータベースにテーブルを作成する必要があります

ユーザー

  • ユーザーID
  • ユーザー名
  • ユーザーアクティブ

ユーザー情報

  • ユーザー情報
  • ユーザー実名
  • ユーザー電話

次に、いくつかの asp:text フィールドから更新ハンドラーへの情報を取得します。これを 1 つのテーブルに対して行う方法は知っていますが、2 つのテーブルに対しては行いません。

普段はこれを使っています

    Dim strSQL As String = ""
    strSQL = "" & _
    "UPDATE Userinfo " & _
    "SET userrealname = @therealname, userphone = @theuserphone " & _
    "WHERE userinfoid =" & Session("theeditid") & ""

    Using connection As OleDbConnection = New OleDbConnection(ConfigurationManager.ConnectionStrings("ConnStr").ConnectionString)
        Using updatecmd As OleDbCommand = New OleDbCommand(strSQL, connection)
            updatecmd.CommandType = CommandType.Text
            updatecmd.Parameters.AddWithValue("@therealname", OleDbType.VarChar).Value = TextBox1.Text
            updatecmd.Parameters.AddWithValue("@theuserphone", OleDbType.VarChar).Value = CKEditor1.Text
            Try
                updatecmd.Connection.Open()
                Dim i As Integer = CInt(updatecmd.ExecuteNonQuery())
                If i = 0 Then
                    Session("editsucces") = "NoMatch" 'no rows were updated because none matched the criteria
                End If
            Catch ex As Exception
                Session("editsucces") = "DBerror" 'Something went wrong, such as the database was unavailable
            End Try
        End Using
    End Using

だから私の質問は今、どうすればユーザーテーブルからフィールドを追加できますか!? user.userid は、userinfo.userinfoid と同じ番号です。

EDIT........EDIT........EDIT.......EDIT........EDIT........EDIT.. ........編集

だから、このコードは大丈夫ですか、それとも一部を変更することをお勧めします!?

Dim strSQL As String = ""
    strSQL = "" & _
    "UPDATE Users INNER JOIN Userinfo ON Users.UserID = Userinfo.UserID " & _
    "SET Users.Username = [@uname], Users.Password = [@upass], Users.UserActiv = [@uactiv], Userinfo.UserRealName = [@urname], Userinfo.UserEmail1 = [@umail], Userinfo.UserDOB = [@udob], Userinfo.UserPhone1 = [@uphone1], Userinfo.UserPhone2 = [@uphone2], Userinfo.UserPhone3 = [@uphone3], Userinfo.UserYear = [@uyear], Userinfo.UserSick = [@usick] " & _
    "WHERE Users.UserID = [@uid]"

    Using connection As OleDbConnection = New OleDbConnection(ConfigurationManager.ConnectionStrings("ConnStr").ConnectionString)
        Using updatecmd As OleDbCommand = New OleDbCommand(strSQL, connection)
            updatecmd.CommandType = CommandType.Text
            updatecmd.Parameters.AddWithValue("@uname", OleDbType.VarChar).Value = userinput1.Text
            updatecmd.Parameters.AddWithValue("@upass", OleDbType.VarChar).Value = userinput2.Text
            updatecmd.Parameters.AddWithValue("@uactiv", OleDbType.VarChar).Value = "Y"
            updatecmd.Parameters.AddWithValue("@urname", OleDbType.VarChar).Value = userinput3.Text
            updatecmd.Parameters.AddWithValue("@umail", OleDbType.VarChar).Value = userinput4.Text
            updatecmd.Parameters.AddWithValue("@udob", OleDbType.VarChar).Value = userinput5.Text
            updatecmd.Parameters.AddWithValue("@uphone1", OleDbType.VarChar).Value = userinput6.Text
            updatecmd.Parameters.AddWithValue("@uphone2", OleDbType.VarChar).Value = userinput7.Text
            updatecmd.Parameters.AddWithValue("@uphone3", OleDbType.VarChar).Value = userinput8.Text
            updatecmd.Parameters.AddWithValue("@uyear", OleDbType.VarChar).Value = userinput9.Text
            updatecmd.Parameters.AddWithValue("@usick", OleDbType.VarChar).Value = usertextarea.Text
            Try
                updatecmd.Connection.Open()
                Dim i As Integer = CInt(updatecmd.ExecuteNonQuery())
                If i = 0 Then
                    Session("editsucces") = "NoMatch" 'no rows were updated because none matched the criteria
                End If
            Catch ex As Exception
                Session("editsucces") = "DBerror" 'Something went wrong, such as the database was unavailable
            End Try
        End Using
    End Using

    Response.Redirect("default.aspx", False)
4

3 に答える 3

1

両方のテーブルを更新するための結合を作成できるはずです。例えば:

sSQL = "UPDATE [User] INNER JOIN userinfo " _
& "ON User.UserID = userinfo.userinfoid SET " _
& "[User].UserName = [uname], userinfo.userrealname = [urname] " _
& "WHERE [User].UserID = [uid]"

cmd.ActiveConnection = cn
cmd.CommandText = sSQL
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter( _
    "uname", adVarChar, adParamInput, 50, "user name")
cmd.Parameters.Append cmd.CreateParameter( _
    "urname", adVarChar, adParamInput, 50, "user real name")
cmd.Parameters.Append cmd.CreateParameter( _
    "uid", adInteger, adParamInput, , 2)
cmd.Execute
于 2012-08-24T09:58:54.837 に答える
1

トランザクションを使用する必要があります。データベースの多くの変更をアトミックに行うのが一般的なアプローチです。あなたの場合の良い例http://www.dreamincode.net/forums/topic/186402-transaction-on-access-database-adonet/

Using con As New OleDbConnection(ConfigurationManager.ConnectionStrings("ConnStr").ConnectionString)
  Dim cmd As New OleDbCommand("", con)
  Dim tra As OleDbTransaction = Nothing
  Dim ct1 As String = ""
  Dim ct2 As String = ""

  Try
    con.Open()
    tra = con.BeginTransaction
    cmd.Transaction = tra

    strSQL = "" & _
    "UPDATE User " & _
    ' set fields needed to update in table USER
    "WHERE userid =" & Session("theeditid") & ""
    cmd.CommandText = strSQL
    ' set parameters for user update
    cmd.ExecuteNonQuery()

    strSQL = "" & _
    "UPDATE Userinfo " & _
    "SET userrealname = @therealname, userphone = @theuserphone " & _
    "WHERE userinfoid =" & Session("theeditid") & ""
    cmd.CommandText = strSQL
    cmd.Parameters.Clear()

    ' set parameters for userinfo update
    cmd.ExecuteNonQuery()

    ' Complete transacton
    tra.Commit()

    ' i think here should be closing cmd

    Catch ex As Exception
      MsgBox("The data could not be saved.", MsgBoxStyle.Critical, "Error")
      Try : tra.Rollback() : Catch : End Try
    End Try
End Using
于 2012-08-24T14:29:11.360 に答える
1

理解されていることから、user と userinfo テーブルの間には 1 対 1 の対応があると思います。(user.userid は userinfo.userinfoid と同じであり、それぞれのテーブルの主キーのように見えます)。したがって、2 つのテーブルを 1 つのテーブルにマージする必要があります。

ここで、2 つのテーブルの列を更新する場合は、テーブルごとに 1 つずつ、2 つの更新ステートメントを実行します。原子性を確保したい場合は、1 つのトランザクションで 2 つの更新ステートメントを実行します。これは理にかなっていますか、それとも何か不足していますか?

于 2012-08-24T09:50:03.960 に答える