首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >此OleDbParameter不包含带有ParameterName的OleDbParameterCollection。

此OleDbParameter不包含带有ParameterName的OleDbParameterCollection。
EN

Stack Overflow用户
提问于 2014-06-11 21:02:08
回答 1查看 1.7K关注 0票数 0

非常简单的表单,就像我为内部工具创建的其他十几个表单一样,但是这个表单返回了错误“OleDbParameter with ParameterName '@lookup‘并不包含在这个OleDbParameterCollection中。”

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

代码语言:javascript
复制
<connectionStrings>
    <add name="DatasourceName" connectionString="server=servername;database=databasename;user=username;password=password;" providerName="System.Data.SqlClient"/>
</connectionStrings>

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

代码语言:javascript
复制
    <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>

因此,由于我从未见过此错误,我想知道我所使用的代码是否由于某种原因而无法使用oledb连接。违规的代码在代码隐藏中:

代码语言:javascript
复制
    protected void SqlDataSource1_Selecting(object sender, SqlDataSourceSelectingEventArgs e)
{
    e.Command.Parameters["@lookup"].Value = lookup.Text.ToString();

}

以下是ASPX代码:

代码语言:javascript
复制
<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个变体:

代码语言:javascript
复制
    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查询中的参数更改为问号,不转。在这一点上,我没有收到任何错误或信息。在我的server跟踪中,它根本没有击中SQL服务器。只是什么都没做。

在我的一些变体中,它实际上给出了数据类型不匹配的错误,但我始终无法找到如何将textbox值更改为适合OleDbType的数据类型。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 20:04:53

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

它应该是这样的:

代码语言:javascript
复制
<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参数化查询就是这样工作的,所以这应该是您所需要的。如果没有,请用试验结果更新您的问题。

有关更多信息,请参见:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24172515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档