none
必須宣告純量變數 RRS feed

  • 問題

  • 請問各位大大,我在寫查詢頁面,當我查詢一個選項時會查詢成功,兩個以上就會查詢失敗,

    錯誤類似以下內容 必須宣告純量變數 "@DdlQUnitPPBName" 必須宣告純量變數 "@DdlQTypeTypeDetail"

    求解?

        Private ConnectString As String = ""
        Private SqlCM As SqlCommand
        Private SqlDR As SqlDataReader
        Private SqlDA As SqlDataAdapter
        Private SqlDS As DataSet
        Private sql As String = ""
        Private javascript As String = ""
        Private PowerValue As Integer

    查詢button如下

     Protected Sub ButQuery_Click(sender As Object, e As EventArgs) Handles ButQuery.Click
            Using SqlCN As New SqlConnection(ConnectString)
                SqlCN.Open()
                SetGridView1(SqlCN)
            End Using
        End Sub

    查詢方法:

        Private Sub SetGridView1(ByRef cn As SqlConnection)

                sql = "select CaseID,convert(varchar, Start, 111) +'~'+ convert(varchar, stop, 111) as stastoCT,SLocation, LBName,Addtownship,PPBName,Factory from ApplData where CaseID <> ''"
                SqlDA = New SqlDataAdapter(sql, cn)
                If DdlQType.SelectedValue <> "" And DdlQType.SelectedValue <> "【不拘】" Then
                    sql += " and TypeDetail = @DdlQTypeTypeDetail "
                    SqlDA = New SqlDataAdapter(sql, cn)

                    SqlDA.SelectCommand.Parameters.Add("@DdlQTypeTypeDetail", SqlDbType.NVarChar)
                    SqlDA.SelectCommand.Parameters("@DdlQTypeTypeDetail").Value = DdlQType.SelectedValue
                End If
                If DdlQUnit.SelectedItem.Text <> "" And DdlQUnit.SelectedItem.Text <> "【不拘】" Then
                    sql += " and PPBName = @DdlQUnitPPBName "
                    SqlDA = New SqlDataAdapter(sql, cn)

                    SqlDA.SelectCommand.Parameters.Add("@DdlQUnitPPBName", SqlDbType.NVarChar)
                    SqlDA.SelectCommand.Parameters("@DdlQUnitPPBName").Value = DdlQUnit.SelectedItem.Text
                End If
                If TxtQDate0.Text <> "" And TxtQDate1.Text <> "" Then
                    sql += " and Start<= @StartTxtQDate0 and stop >= @stopTxtQDate1 "
                    SqlDA = New SqlDataAdapter(sql, cn)

                    SqlDA.SelectCommand.Parameters.Add("@StartTxtQDate0", SqlDbType.NVarChar).Value = TxtQDate0.Text
                    SqlDA.SelectCommand.Parameters("@StartTxtQDate0").Value = TxtQDate0.Text
                    SqlDA.SelectCommand.Parameters.Add("@stopTxtQDate1", SqlDbType.NVarChar).Value = TxtQDate1.Text
                    SqlDA.SelectCommand.Parameters("@stopTxtQDate1").Value = TxtQDate1.Text
                End If
                If TxtQName.Text <> "" Then
                    sql += "  and SLocation  Like @SLocationTxtQName or LBName like @SLocationTxtQName  OR Addtownship like @SLocationTxtQName or ppbname like @SLocationTxtQName   or Factory like @SLocationTxtQName "
                    SqlDA = New SqlDataAdapter(sql, cn)

                    SqlDA.SelectCommand.Parameters.Add("@SLocationTxtQName", SqlDbType.NVarChar)
                    SqlDA.SelectCommand.Parameters("@SLocationTxtQName").Value = "%" + TxtQName.Text + "%"
                End If

                SqlDS = New DataSet
                SqlDA.Fill(SqlDS, "ResultData")
                SqlDA.Dispose()
                Me.Session("dv") = SqlDS.Tables("ResultData").DefaultView


                GridView1.Visible = True
                GridView1.PageIndex = 0
                GridView1.SelectedIndex = -1
                GridView1.DataSource = Me.Session("dv")

                GridView1.DataBind()






        End Sub

    介面如下:

      <asp:GridView ID="GridView1" runat="server" Width="100%" AutoGenerateColumns="False" CellPadding="3" AllowSorting="true" CssClass="GridView_B" DataKeyNames="CaseID" AllowPaging="True">
                                    <Columns>
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" HeaderText="項次" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="CaseID" HeaderText="案件編號" SortExpression="CaseID" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="stastoCT" HeaderText="路證時間" SortExpression="stastoCT" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="SLocation" HeaderText="施工路段" SortExpression="SLocation" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="LBName" HeaderText="路權單位" SortExpression="LBName" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="Addtownship" HeaderText="行政區" SortExpression="Addtownship" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="PPBName" HeaderText="申請單位" SortExpression="PPBName" ItemStyle-HorizontalAlign="Left" />
                                        <asp:BoundField HtmlEncode="true" ReadOnly="true" DataField="Factory" HeaderText="施工廠商" SortExpression="Factory" ItemStyle-HorizontalAlign="Left" />
                                        <asp:TemplateField HeaderText="開工通報" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="攝影機編號" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="監工人員" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="施工人員" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="CLSM" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="路面平整度" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="逾時通報" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                                                            <asp:TemplateField HeaderText="收工通報" >
                                       <ItemStyle HorizontalAlign="Center" />
                                       </asp:TemplateField>
                                    </Columns>
                                    <HeaderStyle CssClass="GridView_B_HeaderStyle" />
                                    <RowStyle CssClass="GridView_B_RowStyle" />
                                    <AlternatingRowStyle CssClass="GridView_B_AlternatingRowStyle" />
                                    <PagerStyle CssClass="GridView_B_PagerStyle" HorizontalAlign="Right" />
                                    <FooterStyle CssClass="GridView_B_FooterStyle" />
                                </asp:GridView>

    2017年6月27日 上午 04:02

