c# - 将字符串作为表类型从 c# 代码传递到存储过程
问题描述
我想将表作为字符串作为参数传递到存储过程中,并希望从该特定表中检索数据,例如,我制作了一些按年份计算的表,例如 purchase20162017、transfer20162017。所以问题是这个我创建了一个下拉框,我在其中显示了年份列表,例如 2016-2017,2017-2018,2018-2019 用户从下拉框中选择年份并单击一个名为生成分类帐按钮的按钮。所以我像这样从这个下拉框中取出一个字符串
string str = DropDownList1.SelectedItem.ToString();
str = str.Replace(@"-", "");
string purdtb = "purchase" + str;
现在我在 purdtb 中有确切的表,但它是字符串,我想将此字符串值作为参数传递给存储过程。请告诉我如何执行此操作,以便我可以将此字符串转换为表名。
解决方案
有2种方式。
A) 最好的是:
string connectionString =
ConsoleApplication1.Properties.Settings.Default.ConnectionString;
//
// In a using statement, acquire the SqlConnection as a resource.
//
using (SqlConnection con = new SqlConnection(connectionString))
{
//
// Open the SqlConnection.
//
con.Open();
//
// The following code uses an SqlCommand based on the SqlConnection.
//
using (SqlCommand command = new SqlCommand("SELECT TOP 2 * FROM Dogs1", con))
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("{0} {1} {2}",
reader.GetInt32(0), reader.GetString(1), reader.GetString(2));
}
}
}
在 Dogs1 中放置您的表,使用变量通过代码修改查询。当您可以使用变量管理代码中的所有内容时,为什么要在存储过程中放置非常尴尬的动态表名?
B)第二种方式(不好但有效):
在存储过程sp_executesql中使用,将表名作为参数传递,并在存储过程中构建查询,如文档中所示并捕获结果。
这样,您可以逐个构建查询并将所需的所有内容放入其中(SQL 保留关键字除外,无论如何您都应该小心)。
declare @SqlString nvarchar(2000)
declare @ParamDef nvarchar(2000)
set @SqlString = N'exec proc1 @param1, @param2, @param3'
set @ParamDef = N'@param1 bit, @param2 bit, @param3 bit'
EXECUTE sp_executesql @SqlString ,@ParamDef, @param1 = 0, @param2 = 1, @param3 = 1
解释一下, sp_executesql 的工作原理是这样的
EXECUTE sp_executesql
N'proc1', -- SQL
N'@param1 bit, @param2 bit, @param3 bit', -- DECLARE
@param1 = 0, @param2 = 1, @param3 = 1 -- VALUES
哪个被翻译成
EXECUTE sp_executesql
N'proc1', -- SQL
N'@param1 bit, @param2 bit, @param3 bit', -- DECLARE
@param1 = 0, @param2 = 1, @param3 = 1 -- VALUES
-- DECLARE
declare @param1 bit, @param2 bit, @param3 bit
-- VALUES
select @param1 = 0, @param2 = 1, @param3 = 1
-- SQL
proc1
3)最坏的情况:
通过 Sqlcommand 从 C# 代码调用 sp_executesql
推荐阅读
- nginx - 技术工作中如何显示另一个页面?
- python - 如何在 django 中验证电话号码?
- ccache - ccache - 所有文件都是“无输入文件”
- python - Scrapy 在里面找不到标签
- laravel - Laravel:用一个查询更新行
- postgresql - 如何在 Postgres 中按计算标准快速排序?
- php - 将文本从 json 对象替换为 php
- windows - nginx - 拒绝访问 Windows 上的静态内容
- azure - Palo Alto 背后的私有 DNS 无法解析名称服务器
- r - ggplot2如何将不同的调色板添加到不同的geom_ribbon?