我目前正在嘗試使用 vb.net 為 IMS(庫存管理系統)撰寫材料預訂模塊。這是我已經完成的代碼部分
Public Class frmINBKG
Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
Me.Close()
End Sub
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
Call ClearDetails()
End Sub
Private Function SaveRecord() As Boolean
Dim strSQL As String
strSQL = "INSERT INTO INBKG_TBL ("
strSQL &= "INBKG_BKGID, INBKG_BKGDT, INBKG_USRID, INBKG_MATCD, "
strSQL &= "INBKG_BKGQT, INBKG_STSFG) "
strSQL &= "VALUES ('" & txtBKGID.Text & "', '" & gfSQLDate(dtBKGDT.Value) & "', '" & txtUSRID.Text & "', '" & txtBKGMAT.Text & "', "
strSQL &= "" & numBKGQT.Value & ", '1')"
Call DBExecute(strSQL)
End Function
Private Sub ClearDetails()
txtBKGID.Text = String.Empty
dtBKGDT.Value = Date.Today
txtUSRID.Text = String.Empty
txtBKGMAT.Text = String.Empty
numBKGQT.Value = 0
numRECID.Value = 0
End Sub
Private Sub RefreshGrid()
Dim strSQL As String
Dim dt As DataTable
Dim i As Integer
strSQL = "SELECT INBKG_BKGID, INBKG_BKGDT, INBKG_USRID, INBKG_MATCD, "
strSQL &= "INBKG_BKGQT, INBKG_STSFG "
strSQL &= "FROM INBKG_TBL "
strSQL &= "WHERE INBKG_STSFG IN ('1', '2')"
dt = ExecProc(strSQL)
*show grid
End Sub
Private Sub frmINEADJ_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
Dim blnChildFormExists As Boolean
For Each ChildForm As Form In Me.ParentForm.MdiChildren
If ChildForm.Name <> Me.Name Then
blnChildFormExists = True
Exit For
End If
Next
If Not blnChildFormExists Then Me.ParentForm.Controls("Panel1").Visible = True
End Sub
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
Call SaveRecord()
Call RefreshGrid()
End Sub
Private Sub btnRefresh_Click(sender As Object, e As EventArgs) Handles btnRefresh.Click
Call RefreshGrid()
End Sub
End Class
*show 網格線是我想有一個代碼的地方,允許我在資料網格視圖上顯示任何保存的資料。我是 vb.net 的新手,所以我被告知要參考其他模塊的示例,但其中大多數不是我需要的或不兼容的。我目前正在使用 Visual Studio 2019 和 Microsoft SQL Server Management Studio,感謝您提供任何答案或建議。
uj5u.com熱心網友回復:
剛剛復位DataSource的DataGridView。INBKG_STSFG 真的是資料庫中的字串欄位嗎?
Private Sub RefreshGrid()
Dim strSQL = "SELECT INBKG_BKGID, INBKG_BKGDT, INBKG_USRID, INBKG_MATCD, INBKG_BKGQT, INBKG_STSFG
FROM INBKG_TBL
WHERE INBKG_STSFG IN ('1', '2');"
Dim dt = ExecProc(strSQL) 'I assume this method returns a DataTable
DataGridView1.DataSource = Nothing
DataGridView1.DataSource = dt
End Sub
你真正的問題是SaveRecord(). 這種方法存在sql注入的高風險。當您將來自用戶輸入的字串連接到 sql 字串中時,服務器可以執行該輸入。假設用戶在文本框中輸入“Drop table”?始終使用Parameters. 引數的值不被服務器認為是可執行的。
vb.net 中的函式需要具有Return與型別匹配的值的陳述句。
BTW,你只需要Call在非常特殊的情況下使用。不在這段代碼中。
Private Function SaveRecord() As Boolean
Dim RetVal As Integer
Dim strSQL = "INSERT INTO INBKG_TBL (INBKG_BKGID, INBKG_BKGDT, INBKG_USRID, INBKG_MATCD, INBKG_BKGQT, INBKG_STSFG)
VALUES(@ID, @Date, @USRID, @MAT, @QT, @STSFG);"
Using cn As New SqlConnection("Your connection String"),
cmd As New SqlCommand(strSQL, cn)
With cmd.Parameters
.Add("@ID", SqlDbType.VarChar).Value = txtBKGID.Text
.Add("@Date", SqlDbType.Date).Value = gfSQLDate(dtBKGDT).Value
.Add("@USRID", SqlDbType.VarChar).Value = txtUSRID.Text
.Add("@MAT", SqlDbType.VarChar).Value = txtBKGMAT.Text
.Add("@QT", SqlDbType.Int).Value = CInt(numBKGQT.Value)
.Add("@STSFG", SqlDbType.Int).Value = 1
End With
cn.Open()
RetVal = cmd.ExecuteNonQuery
End Using
If RetVal = 1 Then
Return True
End If
Return False
End Function
我不得不猜測欄位的資料型別。通常 ID 欄位是數字,因此您需要檢查所有資料型別并在必要時將值轉換為適當的型別。如果 INBKG_BKGID 是身份欄位,則不會將其包含在欄位串列中或為其設定引數。服務器將提供它。
uj5u.com熱心網友回復:
我的建議是使用物體框架(工具 -> 管理 NuGet 包 -> 管理 NuGet 包作為解決方案。6.4.4 應該是最新版本)。物體將您的資料庫表視為類。我給你舉個例子
'Create your entity object
Dim context as New MyProjectEntity
'Query
Dim myGridviewDataSource = context.myTable.Tolist
Me.gridview1.Properties.DataSource = myGridviewDataSource
這是一個簡單的例子。您的 gridview 將在標題中包含 myTable 的列名,資料將自動顯示,ID 列將被隱藏。您最終可以從設計器視窗 (SHIFT F7) 設定列。這真的很好,因為您可以簡單地使用 lambda 運算式進行查詢。假設您有一個名為 Students 的表和一個名為 studentName 的列,并且您只想獲取 studentName = John 的學生。您可以像這樣簡單地查詢:
Dim myGridviewDataSource = context.Students.Where(function(x) x.Name.equals("John")).Tolist
此外,如果您有外鍵,只需在設計器視窗中運行,運行 gridview 設計器,然后在列 fieldname 中執行此操作。例如,對于每個學生,您都分配了一個教師,因此您將教師 ID 列作為學生中的外鍵,這是教師表的主鍵,但您想在網格視圖上查看教師的姓名。因此,在設計器視窗中,在針對教師姓名的列的欄位名稱上,您為其指定值
Teacher.teacherName
當然,teacherName 必須是 Teacher 表中列的名稱。請記住,您需要在 Microsoft SQL Server Management Studio 中指定外鍵!物體會做剩下的
uj5u.com熱心網友回復:
我會避免使用 DataTables 并創建一個具有代表表的屬性的物件類。將每個物件添加到 BindingList 并將其用作網格的資料源。當有任何變化時,網格會自動更新。
此外,為了避免 SQL 注入攻擊,請始終使用 SqlParameters。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362710.html