解答

  • 我猜應該是你每個判斷都從新 New SqlDataAdapter 

    導致你多個條件的時候,Sql 串了,但是前面的 Parameters 都被 Reset了,導致 sql句多了些未宣告的Parameter

    你嘗試往下圖的方向去改改看

    • 已標示為解答 Eden Knight 2017年6月27日 上午 05:48
    2017年6月27日 上午 04:32
  • 請仔細檢視你 SQL 的組法這樣在兩個條件以上時會發生什麼事吧。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 Eden Knight 2017年6月27日 上午 05:48
    • 已取消標示為解答 Eden Knight 2017年6月27日 上午 05:49
    • 已標示為解答 Eden Knight 2017年7月7日 上午 02:39
    2017年6月27日 上午 04:52
    版主

所有回覆

  • 我猜應該是你每個判斷都從新 New SqlDataAdapter 

    導致你多個條件的時候,Sql 串了,但是前面的 Parameters 都被 Reset了,導致 sql句多了些未宣告的Parameter

    你嘗試往下圖的方向去改改看

    • 已標示為解答 Eden Knight 2017年6月27日 上午 05:48
    2017年6月27日 上午 04:32
  • 請仔細檢視你 SQL 的組法這樣在兩個條件以上時會發生什麼事吧。

    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 Eden Knight 2017年6月27日 上午 05:48
    • 已取消標示為解答 Eden Knight 2017年6月27日 上午 05:49
    • 已標示為解答 Eden Knight 2017年7月7日 上午 02:39
    2017年6月27日 上午 04:52
    版主
  • 根據該圖SqlDA做修正 已解決問題 謝謝Coding Kid Peter Chang大
    2017年6月27日 上午 05:53