我在C#中有一个带有列表框的表单,我在其中选择了4个项目。现在我想创建单个存储过程,使用该存储过程,我可以使用单个参数从单个表中查找所有此选定项目的数据。
由于我是SQL Server的初学者,我完全不了解这种类型的过程 谢谢,但这不是我的问题的答案 我想为ListBox中选择的所有项目提供单个存储过程
Create Procedure procedureName
(
@ItemName varchar(50),
)
AS
BEGIN
(
Select * from item_master where item_name = @ItemName
)
END
通过此查询我可以找到一个ItemName的数据,但我想要列表框中的所有选定项目,即使我也不知道C#代码, 所以PLZ帮助我......
答案 0 :(得分:2)
这是一个非常简单的例子,可以满足您的需求。您不希望使用硬编码的连接字符串,特别是在线,并且您需要错误处理,但我希望尽可能清晰。您可能还希望使列长度大于50个字符,但我使其与列定义匹配。
此外,我建议使用通用方法,传递密钥(列名称)和值,以便能够将其用于任何类型的标准,但是您要求我将其保持为您所需要的,所以我把它修剪成必不可少的。
此示例返回所有与传递给存储过程的列表中的FirstName匹配的Employees(作为用户定义的表类型)。
首先,在SQL Server数据库中创建一个用户定义的表类型(以保存要传递给存储过程的值),如下所示:
CREATE TYPE [dbo].[FilterValues] AS TABLE(
[Value] [varchar](50) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Value] ASC
)
)
返回Employees的存储过程如下所示(请注意,它具有用户定义的表类型作为传入的单个参数的类型):
CREATE PROCEDURE [dbo].[GetEmployees] (
@FirstNameFilterValues dbo.FilterValues READONLY
)
AS
BEGIN
SELECT * FROM Employees
INNER JOIN @FirstNameFilterValues fv ON fv.Value = Employees.FirstName;
END
这就是SQL Server方面做的。要从C#调用它,您可以使用与列名匹配的单个列创建DataTable,并使用所需的值填充它。在这个简单的例子中,我用两个名字填充它,但它可以是你想要的多少。
var filterValuesDataTable = new DataTable();
filterValuesDataTable.Columns.Add(new DataColumn("Value", typeof(string)) { AllowDBNull = false });
filterValuesDataTable.Rows.Add("Frodo");
filterValuesDataTable.Rows.Add("Sam");
using (var connection = new SqlConnection("server=.;Initial Catalog=Test;Integrated Security=True;"))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "GetEmployees";
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@FirstNameFilterValues", filterValuesDataTable);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("{0} {1}", reader["FirstName"], reader["LastName"]);
}
reader.Close();
}
}
connection.Close();
}