請大神幫我看看,怎么才能解決。
Protected Sub LoginButton_Click(sender As Object, e As EventArgs)
Dim Usernaem As String = Login1.UserName
Dim password As String = Login1.Password
Dim dates As String = System.DateTime.Now.ToString("yyyyMMdd")
Dim time As String = TimeOfDay
Dim count As Integer
cn = New SqlClient.SqlConnection(cnstr)
cn.Open()
Dim sqls As String = "select * from users where accounts='" & Usernaem.Trim & "' and password='" & password & "'"
cm = New SqlClient.SqlCommand(sqls, cn)
cm.CommandText = sqls
myreader = cm.ExecuteReader
myreader.Read()
cm.Connection = cn
count = cm.ExecuteScalar
Dim name As String = myreader("name")
myreader.Close()
If count > 0 Then
' Dim names As String = myreader.GetString(1).Trim
Dim sql As String = "insert into log (userid , name , 登錄日期 , 登錄時間 ) values('" & Usernaem & "','" & name & "','" & dates & "' , '" & time & "')"
da = New SqlClient.SqlDataAdapter(sql, cn)
ds = New DataSet(sql)
da.Fill(ds, "log")
If password = "123456@2018" Then
MsgBox("請先修改密碼", vbSystemModal + MsgBoxStyle.OkOnly)
Server.Transfer("修改密碼.aspx")
Else
Server.Transfer("webform1.aspx")
End If
Else
MsgBox("用戶名或密碼錯誤!")
End If
End Sub
End Class
uj5u.com熱心網友回復:
你的問題發錯版了,專案是.Net的。總的看下來,感覺你對資料庫操作這塊一點概念都沒有,對webform也沒有了解過。
代碼里問題有點多,資料庫操作這塊,建議重新找幾個示例,仔細區分一下 SqlCommand獲取資料的不同用法(Reader物件讀取、SqlDataAdapter物件填充),也可以先簡單參考一下我的Demo,里面涉及到了查詢和插入;WEB這塊,需要清楚地區分前端和后臺,并且建議學習一下MVC,webform是已經淘汰了很多年的技術,如果是老專案已經在用WebForm,那就先隨便找一本教材把WebForm過一遍,它和WinForm的語法沒有區別,但是在命名空間、運行機制上區別很大。
Protected Sub LoginButton_Click(sender As Object, e As EventArgs)
Dim Usernaem As String = Login1.UserName
Dim password As String = Login1.Password
Dim dates As String = System.DateTime.Now.ToString("yyyyMMdd")
Dim time As String = TimeOfDay
Dim count As Integer
cn = New SqlClient.SqlConnection(cnstr)
cn.Open()
Dim sqls As String = "select * from users where accounts='" & Usernaem.Trim & "' and password='" & password & "'"
'sqlcommand可以重復使用:cm.CommandText="SQL陳述句";
'此句已經指定了cm的Connection為cn,下面那句cm.Connection = cn 是多余的;
'此句已經指定了cm的查詢陳述句是 sqls,下面那句cm.CommandText = sqls 也是多余的。
cm = New SqlClient.SqlCommand(sqls, cn)
'這句是多余的,在定義cm的時候,已經指定了它的CommandText
cm.CommandText = sqls
myreader = cm.ExecuteReader
myreader.Read()
'這句是多余的,在定義cm的時候,已經指定了它的Connection
cm.Connection = cn
'count取不到值,按你的邏輯,用count來取記錄條數,但是ExecuteScalar取到是查詢結果里,第一條記錄的第一個欄位的值。
'count正確取值需要將sql改為 "SELECT COUNT(1) FROM ……",SQL執行結果是個integer,這才能按你的邏輯取到正確的值。
count = cm.ExecuteScalar
Dim name As String = myreader("name")
myreader.Close()
If count > 0 Then
' Dim names As String = myreader.GetString(1).Trim
Dim sql As String = "insert into log (userid , name , 登錄日期 , 登錄時間 ) values('" & Usernaem & "','" & name & "','" & dates & "' , '" & time & "')"
' SQLDATAADAPTER一般用來取資料,如果是執行一條sql,直接cm.CommandText="SQL陳述句", cm.ExecuteNonQuery(),后面這句回傳一個integer,代表影響的sql條數
da = New SqlClient.SqlDataAdapter(sql, cn)
ds = New DataSet(sql)
da.Fill(ds, "log")
If password = "123456@2018" Then
'看你的代碼是webform開發?webform里的msgbox沒有意義,因為你寫的所有代碼都是在服務器上執
'行的,客戶端根本看不到,正確的做法是生成前端js來alert報警訊息
MsgBox("請先修改密碼", vbSystemModal + MsgBoxStyle.OkOnly)
Server.Transfer("修改密碼.aspx")
Else
Server.Transfer("webform1.aspx")
End If
Else
MsgBox("用戶名或密碼錯誤!")
End If
End Sub
Sub Demo()
Dim count As Integer
Dim cn As New SqlClient.SqlConnection(cnstr)
Dim cm As New SqlClient.SqlCommand(sqls, cn)
Dim da As New SqlClient.SqlDataAdapter()
Dim dt As New DataTable()
'你的sql有一個致命的問題,防不了注入,如果需要拼SQL,請使用引數化查詢
'而且保存密碼的時候,一般用Md5(如果更安全一點,可以用加鹽的md5)來存盤,不會明文存,
'否則被脫庫的話,危害會非常大
Dim sqls As String = "select * from users where accounts='" & Usernaem.Trim & "' and password='" & password & "'"
cn.Open()
'執行SQL的時候
'要么用SqlDataReader讀取(查)
'要么用ExecuteNonQuery()直接執行(增刪改)
'要么用ExecuteScalar()直接取第一行第一列(查)
'要么用SqlDataAdapter去填充一個DataSet或者DataTable(查)
da.SelectCommand(cm)'為SqlDataAdapter系結SqlCommand物件
'將SqlCommand的執行結果填充到資料表物件dt里,dt的Rows就是DataRow物件的集合,一個DataRow物件就是一條SQL記錄;
'dt.Rows(i)可以取第i個DataRow物件,取到DataRow以后,用列名或者列序號可以取指定列的值。
da.Fill(dt)
If dt.Rows.Count>0 Then
cmd.CommandText = "insert into log (userid , name , 登錄日期 , 登錄時間 ) values('" & Usernaem & "','" & name & "','" & dates & "' , '" & time & "')";
Dim ret As Integer= cmd.ExecuteNonQuery() '這兒可以根據ret的結果來判斷執行成功沒有
'根據對應的user和pass能查到結果
If dt.Rows(0)("password")="123456@2018" Then
'需要修改密碼
Else
'不需要修改密碼,直接登錄成功
End If
Else
'根據對應的user和pass查不到結果,結果集為空
End If
End Sub
End Class
uj5u.com熱心網友回復:

這里有錯誤提示,Name變數怎么定義,還有da.SelectCommand(sqls, cm) 這條也提示屬性訪問必須分配給屬性或使用屬性值
uj5u.com熱心網友回復:
感覺你是拿到代碼就粘啊。粘之前先讀一讀啊。而且粘還粘錯了。拿到代碼不先消化一下,直接就往上套,套100回你得問100回。
uj5u.com熱心網友回復:
好的,我先學習學習轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/43624.html
上一篇:vb.net 獲取第三方表單的控制元件TPanel中的內容
下一篇:VB 實作TCP/IP通信
