带有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的正确类型的数据。
根据你的更新,我怀疑你非常接近做正确的事情。您遇到的主要问题是您正在使用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