问题描述
这是我的新手,但我正在尝试为我的公司创建数据库的Web应用程序,以简化我们的某些IT流程。我当前正在为新用户创建一个过程,该过程涉及输入员工用户名,名字,姓氏,部门和工作角色,然后单击添加用户按钮以将其添加到数据库。使用以下代码,一切正常:
Dim con As New System.Data.sqlClient.sqlConnection
Dim cmd As New System.Data.sqlClient.sqlCommand
con.ConnectionString = "Data Source=ID1350\sqlEXPRESS;Initial Catalog=IT Database;Integrated Security=True"
cmd = New Data.sqlClient.sqlCommand("Insert Into Emp values ('" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & DropDownList1.Text & "','" & DropDownList2.Text & "')",con)
If (TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "") Then
MsgBox("Please fill the fields")
Else
con.open()
cmd.ExecuteNonQuery()
con.Close()
MsgBox("Successfully Added",MsgBoxStyle.information,"Success")
End If
但是,现在,我希望工作角色下拉列表取决于上一个下拉列表中选择的部门。这样,我们就不必经历所有不同的工作角色。最简单的方法是什么?我曾尝试研究,但仍在努力。
谢谢!
解决方法
首先,强制性警告:
每当您接受用户输入时,您就不想对SQL使用内联字符串连接-这很危险,并且易于注入SQL。不要这样做。
好,接下来是层叠的组合框。
我们假设在页面加载时,您就可以加载第一个组合框。
DropDownList1.DataSource = Myrst("SELECT Department from tblDepartments ORDER BY DepartMent")
DropDownList1.DataBind()
DropDownList1.Items.Insert(0,New ListItem(""))
上面的注释:我还添加了一个空白行–这是可选的,但这将意味着组合框开始时是空白的。 (因此,是否需要则取决于您)
下一步: 您的两个下拉菜单(组合框)应以“通用”方式设置,第一列是PK ID,第二列是精美文字的显示。应该是用于良好的关系数据设置。
但是,您只使用文本值–放手吧。
因此将第一个组合框设置为自动回发= true(请不要忘记!!!)
在下拉式1索引更改事件中,我们具有以下要层叠的代码:
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object,e As EventArgs) Handles DropDownList1.SelectedIndexChanged
Dim cmdSQL As New SqlCommand("SELECT JobRole FROM tblJobRoles
WHERE Department = @Department ORDER BY JobRole")
cmdSQL.Parameters.Add("@Department",SqlDbType.NVarChar).Value = DropDownList1.Text
DropDownList2.DataSource = MyrstP(cmdSQL)
DropDownList2.DataBind()
DropDownList2.Items.Insert(0,New ListItem(""))
End Sub
再次,我有一个可选的选项,可以在组合中添加一个空白行–如果需要,这是您的选择。
并且在此期间,让我们用参数重新编写第一个示例,因为这只是一种很好的编码实践,而更好的是,我们可以进行数据输入,而我不必弄清楚:
For numbers – no quotes
For strings – surrounded with quotes
For dates – surround with quotes.
因此,使用参数可以获取上述所有规则的RID!
那么,“,”和“’”以及其他所有内容都那么长吗?很难阅读,很难维护,而且很容易出错。一个“”或“或”不正确,那么该代码将耗费大量时间。
此代码是几行额外的代码吗?
好吧,我输入第一个参数(添加),然后按ctrl-d 4次。那复制了代码,现在我只是向上/向下光标并将1更改为2,然后依此类推。因此,实际上,您要做的不是更多-实际上更少。结果更具可读性,但更重要的是FAR更易于编辑和维护。
所以,您会得到这样的东西:
Using cmd As New SqlCommand("Insert Into Emp values (@TB1,@TB2,@TB3,@Drop1,@Drop2")
cmd.Parameters.Add("@TB1",SqlDbType.NVarChar).Value = TextBox1.Value
cmd.Parameters.Add("@TB2",SqlDbType.NVarChar).Value = TextBox2.Value
cmd.Parameters.Add("@TB3",SqlDbType.NVarChar).Value = TextBox3.Value
cmd.Parameters.Add("@Drop1",SqlDbType.NVarChar).Value = DropDownList1.Text
cmd.Parameters.Add("@Drop2",SqlDbType.NVarChar).Value = DropDownList2.Text
cmd.Connection = New SqlConnection(GetConstr)
cmd.Connection.Open()
cmd.ExecuteNonQuery()
End Using
如果您需要/需要使用C#中的上述代码,请通过代码转换器运行上述代码。
拯救世界贫困。
因为在典型的应用程序中,您将要填充网格,组合框,并一遍又一遍地这样做?
然后构建一个2小助手例程。这将实现两个非常重要的目标:
首先,您不必一遍又一遍地编写相同的代码,从而节省了世界贫困。
下一步,这是最重要的:
您的连接字符串不是通用代码,并且只有一个位置。这样,您可以将整个应用程序指向一个不同的数据库,这在发布或从测试服务器更改为生产服务器时将是一个巨大的问题。
因此,该例程不仅节省了许多键入操作,而且更重要的是,您必须在整个应用程序中将连接字符串代码移至一个位置。不要到处都散布连接字符串-将来您会为之感到遗憾。
因此,您的更新代码现在变为:
我有3个辅助例程–我将它们放在所有应用程序中。
它们是:
Public Function Myrst(strSQL As String,Optional strCon As String = "") As DataTable
If strCon = "" Then
strCon = GetConstr()
End If
Dim rstData As New DataTable
Using cmdSQL As New SqlCommand(strSQL,New SqlConnection(strCon))
Try
cmdSQL.Connection.Open()
rstData.Load(cmdSQL.ExecuteReader)
Catch
rstData = Nothing
End Try
End Using
Return rstData
End Function
Public Function MyrstP(cmdSQL As SqlCommand,Optional strCon As String = "") As DataTable
If strCon = "" Then
strCon = GetConstr()
End If
Dim rstData As New DataTable
Using cmdSQL
Try
cmdSQL.Connection = New SqlConnection(strCon)
cmdSQL.Connection.Open()
rstData.Load(cmdSQL.ExecuteReader)
Catch
Debug.Print(Err.Description)
rstData = Nothing
End Try
End Using
Return rstData
End Function
Public Function GetConstr(Optional strPortal As String = "") As String
Return ConfigurationManager.ConnectionStrings("Test3").ConnectionString
End Function