【发布时间】:2016-07-18 12:37:59
【问题描述】:
我正在开发一个 winform 应用程序,并且在我的 SQL Server 数据库中使用名为 [File] 的表。
我有一个表单,可以在名为 SearchName 的组合框中查看一些“[文件]”字段 fID 和 fName。 值的 fID 和显示的 fName。 SearchName Combobox 绑定到带有 fID、fName、fPhoneNumber、fBalance 的 dataadapter 填充表的数据集,因此我可以使用 fName 和 fID。
我还有一些文本框来添加新的“文件”数据,例如:fName、fAge、fNationality、fSex,带有一个保存按钮和另一个组合框,显示名为 “Source” 的内容。
当用户点击保存时,数据被保存到数据库中的表[文件]中,并且适配器再次填充。
数据集表适配器使用如下存储过程:
create proc [dbo].[ReadFileData](@fid int,@filter varchar(20))
as
begin
declare @f varchar(20)=@filter;
declare @id int =@fid;
if(@id=-1)
begin
if(@f='All')
select fID,fName,fPhoneNumbers,fBalance from [File]
else
if(@f='Blocked')
select fID,fName,fNotes,fBalance,fBlockDate,uFullName
from [File],[User] where fBlocked='True' and fBlocker=[uID]
order by fBlockDate desc
else
if(@f='nonBlocked')
select fID,fName,fPhoneNumbers,fBalance from [File] where fBlocked='False'
else
if(@f='notReady')
select fID,fName,fPhoneNumbers,fBalance from [File] where fAllTestsOK='False' and fBlocked='False'
else
if(@f='Ready')
select fID,fName,fPhoneNumbers,fBalance from [File] where fAllTestsOK='True' and fBlocked='False'
else
if(@f='NegBalanced')
select fID,fName,fPhoneNumbers,fBalance from [File] where fBalance<0
end
else
select f.fID,fName,fSex,fBirthDate,fPhoneNumbers,fAddress,fNationality,fNotes,fBalance,fBlocked,(select uFullName from [User] where uid=f.fBlocker) as fBlocker,
fLastEdited,(select uFullName from [User] where [uID]=f.fEditor) as fEditor, fBlockDate from [File] f where fID=@fid
end
再次保存和填充组合框花费了太多时间。我在 Internet 上进行了搜索,发现问题称为 “Patamter Sniffing/spoofing”,因为我的程序是根据它接收到的参数值来选择字段。我尝试了不同的方法来解决它,但对我来说没有任何效果。 (P.S. 我在其他表格上使用相同的 SP,数据立即填写,没有问题)。
我删除了整个数据集并使用新的存储过程创建了一个带有新数据适配器的新数据集,这个:
create proc [dbo].[GetAllFiles]
as
begin
select fID,fName,fPhoneNumbers,fBalance from [File]
end
现在第一次保存和填充很快就完成了,但之后大约需要 10 多秒才能完成。
我想知道如何继续使用数据适配器填充组合框并解决耗时问题? 如果您有任何可能导致此类问题的怀疑,请告诉我。 我可以提供哪些其他代码部分甚至设计图片来使我的问题更清楚?
【问题讨论】:
-
您可以使用 DataView 对已加载的数据应用过滤器,而不是再次运行查询以获取过滤器。
-
感谢您的回复,但我有一个以相同方式运行的整个项目。我在这个项目和其他项目中经常使用它。我想知道它有什么问题以及适配器需要这么长时间?
-
我也想使用适配器,因此我也可以将它用于查看 fID 的另一个组合框。
-
如果你用所有行填充数据表,你可以使用过滤器在这里和那里只显示其中的一些。您不必运行新查询并为过滤器或查找创建新结果集。
-
我正在尝试查看您在上一个存储过程中看到的所有行。我想重新填充它,因为当用户单击“保存”时,会添加一个新行或在 db 中编辑现有行。保存后,我正在尝试将名称的组合框列表保持为最新。
标签: sql-server vb.net winforms visual-studio dataadapter