非常简单的表单,就像我为内部工具创建的其他十几个表单一样,但是这个表单返回了错误“OleDbParameter with ParameterName '@lookup‘并不包含在这个OleDbParameterCollection中。”
唯一的区别,这可能是关键,但我恐怕我不知道答案,是连接字符串。我一直在Windows2008 R2服务器上使用SQL 2008服务器,因此我的连接字符串在Visual 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>因此,由于我从未见过此错误,我想知道我所使用的代码是否由于某种原因而无法使用oledb连接。违规的代码在代码隐藏中:
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查询中的参数更改为问号,不转。在这一点上,我没有收到任何错误或信息。在我的server跟踪中,它根本没有击中SQL服务器。只是什么都没做。
在我的一些变体中,它实际上给出了数据类型不匹配的错误,但我始终无法找到如何将textbox值更改为适合OleDbType的数据类型。
发布于 2014-06-12 20:04:53
根据您的更新,我怀疑您非常接近做正确的事情。您面临的主要问题是,您使用的是OLE提供程序,它在查询中不支持命名参数。相反,您必须使用位置参数,并以正确的顺序显式地指定它们,作为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参数化查询就是这样工作的,所以这应该是您所需要的。如果没有,请用试验结果更新您的问题。
有关更多信息,请参见:
http://msdn.microsoft.com/enus/library/vstudio/z72eefad(v=vs.100).aspx
https://stackoverflow.com/questions/24172515
复制相似问题