带有ParameterName的OleDbParameter不包含在这个OleDbParameterCollection

本文关键字:OleDbParameterCollection 包含 ParameterName OleDbParameter 带有 | 更新日期: 2023-09-27 18:08:08

非常简单的形式,就像我为内部工具制作的其他十几种形式一样,但是这个形式会弹出错误"一个OleDbParameter与ParameterName '@lookup'不包含在这个OleDbParameterCollection中。"

唯一的区别,这可能是关键,但恐怕我不知道答案,是连接字符串。我一直在Windows 2008 R2服务器上使用SQL 2008服务器,所以我的连接字符串很容易在我的Visual Studio 2008中配置,如下所示:

<connectionStrings>
    <add name="DatasourceName" connectionString="server=servername;database=databasename;user=username;password=password;" providerName="System.Data.SqlClient"/>
</connectionStrings>

然而,我仍然使用VS 2008,但我连接到SQL 2012服务器为我的数据源,所以我不得不改变连接字符串为:

    <connectionStrings>
        <add name="server2012name" connectionString="Provider=SQLNCLI11.1;Data Source=ServerName;Persist Security Info=True;Password=password;User ID=userid;Initial Catalog=catalog"
        providerName="System.Data.OleDb" />
    </connectionStrings>

所以,因为我从来没有看到过这个错误,我想知道我使用的代码是否由于某种原因不能与旧连接一起工作。有问题的代码段在代码后面:

    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["@lookup"].Value = lookup.Text.ToString();
}

以下是ASPX代码:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:MyString %>" 
        ProviderName="<%$ ConnectionStrings:MyString.ProviderName %>" 
        SelectCommand="SELECT [Beneficiary First Name] AS firstname
                            ,[Beneficiary Last Name] AS lastname
                            ,[Beneficiary Date of Birth] AS dob
                            ,[Address Line 1] AS [address]
                            ,[Beneficiary Encounter Date] AS encdate
                            ,[Beneficiary Data Sharing Preference Code] AS shareprefcode
                            ,[Beneficiary Data Sharing Decision Mechanism Code] AS decmechcode
                            ,[Beneficiary Alcohol and Drug Treatment Data Sharing Mechanism Co] AS damechcode
                            ,[MRN]
                            ,[Beneficiary HICN] AS hicn
                       FROM [database].[dbo].[table]
                       WHERE [MRN] = @lookup"
           onselecting="SqlDataSource1_Selecting"
           >
         <SelectParameters>
             <asp:Parameter Name="lookup" />
         </SelectParameters>
         </asp:SqlDataSource>

我需要一些其他的组件包括吗?我是否使用不同的命令来添加该参数?

我在谷歌上搜索了几个小时,阅读了我找到的内容,但似乎没有一个与此有关。如果我把这个e.Command.Parameters行去掉,错误就会消失,但是查询不会返回任何东西。

非常感谢您的指导。

编辑不幸的是,这个问题似乎没有答案了。我将在这里多添加一点,以防有人知道这是怎么回事。

我一直在阅读有关OleDbParameters的所有内容,这似乎大致是正确的轨道。我已经将代码隐藏更改为大约50个变体:

    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    OleDbParameter fnParam = new OleDbParameter("@lookup", OleDbType.VarChar, 20);
    fnParam.Value = lookup.Text;
    e.Command.Parameters.Add(fnParam);
}

我已经设法越过原来的错误。我已经更改了ASPX以删除参数声明,不用了。我已经将SQL查询中的参数更改为问号,不用了。此时,我没有得到任何类型的错误或消息。在我的SQL Profiler跟踪中,它根本没有击中SQL服务器。它什么也没做。

在我的一些变化中,它实际上给了我数据类型不匹配的错误,但我从来没有弄清楚如何改变文本框值为OleDbType的正确类型的数据。

带有ParameterName的OleDbParameter不包含在这个OleDbParameterCollection

根据你的更新,我怀疑你非常接近做正确的事情。您遇到的主要问题是您正在使用OLE DB提供程序,该提供程序在其查询中不支持命名参数。相反,您必须使用位置参数,并以正确的顺序显式指定它们,作为ASP中适当参数集合的一部分。

应该是这样的:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:MyString %>" 
    ProviderName="System.Data.OleDb" 
    SelectCommand="SELECT list_of_columns
                   FROM [database].[dbo].[table]
                   WHERE column = ?"
    OnSelecting="SqlDataSource1_Selecting">
     <SelectParameters>
         <asp:Parameter Name="lookup" Type="Int32" />
     </SelectParameters>
 </asp:SqlDataSource>

protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["@lookup"].Value = 1234;
}

注意以下几点:

  • 查询中的参数只是一个'?'。这些是位置参数:它们将被您稍后定义的参数按顺序替换。
  • SelectParameters集合具有相同数量的条目,以相同的顺序,查询具有'?的占位符。在这种情况下,只有一个参数,但是如果您有多个参数,您将按顺序定义它们。如果你想多次使用相同的值,你仍然需要指定多个参数,并单独设置它们。
  • 用于在集合中查找参数的名称是您在SelectParameters集合中提供的名称,并添加"@"。
  • 据我所知,必须指定正确的参数类型。我一直都有,至少,它"对我有用"。

看起来,在某个时候,你尝试了这样的东西,但没有看到你尝试的每一次代码迭代,我不能确定。无论如何,这就是OLE DB参数化查询的工作方式,因此这应该是您所需要的。如果没有,请更新您的问题与此尝试的结果。

有关更多信息,请参见:

http://msdn.microsoft.com/enus/library/vstudio/z72eefad (v = vs.100) . aspx

相关文章:
  • 没有找到相关文章