【发布时间】:2016-08-02 16:35:51
【问题描述】:
我有一个需要在 C# 中运行的 SQL 语句,并且需要从 C# 代码中获取参数。我知道存储过程是避免 SQL 注入的首选,但我只是想在 C# 中执行此操作。
我正在将此 SQL 转换为 C#,但即使查询在 SQL Server Management Studio 中运行,我也遇到了错误。它使用下面的临时存储过程和临时表:
-- 1.) Declare a criteria table which can be any number of rows
BEGIN TRY
DROP TABLE #CriteriaTable
END TRY
BEGIN CATCH
END CATCH
CREATE TABLE #CriteriaTable (ParameterCode VARCHAR(64), Value VARCHAR(64))
-- 2.) Declare a procedure to add criteria table
BEGIN TRY
DROP PROCEDURE #AddCriteriaTable
END TRY
BEGIN CATCH
END CATCH
go
CREATE PROCEDURE #AddCriteriaTable
(@ParameterCode VARCHAR(64), @Value VARCHAR(64))
AS
INSERT #CriteriaTable
VALUES(@ParameterCode, @Value)
GO
-- 3.) Do a computation which accesses the criteria
BEGIN TRY
DROP PROCEDURE #ComputeBasedOnCriteria
END TRY
BEGIN CATCH
END CATCH
go
CREATE PROCEDURE #ComputeBasedOnCriteria
(@product VARCHAR(36) = 'ABC',
@currency VARCHAR(3) = 'USD',
@zScore FLOAT = .845)
AS
-- Code inside this procedure is largely dynamic sql.
-- This is just a quick mock up
SELECT
@Product ProductCode,
@currency Currency,
950 ExpectedRevenue,
*
FROM
#CriteriaTable c
PIVOT
(min (Value) FOR ParameterCode IN
([MyParam1], MyParam2, MyParam3)
) AS pvt
GO
--End of code for Configuration table
-- Samples: Execute this to add criteria to the temporary table that will be used by #ComputeBasedOnCriteria
EXEC #AddCriteriaTable 'MyParam1', 'MyValue1'
EXEC #AddCriteriaTable 'MyParam2', 'MyValue3'
EXEC #AddCriteriaTable 'MyParam3', 'MyValue3'
--Execute the procedure that will return the results for the screen
EXEC #ComputeBasedOnCriteria
现在在 C# 中尝试此操作时,当我尝试运行 #AddCriteriaTable 过程时遇到错误。当我尝试在倒数第二行运行 ExecuteQuery 时,它会抛出:
异常:System.Data.SqlClient.SqlException,关键字“PROC”附近的语法不正确。
为什么它在 SQL Server 中有效,而在 C# 代码中无效?在 C# 中还有另一种方法可以做到这一点吗?让我知道是否有我应该遵循的 c# 指南,因为我仍在学习这个 c# - db 工作。
编辑: 我知道我可以将其作为普通存储过程执行并传入 DataTable,但是我不能说团队问题,它迫使我将 sp 用作文本。
【问题讨论】:
-
我猜它更多的是你如何做 c# 调用这就是问题所在。最后一个 exec #computebasedoncritieria 之前的所有行都是 executenonquery,行,最后一个需要是普通查询才能获取数据 - 你能显示你的 c# 代码吗
-
我粘贴了包含我的 c# 代码的图像。我还没有编写#computebasedoncritieria;执行 #AddCriteriaTable 会引发错误。
-
眯着眼睛看你的代码我不希望像你一样制作这个过程,因为你似乎在制作它时调用它,我希望你用另一个 execnoquery 制作它,然后运行它..在最后一组命令中似乎混合了两者
标签: c# sql-server tsql sqlcommand