【问题标题】:converting sql command query to stored procedure in VB.net将sql命令查询转换为VB.net中的存储过程
【发布时间】:2014-05-21 06:59:05
【问题描述】:

大家好,我当前的系统有问题。

在我的表单中使用此查询一切正常。

Private Sub btnsearch_Click(sender As Object, e As EventArgs) Handles btnsearch.Click





    'Dim connstr As String = "server=midtelephone\sqlexpress; database=testdb; user= sa; password=sa;"
    Dim cmdconn2 = New SqlConnection
    cmdconn2 = New SqlConnection
    cmd = New SqlCommand
    cmdconn2.ConnectionString = sqlstr
    cmd.Connection = cmdconn2
    cmdconn2.Open()


    If CheckForText1() = False Then
        MessageBox.Show("Cannot search with an empty value!")
        frmVetsearch.Dispose()
        Exit Sub
    Else

        cmd.CommandText = "select a.lname, a.fname, a.mi, a.vdms_no, b.lname, b.fname, b.mi, b.CLAIM_NO, c.ADDRESS1, c.ADDRESS2, c.ADDRESS3, c.sex, c.SCHOOL, c.C_YEAR, c.COURSE," & _
                          "c.telephone_no, c.mobile_no, c.email_add, c.EFFECTIVITY_DATE, c.SCC_NO, c.MLIST_NO, c.CATEGORY, c.DATE_FILED, c.relation_to_veteran, c.ENTITLEMENT_AWARD," & _
                          "c.REMARKS, c.UPDATED_BY, c.D_UPDATED from carlos.claims_veteran a left join carlos.claims_waivee b on a.vdms_no = b.vdms_no left join tobee.EBD_SCHBILLS c " & _
                          "on b.claim_no = c.CLAIM_NO where a.lname like '" + txtLname.Text + "%' and a.fname like '%" + txtFname.Text + "%' and a.mi like '%" + txtMi.Text + "%' " & _
                          "and a.VDMS_no like '" + txtVDMSNo.Text + "%'"


        btnsearch.Enabled = False
        btnSearchStud.Enabled = False


        frmVetsearch.ShowDialog()
        cmdconn.Close()

    End If

End Sub

现在,我正在尝试通过将此查询转换为存储过程来改进我的系统。 有没有可能我能做那件事。如果有的话,请给我一个指南或解决方案吗?提前致谢:)

【问题讨论】:

  • 第一步:使用参数化查询,而不是将您的 SQL 连接在一起!这将保护您的应用免受 SQL 注入攻击,并提高您的性能。然后:您期望将其转换为存储过程有什么好处?正确参数化的查询和存储过程一样好,速度一样快......您想通过转换为存储过程来实现什么?
  • 好吧,你知道存储过程。是除了形式.. 其中。您可以随时编辑查询而无需重新编译表单。

标签: vb.net stored-procedures sqlcommand


【解决方案1】:

首先你需要使用你的Sql Server Management Studio或者你在Visual Studio中的Server Explorer窗口create the stored procedure

CREATE PROCEDURE SelectClaims
(
     @fname nvarchar(max), 
     @lname nvarchar(max), 
     @mi nvarchar(max), 
     @vdms nvarchar(max)
)
as

select 
    a.lname, a.fname, a.mi, a.vdms_no, b.lname, b.fname, b.mi, b.CLAIM_NO, 
    c.ADDRESS1, c.ADDRESS2, c.ADDRESS3, c.sex, c.SCHOOL, c.C_YEAR, c.COURSE,
    c.telephone_no, c.mobile_no, c.email_add, c.EFFECTIVITY_DATE, c.SCC_NO, c.MLIST_NO, 
    c.CATEGORY, c.DATE_FILED, c.relation_to_veteran, c.ENTITLEMENT_AWARD,
    c.REMARKS, c.UPDATED_BY, c.D_UPDATED 
from carlos.claims_veteran a left join carlos.claims_waivee b on a.vdms_no = b.vdms_no 
                             left join tobee.EBD_SCHBILLS c On b.claim_no = c.CLAIM_NO 
where a.lname like @lname and a.fname like @fname and a.mi like @mi and a.VDMS_no like @vdms

如您所见,此 sp 接收 4 个参数,所有类型均为 nvarchar,我已将它们的大小设置为最大可能值(您应该将此值微调为相关字段的有效大小)

然后在 VB.NET 中使用此代码调用此 SP

If CheckForText1() = False Then
    MessageBox.Show("Cannot search with an empty value!")
    frmVetsearch.Dispose()
    Exit Sub
Else
    Using cmdconn2 = New SqlConnection(sqlstr)
    Using cmd = New SqlCommand("SelectClaims", cmdconn2)
        cmdconn2.Open()
        cmd.Parameters.AddWithValue("@lname", txtLname.Text & "%")
        cmd.Parameters.AddWithValue("@fname", "%" & txtFname.Text & "%"
        cmd.Parameters.AddWithValue("@mi", "%" & txtMi.Text & "%"
        cmd.Parameters.AddWithValue("@vdms", txtVDMSNo.Text & "%"
        cmd.CommandType = CommandType.StoredProcedure

        .... you are missing the code that read back your values
        Using reader = cmd.ExecuteReader()
             .......
        End Using

    End Using
    End Using
End If

这里最重要的是

  • CommandType 设置为CommandType.StoredProcedure 以允许 正确处理 CommandText 设置为存储的名称 过程而不是 sql 语句。
  • 添加了需要传递给存储过程的每个值 使用 AddWithValue 到 SqlCommand 的参数集合。 但是,如果您确实需要尽可能获得最大性能 您应该构建每个参数并指定其大小和类型
  • 每个一次性对象(SqlConnection、SqlCommand、SqlDataReader) 包含在 using 语句中,以确保正确关闭和 在异常情况下也进行处理

不过,我希望警告您使用这种方法。在这样的选择中,使用存储过程,相对于适当的参数化查询没有明显的优势。从我的角度来看,我发现使用和维护大量存储过程很容易成为真正的维护噩梦。

例如,假设您的程序的新版本需要检索一个新字段。
现在您需要更新您的代码和存储过程。并且不要忘记,在某些环境中,您需要请求专门人员 (A DBA) 的帮助才能对生产中的数据库进行任何更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-21
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2015-11-30
    • 2016-09-10
    相关资源
    最近更新 更多